18bf80f4bSopenharmony_ci/*
28bf80f4bSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
38bf80f4bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
48bf80f4bSopenharmony_ci * you may not use this file except in compliance with the License.
58bf80f4bSopenharmony_ci * You may obtain a copy of the License at
68bf80f4bSopenharmony_ci *
78bf80f4bSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
88bf80f4bSopenharmony_ci *
98bf80f4bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
108bf80f4bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
118bf80f4bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
128bf80f4bSopenharmony_ci * See the License for the specific language governing permissions and
138bf80f4bSopenharmony_ci * limitations under the License.
148bf80f4bSopenharmony_ci */
158bf80f4bSopenharmony_ci
168bf80f4bSopenharmony_ci#ifndef API_RENDER_IRENDERER_H
178bf80f4bSopenharmony_ci#define API_RENDER_IRENDERER_H
188bf80f4bSopenharmony_ci
198bf80f4bSopenharmony_ci#include <base/containers/array_view.h>
208bf80f4bSopenharmony_ci#include <render/namespace.h>
218bf80f4bSopenharmony_ci#include <render/resource_handle.h>
228bf80f4bSopenharmony_ci
238bf80f4bSopenharmony_ciRENDER_BEGIN_NAMESPACE()
248bf80f4bSopenharmony_ciclass IRenderDataStoreManager;
258bf80f4bSopenharmony_ci/** \addtogroup group_render_irenderer
268bf80f4bSopenharmony_ci *  @{
278bf80f4bSopenharmony_ci */
288bf80f4bSopenharmony_ci/** Rendering interface.
298bf80f4bSopenharmony_ci *
308bf80f4bSopenharmony_ci * Engine creates a single renderer.
318bf80f4bSopenharmony_ci * 1. RenderFrame() should be called once per frame with a proper render node graphs.
328bf80f4bSopenharmony_ci * or
338bf80f4bSopenharmony_ci * 2 RenderDeferredFrame should be called once per frame.
348bf80f4bSopenharmony_ci *
358bf80f4bSopenharmony_ci * Render Node Graph:
368bf80f4bSopenharmony_ci * Render node graph contains a definition of the rendering pipeline (render nodes that contain render passes).
378bf80f4bSopenharmony_ci * A render node graph needs to be created before rendering can be done.
388bf80f4bSopenharmony_ci * Render node graph can be created (and should be) created with json.
398bf80f4bSopenharmony_ci * Json file is loaded with IRenderNodeGraphLoader and stored to RenderNodeGraphManager.
408bf80f4bSopenharmony_ci * Render Data Store:
418bf80f4bSopenharmony_ci * Render data store contains multiple managers that can store data that is accessable in render nodes.
428bf80f4bSopenharmony_ci *
438bf80f4bSopenharmony_ci * NOTE: render node graphs need to be unique per frame
448bf80f4bSopenharmony_ci * The same render node graph cannot be send to rendering multiple times in a frame
458bf80f4bSopenharmony_ci */
468bf80f4bSopenharmony_ciclass IRenderer {
478bf80f4bSopenharmony_cipublic:
488bf80f4bSopenharmony_ci    IRenderer() = default;
498bf80f4bSopenharmony_ci    virtual ~IRenderer() = default;
508bf80f4bSopenharmony_ci
518bf80f4bSopenharmony_ci    IRenderer(const IRenderer&) = delete;
528bf80f4bSopenharmony_ci    IRenderer& operator=(const IRenderer&) = delete;
538bf80f4bSopenharmony_ci
548bf80f4bSopenharmony_ci    /** Render render node graphs. Should be called once a frame. Preferred method to call RenderFrame.
558bf80f4bSopenharmony_ci     * Render node graphs are run in input order.
568bf80f4bSopenharmony_ci     * @param renderNodeGraphs Multiple render node graph handles.
578bf80f4bSopenharmony_ci     * @return Frame index of the currently rendered frame when the method returns.
588bf80f4bSopenharmony_ci     */
598bf80f4bSopenharmony_ci    virtual uint64_t RenderFrame(const BASE_NS::array_view<const RenderHandleReference> renderNodeGraphs) = 0;
608bf80f4bSopenharmony_ci
618bf80f4bSopenharmony_ci    /** Render deferred can be called multiple times a frame.
628bf80f4bSopenharmony_ci     * Creates a list of deferred render node graphs which will be rendered in order when calling
638bf80f4bSopenharmony_ci     * Can be called from multiple threads.
648bf80f4bSopenharmony_ci     * @param renderNodeGraphs Multiple render node graph handles.
658bf80f4bSopenharmony_ci     * @return Frame index of next frame where these will be processed.
668bf80f4bSopenharmony_ci     */
678bf80f4bSopenharmony_ci    virtual uint64_t RenderDeferred(const BASE_NS::array_view<const RenderHandleReference> renderNodeGraphs) = 0;
688bf80f4bSopenharmony_ci
698bf80f4bSopenharmony_ci    /** Render deferred render node graphs. Should be called once a frame.
708bf80f4bSopenharmony_ci     * Renders deferred render node graphs in input order.
718bf80f4bSopenharmony_ci     * @return Frame index of the currently rendered frame when the method returns.
728bf80f4bSopenharmony_ci     */
738bf80f4bSopenharmony_ci    virtual uint64_t RenderDeferredFrame() = 0;
748bf80f4bSopenharmony_ci
758bf80f4bSopenharmony_ci    /** Render frame backend info.
768bf80f4bSopenharmony_ci     */
778bf80f4bSopenharmony_ci    struct RenderFrameBackendInfo {};
788bf80f4bSopenharmony_ci    /** Execute current frame backend.
798bf80f4bSopenharmony_ci     * Only valid if RenderContext created with SEPARATE_RENDER_FRAME_BACKEND.
808bf80f4bSopenharmony_ci     * Needs to be called after RenderFrame or RenderDeferredFrame.
818bf80f4bSopenharmony_ci     * @return Frame index of the currently rendered backend frame when the method returns.
828bf80f4bSopenharmony_ci     */
838bf80f4bSopenharmony_ci    virtual uint64_t RenderFrameBackend(const RenderFrameBackendInfo& info) = 0;
848bf80f4bSopenharmony_ci
858bf80f4bSopenharmony_ci    /** Render frame presentation info.
868bf80f4bSopenharmony_ci     */
878bf80f4bSopenharmony_ci    struct RenderFramePresentInfo {};
888bf80f4bSopenharmony_ci    /** Execute current frame presentation.
898bf80f4bSopenharmony_ci     * Only valid if RenderContext created with SEPARATE_RENDER_FRAME_PRESENT.
908bf80f4bSopenharmony_ci     * Needs to be called after RenderFrame or RenderDeferredFrame.
918bf80f4bSopenharmony_ci     * Needs to be called after RenderFrameBackend if RenderContext created with SEPARATE_RENDER_FRAME_BACKEND.
928bf80f4bSopenharmony_ci     * @return Frame index of the currently rendered present frame when the method returns.
938bf80f4bSopenharmony_ci     */
948bf80f4bSopenharmony_ci    virtual uint64_t RenderFramePresent(const RenderFramePresentInfo& info) = 0;
958bf80f4bSopenharmony_ci
968bf80f4bSopenharmony_ci    /** Render frame status.
978bf80f4bSopenharmony_ci     * Provides information of frame counts when different parts are processed.
988bf80f4bSopenharmony_ci     * 1. If using: SEPARATE_RENDER_FRAME_PRESENT
998bf80f4bSopenharmony_ci     * -> frontEndIndex and backEndIndex change before RenderFramePresent()
1008bf80f4bSopenharmony_ci     * 2. If using SEPARATE_RENDER_FRAME_BACKEND
1018bf80f4bSopenharmony_ci     * -> frontEndIndex changes before RenderFrameBackend()
1028bf80f4bSopenharmony_ci     * 3. Default
1038bf80f4bSopenharmony_ci     * -> all indices change when RenderFrame() is fully processed
1048bf80f4bSopenharmony_ci     * When the first frame is rendered the index is 1. (i.e. the actual number is count of rendered frames)
1058bf80f4bSopenharmony_ci     * The number starts from zero if no frames are rendered yet.
1068bf80f4bSopenharmony_ci     */
1078bf80f4bSopenharmony_ci    struct RenderStatus {
1088bf80f4bSopenharmony_ci        /** Processed front-end frame index (count of frames) */
1098bf80f4bSopenharmony_ci        uint64_t frontEndIndex { 0ULL };
1108bf80f4bSopenharmony_ci        /** Processed backend-end frame index (count of frames) */
1118bf80f4bSopenharmony_ci        uint64_t backEndIndex { 0ULL };
1128bf80f4bSopenharmony_ci        /** Processed present-end frame index (count of frames) */
1138bf80f4bSopenharmony_ci        uint64_t presentIndex { 0ULL };
1148bf80f4bSopenharmony_ci    };
1158bf80f4bSopenharmony_ci    /** Get status of rendering.
1168bf80f4bSopenharmony_ci     * @return RenderStatus
1178bf80f4bSopenharmony_ci     */
1188bf80f4bSopenharmony_ci    virtual RenderStatus GetFrameStatus() const = 0;
1198bf80f4bSopenharmony_ci};
1208bf80f4bSopenharmony_ci/** @} */
1218bf80f4bSopenharmony_ciRENDER_END_NAMESPACE()
1228bf80f4bSopenharmony_ci
1238bf80f4bSopenharmony_ci#endif // API_RENDER_IRENDERER_H
124