• 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_IRENDER_NODE_GRAPH_MANAGER_H
17 #define API_RENDER_IRENDER_NODE_GRAPH_MANAGER_H
18 
19 #include <base/containers/array_view.h>
20 #include <base/containers/string.h>
21 #include <base/containers/string_view.h>
22 #include <base/containers/unique_ptr.h>
23 #include <base/containers/vector.h>
24 #include <render/namespace.h>
25 #include <render/render_data_structures.h>
26 #include <render/resource_handle.h>
27 
28 RENDER_BEGIN_NAMESPACE()
29 class IRenderNodeGraphLoader;
30 
31 /** \addtogroup group_render_irendernodegraphmanager
32  *  @{
33  */
34 /** Render node desctriptor */
35 struct RenderNodeDesc {
36     /** Type name */
37     RenderDataConstants::RenderDataFixedString typeName;
38     /** Name of render node instance */
39     RenderDataConstants::RenderDataFixedString nodeName;
40     /** Description of setup data */
41     RenderNodeGraphInputs description;
42     /** Render node specific json string */
43     BASE_NS::string nodeJson;
44 };
45 
46 /** Render node graph descriptor */
47 struct RenderNodeGraphDesc {
48     /** Render node graph name */
49     RenderDataConstants::RenderDataFixedString renderNodeGraphName;
50     /** Render node graph (default) data store name (can be used in various for access point) */
51     RenderDataConstants::RenderDataFixedString renderNodeGraphDataStoreName;
52     /** Optional uri, which can be fetched later to get path to the loaded file */
53     RenderDataConstants::RenderDataFixedString renderNodeGraphUri;
54     /** Render nodes */
55     BASE_NS::vector<RenderNodeDesc> nodes;
56 };
57 
58 struct RenderNodeDescInfo {
59     /** Type name */
60     RenderDataConstants::RenderDataFixedString typeName;
61     /** Name of render node instance */
62     RenderDataConstants::RenderDataFixedString nodeName;
63     /** Specific flags for node to change state (e.g. enable / disable) */
64     uint32_t flags { 0u };
65 };
66 
67 /** Render node graph descriptor */
68 struct RenderNodeGraphDescInfo {
69     /** Render node graph name */
70     RenderDataConstants::RenderDataFixedString renderNodeGraphName;
71     /** Render node graph (default) data store name (can be used in various for access point) */
72     RenderDataConstants::RenderDataFixedString renderNodeGraphDataStoreName;
73     /** Render node graph uri (if set) */
74     RenderDataConstants::RenderDataFixedString renderNodeGraphUri;
75     /** Render nodes */
76     BASE_NS::vector<RenderNodeDescInfo> nodes;
77 };
78 
79 /** Render node graph input and output resources. Depending on the rendering state these might not be valid */
80 struct RenderNodeGraphResourceInfo {
81     /** Render node input resources */
82     BASE_NS::vector<RenderHandleReference> inputResources;
83     /** Render node output resources */
84     BASE_NS::vector<RenderHandleReference> outputResources;
85 };
86 
87 /** Interface class to hold all render node graphs and their data.
88  *
89  * Internally synchronized.
90  */
91 class IRenderNodeGraphManager {
92 public:
93     /**
94      * With dynamic render node graphs render nodes can be inserted or erased.
95      */
96     enum class RenderNodeGraphUsageType : uint8_t {
97         RENDER_NODE_GRAPH_STATIC = 0,
98         RENDER_NODE_GRAPH_DYNAMIC = 1,
99     };
100 
101     IRenderNodeGraphManager(const IRenderNodeGraphManager&) = delete;
102     IRenderNodeGraphManager& operator=(const IRenderNodeGraphManager&) = delete;
103 
104     /** Get render handle reference for raw handle.
105      *  @param handle Raw render handle
106      *  @return Returns A render handle reference for the handle.
107      */
108     virtual RenderHandleReference Get(const RenderHandle& handle) const = 0;
109 
110     /** Create render node graph.
111      * @param usage Usage style of graphs. (Static, Dynamic)
112      * @param desc Render node graph description.
113      * @param renderNodeGraphName Override render node graph name.
114      * @param renderNodeGraphName Override render node graph data store name (default access point data store).
115      * @return Render data handle resource.
116      */
117     virtual RenderHandleReference Create(const RenderNodeGraphUsageType usage, const RenderNodeGraphDesc& desc,
118         const BASE_NS::string_view renderNodeGraphName, const BASE_NS::string_view renderNodeGraphDataStoreName) = 0;
119 
120     /** Create render node graph.
121      * @param usage Usage style of graphs. (Static, Dynamic)
122      * @param desc Render node graph description.
123      * @param renderNodeGraphName Override render node graph name.
124      * @return Render data handle resource.
125      */
126     virtual RenderHandleReference Create(const RenderNodeGraphUsageType usage, const RenderNodeGraphDesc& desc,
127         const BASE_NS::string_view renderNodeGraphName) = 0;
128 
129     /** Create render node graph.
130      * @param usage Usage style of graphs. (Static, Dynamic)
131      * @param desc Render node graph description.
132      * @return Render data handle.
133      */
134     virtual RenderHandleReference Create(const RenderNodeGraphUsageType usage, const RenderNodeGraphDesc& desc) = 0;
135 
136     /** Insert new render node to dynamic render node graph to the last render node in graph.
137      * @param handle Handle of a render node graph.
138      * @param renderNodeDesc Description of render node.
139      */
140     virtual void PushBackRenderNode(const RenderHandleReference& handle, const RenderNodeDesc& renderNodeDesc) = 0;
141 
142     /** Remove render node from dynamic render node graph.
143      * Erase does not destroy GPU resource that have been created in the erased render node.
144      * The resources are destroyed when the render node graph is destroyed.
145      * @param handle Handle of a render node graph.
146      * @param renderNodeName A valid render node name in this particular render node graph.
147      */
148     virtual void EraseRenderNode(const RenderHandleReference& handle, const BASE_NS::string_view renderNodeName) = 0;
149 
150     /** Insert new render node to dynamic render node graph to a position.
151      * @param handle Handle of a render node graph.
152      * @param renderNodeDesc Description of render node.
153      * @pos renderNodeName Instance name of render node to insert before.
154      */
155     virtual void InsertBeforeRenderNode(const RenderHandleReference& handle, const RenderNodeDesc& renderNodeDesc,
156         const BASE_NS::string_view renderNodeName) = 0;
157 
158     /** Insert new render node to dynamic render node graph to a position.
159      * @param handle Handle of a render node graph.
160      * @param renderNodeDesc Description of render node.
161      * @pos renderNodeName Instance name of render node to insert after.
162      */
163     virtual void InsertAfterRenderNode(const RenderHandleReference& handle, const RenderNodeDesc& renderNodeDesc,
164         const BASE_NS::string_view renderNodeName) = 0;
165 
166     /** Update status etc. with flags.
167      * @param handle Handle of a render node graph.
168      * @param graphDescInfo Render node graph description info with updatable flags.
169      */
170     virtual void UpdateRenderNodeGraph(
171         const RenderHandleReference& handle, const RenderNodeGraphDescInfo& graphDescInfo) = 0;
172 
173     /** Get render node graph description info with render node types, names, and current flags
174      * @param handle Handle of a render node graph.
175      * @return RenderNodeGraphDescInfo New render node graph description info struct.
176      */
177     virtual RenderNodeGraphDescInfo GetInfo(const RenderHandleReference& handle) const = 0;
178 
179     /** Set render node graph inputs and outputs.
180      * This needs to be called before RenderFrame in the frame where these are supposed to be used.
181      * Overrides everything -> Need to re-set existing if called.
182      * One can reset handle references by calling this with empty inputs and outputs.
183      * @param handle Handle of a render node graph.
184      * @param inputs Render node graph input handles.
185      * @param outputs Render node graph output handles.
186      */
187     virtual void SetRenderNodeGraphResources(const RenderHandleReference& handle,
188         const BASE_NS::array_view<const RenderHandleReference> inputs,
189         const BASE_NS::array_view<const RenderHandleReference> outputs) = 0;
190 
191     /** Get render node graph resource info. Returns the handles set through SetRnederNodeGraphResources.
192      * @param handle Handle of a render node graph.
193      * @return RenderNodeGraphResourceInfo Render node graph resources.
194      */
195     virtual RenderNodeGraphResourceInfo GetRenderNodeGraphResources(
196         const RenderHandleReference& handleResource) const = 0;
197 
198     /** Create render node graph directly from uri. Stores the uri for later info.
199      * @param usage Usage style of graphs. (Static, Dynamic)
200      * @param uri Path to render node graph json file.
201      * @return Render data handle resource.
202      */
203     virtual RenderHandleReference LoadAndCreate(
204         const RenderNodeGraphUsageType usage, const BASE_NS::string_view uri) = 0;
205 
206     /** Access to render node graph loader.
207      */
208     virtual IRenderNodeGraphLoader& GetRenderNodeGraphLoader() = 0;
209 
210 protected:
211     IRenderNodeGraphManager() = default;
212     virtual ~IRenderNodeGraphManager() = default;
213 };
214 
215 /** Interface class for creating a RenderNodeGraphDesc from a JSON file.
216  */
217 class IRenderNodeGraphLoader {
218 public:
219     /** Describes result of the loading operation. */
220     struct LoadResult {
221         LoadResult() = default;
LoadResultLoadResult222         explicit LoadResult(const BASE_NS::string& error) : success(false), error(error) {}
223 
224         /** Indicates, whether the parsing operation is successful. */
225         bool success { true };
226 
227         /** In case of parsing error, contains the description of the error. */
228         BASE_NS::string error;
229 
230         /** A valid render node graph descriptor, when success is true. */
231         RenderNodeGraphDesc desc;
232     };
233 
234     /** Load a render node graph description from a file.
235      * @param fileManager File manager to be used for file access
236      * @param uri URI to a file containing the render node graph description in JSON format.
237      * @return If loading fails LoadResult::success is false and LoadResult::error contains an error message.
238      */
239     virtual LoadResult Load(const BASE_NS::string_view uri) = 0;
240 
241     /** Load a render node graph description from a JSON string.
242      * @param json String containing the render node graph description in JSON format.
243      * @return If loading fails LoadResult::success is false and LoadResult::error contains an error message.
244      */
245     virtual LoadResult LoadString(const BASE_NS::string_view json) = 0;
246 
247 protected:
248     IRenderNodeGraphLoader() = default;
249     virtual ~IRenderNodeGraphLoader() = default;
250 };
251 /** @} */
252 RENDER_END_NAMESPACE()
253 
254 #endif // API_RENDER_IRENDER_NODE_GRAPH_MANAGER_H
255