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