• 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 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