• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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