1 /* 2 * Copyright (c) 2024 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 RENDER_RENDER__RENDER_NODE_GRAPH_SHARE_MANAGER_H 17 #define RENDER_RENDER__RENDER_NODE_GRAPH_SHARE_MANAGER_H 18 19 #include <cstdint> 20 21 #include <base/containers/array_view.h> 22 #include <base/containers/string.h> 23 #include <base/containers/string_view.h> 24 #include <base/containers/unordered_map.h> 25 #include <render/namespace.h> 26 #include <render/nodecontext/intf_render_node_graph_share_manager.h> 27 28 #include "util/log.h" 29 30 RENDER_BEGIN_NAMESPACE() 31 struct RenderNodeGraphOutputResource; 32 33 /** 34 * Global storage for specific one frame GPU resources. 35 */ 36 class RenderNodeGraphGlobalShareDataManager { 37 public: 38 RenderNodeGraphGlobalShareDataManager() = default; 39 ~RenderNodeGraphGlobalShareDataManager() = default; 40 41 void BeginFrame(); 42 43 void SetGlobalRenderNodeResources(const BASE_NS::string_view nodeName, 44 const BASE_NS::array_view<const IRenderNodeGraphShareManager::NamedResource> resources); 45 BASE_NS::array_view<const IRenderNodeGraphShareManager::NamedResource> GetGlobalRenderNodeResources( 46 const BASE_NS::string_view nodeName) const; 47 48 private: 49 // data is only written in synchronous path in render node Init() PreExecuteFrame() 50 // read is parallel 51 struct RenderNodeDataSet { 52 BASE_NS::vector<IRenderNodeGraphShareManager::NamedResource> resources; 53 }; 54 BASE_NS::unordered_map<BASE_NS::string, RenderNodeDataSet> renderNodes_; 55 }; 56 57 /** 58 * Data container. 59 */ 60 class RenderNodeGraphShareDataManager { 61 public: 62 RenderNodeGraphShareDataManager(const BASE_NS::array_view<const RenderNodeGraphOutputResource> rngOutputResources); 63 ~RenderNodeGraphShareDataManager() = default; 64 65 // prevRngShareDataMgr to access previous render node graph share manager 66 // NOTE: a list of all RNG share data managers should be added, for named fetch of resources 67 void BeginFrame(RenderNodeGraphGlobalShareDataManager* rngGlobalShareDataMgr, 68 const RenderNodeGraphShareDataManager* prevRngShareDataMgr, const uint32_t renderNodeCount, 69 const BASE_NS::array_view<const IRenderNodeGraphShareManager::NamedResource> inputs, 70 const BASE_NS::array_view<const IRenderNodeGraphShareManager::NamedResource> outputs); 71 // prevents certain method data access and bakes shared data 72 void PrepareExecuteFrame(); 73 74 void RegisterRenderNodeOutput( 75 const uint32_t renderNodeIdx, const BASE_NS::string_view name, const RenderHandle& handle); 76 void RegisterRenderNodeName( 77 const uint32_t renderNodeIdx, const BASE_NS::string_view name, const BASE_NS::string_view globalUniqueName); 78 79 BASE_NS::array_view<const RenderHandle> GetRenderNodeGraphInputs() const; 80 BASE_NS::array_view<const IRenderNodeGraphShareManager::NamedResource> GetNamedRenderNodeGraphInputs() const; 81 BASE_NS::array_view<const RenderHandle> GetRenderNodeGraphOutputs() const; 82 BASE_NS::array_view<const IRenderNodeGraphShareManager::NamedResource> GetNamedRenderNodeGraphOutputs() const; 83 BASE_NS::array_view<const IRenderNodeGraphShareManager::NamedResource> GetRenderNodeOutputs( 84 const uint32_t renderNodeIdx) const; 85 86 uint32_t GetRenderNodeIndex(const BASE_NS::string_view renderNodeName) const; 87 88 BASE_NS::array_view<const RenderHandle> GetPrevRenderNodeGraphOutputs() const; 89 BASE_NS::array_view<const IRenderNodeGraphShareManager::NamedResource> GetNamedPrevRenderNodeGraphOutputs() const; 90 91 void RegisterGlobalRenderNodeOutput( 92 const uint32_t renderNodeIdx, const BASE_NS::string_view name, const RenderHandle& handle); 93 BASE_NS::array_view<const IRenderNodeGraphShareManager::NamedResource> GetGlobalRenderNodeResources( 94 const BASE_NS::string_view nodeName) const; 95 96 static constexpr uint32_t MAX_RENDER_NODE_GRAPH_RES_COUNT { 8u }; 97 98 private: 99 // render node graph specified outputs 100 const BASE_NS::vector<RenderNodeGraphOutputResource> rngOutputResources_; 101 // indices to render nodes 102 uint32_t outputMap_[MAX_RENDER_NODE_GRAPH_RES_COUNT] { ~0u, ~0u, ~0u, ~0u, ~0u, ~0u, ~0u, ~0u }; 103 104 RenderNodeGraphGlobalShareDataManager* rngGlobalShareDataMgr_ { nullptr }; 105 const RenderNodeGraphShareDataManager* prevRngShareDataMgr_ { nullptr }; 106 107 // checks if should be registered as render node output 108 void RegisterAsRenderNodeGraphOutput( 109 const uint32_t renderNodeIdx, const BASE_NS::string_view name, const RenderHandle& handle); 110 111 struct GraphInputOutput { 112 PLUGIN_STATIC_ASSERT(MAX_RENDER_NODE_GRAPH_RES_COUNT == 8u); 113 RenderHandle inputs[MAX_RENDER_NODE_GRAPH_RES_COUNT] { {}, {}, {}, {}, {}, {}, {}, {} }; 114 IRenderNodeGraphShareManager::NamedResource namedInputs[MAX_RENDER_NODE_GRAPH_RES_COUNT] {}; 115 RenderHandle outputs[MAX_RENDER_NODE_GRAPH_RES_COUNT] { {}, {}, {}, {}, {}, {}, {}, {} }; 116 IRenderNodeGraphShareManager::NamedResource namedOutputs[MAX_RENDER_NODE_GRAPH_RES_COUNT] {}; 117 BASE_NS::array_view<RenderHandle> inputView; 118 BASE_NS::array_view<IRenderNodeGraphShareManager::NamedResource> namedInputView; 119 BASE_NS::array_view<RenderHandle> outputView; 120 BASE_NS::array_view<IRenderNodeGraphShareManager::NamedResource> namedOutputView; 121 }; 122 // render node graph inputs/outputs which can be set from the render node graph or render node graph manager 123 GraphInputOutput inOut_; 124 125 struct RenderNodeResources { 126 BASE_NS::vector<IRenderNodeGraphShareManager::NamedResource> outputs; 127 RenderDataConstants::RenderDataFixedString name; 128 RenderDataConstants::RenderDataFixedString globalUniqueName; 129 }; 130 131 // per render node registered inputs/outputs 132 BASE_NS::vector<RenderNodeResources> renderNodeResources_; 133 134 bool lockedAccess_ { false }; 135 }; 136 137 /** 138 * Acts as a render node specific interface to data. 139 */ 140 class RenderNodeGraphShareManager final : public IRenderNodeGraphShareManager { 141 public: 142 explicit RenderNodeGraphShareManager(RenderNodeGraphShareDataManager&); 143 ~RenderNodeGraphShareManager() override; 144 145 void Init( 146 const uint32_t renderNodeIdx, const BASE_NS::string_view name, const BASE_NS::string_view globalUniqueName); 147 void BeginFrame(const uint32_t renderNodeIdx); 148 149 BASE_NS::array_view<const RenderHandle> GetRenderNodeGraphInputs() const override; 150 BASE_NS::array_view<const NamedResource> GetNamedRenderNodeGraphInputs() const override; 151 BASE_NS::array_view<const RenderHandle> GetRenderNodeGraphOutputs() const override; 152 BASE_NS::array_view<const NamedResource> GetNamedRenderNodeGraphOutputs() const override; 153 RenderHandle GetRenderNodeGraphInput(const uint32_t index) const override; 154 RenderHandle GetRenderNodeGraphOutput(const uint32_t index) const override; 155 BASE_NS::array_view<const RenderHandle> GetPrevRenderNodeGraphOutputs() const override; 156 BASE_NS::array_view<const NamedResource> GetNamedPrevRenderNodeGraphOutputs() const override; 157 RenderHandle GetPrevRenderNodeGraphOutput(const uint32_t index) const override; 158 RenderHandle GetNamedPrevRenderNodeGraphOutput(const BASE_NS::string_view resourceName) const override; 159 160 void RegisterRenderNodeOutputs(const BASE_NS::array_view<const RenderHandle> outputs) override; 161 void RegisterRenderNodeOutput(const BASE_NS::string_view name, const RenderHandle& handle) override; 162 163 RenderHandle GetRegisteredRenderNodeOutput( 164 const BASE_NS::string_view renderNodeName, const uint32_t index) const override; 165 RenderHandle GetRegisteredRenderNodeOutput( 166 const BASE_NS::string_view renderNodeName, const BASE_NS::string_view resourceName) const override; 167 RenderHandle GetRegisteredPrevRenderNodeOutput(const uint32_t index) const override; 168 169 void RegisterGlobalRenderNodeOutput(const BASE_NS::string_view name, const RenderHandle& handle) override; 170 BASE_NS::array_view<const NamedResource> GetRegisteredGlobalRenderNodeOutputs( 171 const BASE_NS::string_view nodeName) const override; 172 173 // IInterface 174 const CORE_NS::IInterface* GetInterface(const BASE_NS::Uid& uid) const override; 175 CORE_NS::IInterface* GetInterface(const BASE_NS::Uid& uid) override; 176 void Ref() override; 177 void Unref() override; 178 179 private: 180 RenderNodeGraphShareDataManager& renderNodeGraphShareDataMgr_; 181 182 // render node index within a render node graph 183 uint32_t renderNodeIdx_ { 0u }; 184 }; 185 RENDER_END_NAMESPACE() 186 187 #endif // CORE__RENDER__RENDER_NODE_GRAPH_SHARE_MANAGER_H 188