/* * Copyright (c) 2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef API_RENDER_IRENDERER_H #define API_RENDER_IRENDERER_H #include #include #include RENDER_BEGIN_NAMESPACE() class IRenderDataStoreManager; /** \addtogroup group_render_irenderer * @{ */ /** Rendering interface. * * Engine creates a single renderer. * 1. RenderFrame() should be called once per frame with a proper render node graphs. * or * 2 RenderDeferredFrame should be called once per frame. * * Render Node Graph: * Render node graph contains a definition of the rendering pipeline (render nodes that contain render passes). * A render node graph needs to be created before rendering can be done. * Render node graph can be created (and should be) created with json. * Json file is loaded with IRenderNodeGraphLoader and stored to RenderNodeGraphManager. * Render Data Store: * Render data store contains multiple managers that can store data that is accessable in render nodes. * * NOTE: render node graphs need to be unique per frame * The same render node graph cannot be send to rendering multiple times in a frame */ class IRenderer { public: IRenderer() = default; virtual ~IRenderer() = default; IRenderer(const IRenderer&) = delete; IRenderer& operator=(const IRenderer&) = delete; /** Render render node graphs. Should be called once a frame. Preferred method to call RenderFrame. * Render node graphs are run in input order. * @param renderNodeGraphs Multiple render node graph handles. * @return Frame index of the currently rendered frame when the method returns. */ virtual uint64_t RenderFrame(const BASE_NS::array_view renderNodeGraphs) = 0; /** Render deferred can be called multiple times a frame. * Creates a list of deferred render node graphs which will be rendered in order when calling * Can be called from multiple threads. * @param renderNodeGraphs Multiple render node graph handles. * @return Frame index of next frame where these will be processed. */ virtual uint64_t RenderDeferred(const BASE_NS::array_view renderNodeGraphs) = 0; /** Render deferred render node graphs. Should be called once a frame. * Renders deferred render node graphs in input order. * @return Frame index of the currently rendered frame when the method returns. */ virtual uint64_t RenderDeferredFrame() = 0; /** Render frame backend info. */ struct RenderFrameBackendInfo {}; /** Execute current frame backend. * Only valid if RenderContext created with SEPARATE_RENDER_FRAME_BACKEND. * Needs to be called after RenderFrame or RenderDeferredFrame. * @return Frame index of the currently rendered backend frame when the method returns. */ virtual uint64_t RenderFrameBackend(const RenderFrameBackendInfo& info) = 0; /** Render frame presentation info. */ struct RenderFramePresentInfo {}; /** Execute current frame presentation. * Only valid if RenderContext created with SEPARATE_RENDER_FRAME_PRESENT. * Needs to be called after RenderFrame or RenderDeferredFrame. * Needs to be called after RenderFrameBackend if RenderContext created with SEPARATE_RENDER_FRAME_BACKEND. * @return Frame index of the currently rendered present frame when the method returns. */ virtual uint64_t RenderFramePresent(const RenderFramePresentInfo& info) = 0; /** Render frame status. * Provides information of frame counts when different parts are processed. * 1. If using: SEPARATE_RENDER_FRAME_PRESENT * -> frontEndIndex and backEndIndex change before RenderFramePresent() * 2. If using SEPARATE_RENDER_FRAME_BACKEND * -> frontEndIndex changes before RenderFrameBackend() * 3. Default * -> all indices change when RenderFrame() is fully processed * When the first frame is rendered the index is 1. (i.e. the actual number is count of rendered frames) * The number starts from zero if no frames are rendered yet. */ struct RenderStatus { /** Processed front-end frame index (count of frames) */ uint64_t frontEndIndex { 0ULL }; /** Processed backend-end frame index (count of frames) */ uint64_t backEndIndex { 0ULL }; /** Processed present-end frame index (count of frames) */ uint64_t presentIndex { 0ULL }; }; /** Get status of rendering. * @return RenderStatus */ virtual RenderStatus GetFrameStatus() const = 0; }; /** @} */ RENDER_END_NAMESPACE() #endif // API_RENDER_IRENDERER_H