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_CONTEXT_MANAGER_H
17 #define RENDER_RENDER__RENDER_NODE_CONTEXT_MANAGER_H
18 
19 #include <cstdint>
20 
21 #include <base/containers/unique_ptr.h>
22 #include <base/containers/vector.h>
23 #include <render/namespace.h>
24 #include <render/nodecontext/intf_render_node_context_manager.h>
25 
26 #include "datastore/render_data_store_manager.h"
27 #include "nodecontext/render_node_util.h"
28 
29 RENDER_BEGIN_NAMESPACE()
30 class Device;
31 class INodeContextDescriptorSetManager;
32 class INodeContextPsoManager;
33 class IRenderNodeGraphShareManager;
34 class IRenderNodeUtil;
35 class NodeContextDescriptorSetManager;
36 class NodeContextPsoManager;
37 class RenderDataStoreManager;
38 class RenderNodeGraphShareManager;
39 class RenderNodeGraphShareDataManager;
40 class RenderNodeParserUtil;
41 
42 class ShaderManager;
43 class IRenderNodeGpuResourceManager;
44 class RenderNodeShaderManager;
45 class RenderNodeGpuResourceManager;
46 class RenderCommandList;
47 
48 /**
49 class RenderNodeContextManager.
50 */
51 class RenderNodeContextManager final : public IRenderNodeContextManager {
52 public:
53     struct CreateInfo {
54         IRenderContext& renderContext;
55         const RenderNodeGraphData& renderNodeGraphData;
56         const RenderNodeGraphInputs& renderNodeGraphInputs;
57         const BASE_NS::string_view& name;
58         const BASE_NS::string_view& nodeJson;
59         NodeContextDescriptorSetManager& descriptorSetMgr;
60         NodeContextPsoManager& psoMgr;
61         RenderCommandList& cmdList;
62         RenderNodeGraphShareDataManager& renderNodeGraphShareDataMgr;
63     };
64     struct PerFrameTimings {
65         uint64_t totalTimeUs { 0 };
66         uint64_t deltaTimeUs { 0 };
67         uint64_t frameIndex { 0 };
68     };
69 
70     explicit RenderNodeContextManager(const CreateInfo& createInfo);
71     ~RenderNodeContextManager() override;
72 
73     void BeginFrame(const uint32_t renderNodeIdx, const PerFrameTimings& frameTimings);
74 
75     const IRenderNodeRenderDataStoreManager& GetRenderDataStoreManager() const override;
76     const IRenderNodeShaderManager& GetShaderManager() const override;
77     IRenderNodeGpuResourceManager& GetGpuResourceManager() override;
78 
79     INodeContextDescriptorSetManager& GetDescriptorSetManager() override;
80     INodeContextPsoManager& GetPsoManager() override;
81     IRenderNodeGraphShareManager& GetRenderNodeGraphShareManager() override;
82 
83     const IRenderNodeUtil& GetRenderNodeUtil() const override;
84     const IRenderNodeParserUtil& GetRenderNodeParserUtil() const override;
85     const RenderNodeGraphData& GetRenderNodeGraphData() const override;
86     BASE_NS::string_view GetName() const override;
87     BASE_NS::string_view GetNodeName() const override;
88     CORE_NS::json::value GetNodeJson() const override;
89     const RenderNodeGraphInputs& GetRenderNodeGraphInputs() const override;
90 
91     IRenderContext& GetRenderContext() const override;
92 
93     CORE_NS::IInterface* GetRenderNodeContextInterface(const BASE_NS::Uid& uid) const override;
94 
95     const CORE_NS::IInterface* GetInterface(const BASE_NS::Uid& uid) const override;
96     CORE_NS::IInterface* GetInterface(const BASE_NS::Uid& uid) override;
97     void Ref() override;
98     void Unref() override;
99 
100 private:
101     IRenderContext& renderContext_;
102     RenderNodeGraphData renderNodeGraphData_;
103     const RenderNodeGraphInputs renderNodeGraphInputs_;
104     const BASE_NS::string fullName_;
105     const BASE_NS::string nodeName_;
106     const BASE_NS::string nodeJson_;
107 
108     RenderNodeGraphShareDataManager& renderNodeGraphShareDataMgr_;
109     NodeContextDescriptorSetManager& descriptorSetMgr_;
110     NodeContextPsoManager& psoMgr_;
111     RenderCommandList& renderCommandList_;
112 
113     struct ContextInterface {
114         BASE_NS::Uid uid {};
115         CORE_NS::IInterface* contextInterface { nullptr };
116     };
117     BASE_NS::vector<ContextInterface> contextInterfaces_;
118 
119     BASE_NS::unique_ptr<RenderNodeGpuResourceManager> renderNodeGpuResourceMgr_;
120     BASE_NS::unique_ptr<RenderNodeShaderManager> renderNodeShaderMgr_;
121     BASE_NS::unique_ptr<RenderNodeRenderDataStoreManager> renderNodeRenderDataStoreMgr_;
122     BASE_NS::unique_ptr<RenderNodeUtil> renderNodeUtil_;
123     BASE_NS::unique_ptr<RenderNodeGraphShareManager> renderNodeGraphShareMgr_;
124     BASE_NS::unique_ptr<RenderNodeParserUtil> renderNodeParserUtil_;
125 
126     // index in render node graph
127     uint32_t renderNodeIdx_ { ~0u };
128 };
129 RENDER_END_NAMESPACE()
130 
131 #endif // CORE__RENDER__RENDER_NODE_CONTEXT_MANAGER_H
132