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