1 /* 2 * Copyright (C) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef API_RENDER_IRENDERER_H 17 #define API_RENDER_IRENDERER_H 18 19 #include <base/containers/array_view.h> 20 #include <render/namespace.h> 21 #include <render/resource_handle.h> 22 23 RENDER_BEGIN_NAMESPACE() 24 class IRenderDataStoreManager; 25 /** \addtogroup group_render_irenderer 26 * @{ 27 */ 28 /** Rendering interface. 29 * 30 * Engine creates a single renderer. 31 * 1. RenderFrame() should be called once per frame with a proper render node graphs. 32 * or 33 * 2 RenderDeferredFrame should be called once per frame. 34 * 35 * Render Node Graph: 36 * Render node graph contains a definition of the rendering pipeline (render nodes that contain render passes). 37 * A render node graph needs to be created before rendering can be done. 38 * Render node graph can be created (and should be) created with json. 39 * Json file is loaded with IRenderNodeGraphLoader and stored to RenderNodeGraphManager. 40 * Render Data Store: 41 * Render data store contains multiple managers that can store data that is accessable in render nodes. 42 * 43 * NOTE: render node graphs need to be unique per frame 44 * The same render node graph cannot be send to rendering multiple times in a frame 45 */ 46 class IRenderer { 47 public: 48 IRenderer() = default; 49 virtual ~IRenderer() = default; 50 51 IRenderer(const IRenderer&) = delete; 52 IRenderer& operator=(const IRenderer&) = delete; 53 54 /** Render render node graphs. Should be called once a frame. Preferred method to call RenderFrame. 55 * Render node graphs are run in input order. 56 * @param renderNodeGraphs Multiple render node graph handles. 57 */ 58 virtual void RenderFrame(const BASE_NS::array_view<const RenderHandleReference> renderNodeGraphs) = 0; 59 60 /** Render deferred can be called multiple times a frame. 61 * Creates a list of deferred render node graphs which will be rendered in order when calling 62 * Can be called from multiple threads. 63 * @param renderNodeGraphs Multiple render node graph handles. 64 */ 65 virtual void RenderDeferred(const BASE_NS::array_view<const RenderHandleReference> renderNodeGraphs) = 0; 66 67 /** Render deferred render node graphs. Should be called once a frame. 68 * Renders deferred render node graphs in input order. 69 */ 70 virtual void RenderDeferredFrame() = 0; 71 }; 72 /** @} */ 73 RENDER_END_NAMESPACE() 74 75 #endif // API_RENDER_IRENDERER_H 76