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