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 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 <render/namespace.h>
25 #include <render/nodecontext/intf_render_node_graph_share_manager.h>
26
27 #include "util/log.h"
28
RENDER_BEGIN_NAMESPACE()29 RENDER_BEGIN_NAMESPACE()
30 class RenderNodeGraphShareDataManager {
31 public:
32 RenderNodeGraphShareDataManager();
33 ~RenderNodeGraphShareDataManager() = default;
34
35 struct Resource {
36 BASE_NS::string name;
37 RenderHandle handle;
38 };
39
40 void BeginFrame(const uint32_t renderNodeCount, const BASE_NS::array_view<const RenderHandle> inputs,
41 const BASE_NS::array_view<const RenderHandle> outputs);
42 // prevents certain method data access and bakes shared data
43 void PrepareExecuteFrame();
44
45 void RegisterRenderNodeGraphOutputs(const BASE_NS::array_view<const RenderHandle> outputs);
46 void RegisterRenderNodeOutput(
47 const uint32_t renderNodeIdx, const BASE_NS::string_view name, const RenderHandle& handle);
48 void RegisterRenderNodeName(const uint32_t renderNodeIdx, const BASE_NS::string_view name);
49
50 BASE_NS::array_view<const RenderHandle> GetRenderNodeGraphInputs() const;
51 BASE_NS::array_view<const RenderHandle> GetRenderNodeGraphOutputs() const;
52 BASE_NS::array_view<const Resource> GetRenderNodeOutputs(const uint32_t renderNodeIdx) const;
53
54 uint32_t GetRenderNodeIndex(const BASE_NS::string_view renderNodeName) const;
55
56 static constexpr uint32_t MAX_RENDER_NODE_GRAPH_RES_COUNT { 8u };
57
58 private:
59 struct InputOutput {
60 PLUGIN_STATIC_ASSERT(MAX_RENDER_NODE_GRAPH_RES_COUNT == 8u);
61 RenderHandle inputs[MAX_RENDER_NODE_GRAPH_RES_COUNT] { {}, {}, {}, {}, {}, {}, {}, {} };
62 RenderHandle outputs[MAX_RENDER_NODE_GRAPH_RES_COUNT] { {}, {}, {}, {}, {}, {}, {}, {} };
63 BASE_NS::array_view<RenderHandle> inputView;
64 BASE_NS::array_view<RenderHandle> outputView;
65 };
66 // render node graph inputs/outputs which can be set through render node graph manager
67 InputOutput inOut_;
68
69 struct RenderNodeResources {
70 BASE_NS::vector<Resource> outputs;
71 RenderDataConstants::RenderDataFixedString name;
72 };
73
74 // per render node registered inputs/outputs
75 BASE_NS::vector<RenderNodeResources> renderNodeResources_;
76
77 bool lockedAccess_ { false };
78 };
79
80 /**
81 * Acts as a render node specific interface to data.
82 */
83 class RenderNodeGraphShareManager final : public IRenderNodeGraphShareManager {
84 public:
85 explicit RenderNodeGraphShareManager(RenderNodeGraphShareDataManager&);
86 ~RenderNodeGraphShareManager() override;
87
88 void Init(const uint32_t renderNodeIdx, const BASE_NS::string_view name);
89 void BeginFrame(const uint32_t renderNodeIdx);
90
91 BASE_NS::array_view<const RenderHandle> GetRenderNodeGraphInputs() const override;
92 BASE_NS::array_view<const RenderHandle> GetRenderNodeGraphOutputs() const override;
93 RenderHandle GetRenderNodeGraphInput(const uint32_t index) const override;
94 RenderHandle GetRenderNodeGraphOutput(const uint32_t index) const override;
95
96 void RegisterRenderNodeGraphOutputs(const BASE_NS::array_view<const RenderHandle> outputs) override;
97 void RegisterRenderNodeOutputs(const BASE_NS::array_view<const RenderHandle> outputs) override;
98 void RegisterRenderNodeOutput(const BASE_NS::string_view name, const RenderHandle& handle) override;
99
100 // NOTE: add method to register IRenderNodeInterface classes for frame
101 // e.g. one could share additional data like viewports etc.
102
103 RenderHandle GetRegisteredRenderNodeOutput(
104 const BASE_NS::string_view renderNodeName, const uint32_t index) const override;
105 RenderHandle GetRegisteredRenderNodeOutput(
106 const BASE_NS::string_view renderNodeName, const BASE_NS::string_view resourceName) const override;
107 RenderHandle GetRegisteredPrevRenderNodeOutput(const uint32_t index) const override;
108
109 // for IRenderNodeContextInterface
GetTypeName()110 BASE_NS::string_view GetTypeName() const override
111 {
112 return "IRenderNodeGraphShareManager";
113 }
GetUid()114 BASE_NS::Uid GetUid() const override
115 {
116 return IRenderNodeGraphShareManager::UID;
117 }
118
119 private:
120 RenderNodeGraphShareDataManager& renderNodeGraphShareDataMgr_;
121
122 // render node index within a render node graph
123 uint32_t renderNodeIdx_ { 0u };
124 };
125 RENDER_END_NAMESPACE()
126
127 #endif // CORE__RENDER__RENDER_NODE_GRAPH_SHARE_MANAGER_H
128