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 API_RENDER_IRENDER_NODE_CONTEXT_MANAGER_H
17 #define API_RENDER_IRENDER_NODE_CONTEXT_MANAGER_H
18 
19 #include <base/util/uid.h>
20 #include <core/json/json.h>
21 #include <core/plugin/intf_interface.h>
22 #include <render/namespace.h>
23 #include <render/render_data_structures.h>
24 
25 RENDER_BEGIN_NAMESPACE()
26 class IRenderContext;
27 class INodeContextDescriptorSetManager;
28 class INodeContextPsoManager;
29 class IRenderNodeRenderDataStoreManager;
30 class IRenderNodeUtil;
31 class IRenderNodeShaderManager;
32 class IRenderNodeGpuResourceManager;
33 class IRenderNodeGraphShareManager;
34 class IRenderNodeParserUtil;
35 
36 /** @ingroup group_render_irendernodecontextmanager */
37 /**
38  * Provides access to render node managers and resources.
39  * In addition provides access to IRenderNodeInterface.
40  */
41 class IRenderNodeContextManager : public CORE_NS::IInterface {
42 public:
43     static constexpr auto UID = BASE_NS::Uid("3079720c-e2bd-45df-959c-6becd637564a");
44 
45     /** Get render data store manager. Global render data store manager for accessing various render data stores.
46      */
47     virtual const IRenderNodeRenderDataStoreManager& GetRenderDataStoreManager() const = 0;
48 
49     /** Get render node specific shader manager interface. Uses global shader manager.
50      */
51     virtual const IRenderNodeShaderManager& GetShaderManager() const = 0;
52 
53     /** Get render node GPU manager. Global resources, automatic destruction for render node created resources.
54      */
55     virtual IRenderNodeGpuResourceManager& GetGpuResourceManager() = 0;
56 
57     /** Get render node context descriptor set manager. Per render node descriptor set manager.
58      */
59     virtual INodeContextDescriptorSetManager& GetDescriptorSetManager() = 0;
60 
61     /** Get render node context pso manager. Per render node PSO cache.
62      */
63     virtual INodeContextPsoManager& GetPsoManager() = 0;
64 
65     /** Get render node graph share manager. Share data within render nodes in render node graph.
66      */
67     virtual IRenderNodeGraphShareManager& GetRenderNodeGraphShareManager() = 0;
68 
69     /** Get render node util helper class.
70      */
71     virtual const IRenderNodeUtil& GetRenderNodeUtil() const = 0;
72 
73     /** Get render node graph data
74      */
75     virtual const RenderNodeGraphData& GetRenderNodeGraphData() const = 0;
76 
77     /** Get render node graph parser
78      */
79     virtual const IRenderNodeParserUtil& GetRenderNodeParserUtil() const = 0;
80 
81     /** Get render node full (context) name.
82      * Combined with render node graph name and should be unique.
83      * (One should add name to render node graph if the same render node graph can be used many times.)
84      */
85     virtual BASE_NS::string_view GetName() const = 0;
86 
87     /** Render node name given in render node graph.
88      * Is unique within the render node graph. (Do not use for naming global resources)
89      */
90     virtual BASE_NS::string_view GetNodeName() const = 0;
91 
92     /** Get render node specific json block.
93      */
94     virtual CORE_NS::json::value GetNodeJson() const = 0;
95 
96     /** Built-in render node graph inputs
97      * @return RenderNodeGraphInputs
98      */
99     virtual const RenderNodeGraphInputs& GetRenderNodeGraphInputs() const = 0;
100 
101     /** Get render context.
102      * @return render context.
103      */
104     virtual IRenderContext& GetRenderContext() const = 0;
105 
106     /** Get render node context specific render node interface by UID.
107      */
108     virtual CORE_NS::IInterface* GetRenderNodeContextInterface(const BASE_NS::Uid& uid) const = 0;
109 
110     /** Get render node context interfaces by UID with interface type cast
111      */
112     template<typename InterfaceType>
GetRenderNodeContextInterface()113     InterfaceType* GetRenderNodeContextInterface()
114     {
115         return static_cast<InterfaceType*>(GetRenderNodeContextInterface(InterfaceType::UID));
116     }
117 
118 protected:
119     IRenderNodeContextManager() = default;
120     virtual ~IRenderNodeContextManager() = default;
121 
122     IRenderNodeContextManager(const IRenderNodeContextManager&) = delete;
123     IRenderNodeContextManager& operator=(const IRenderNodeContextManager&) = delete;
124     IRenderNodeContextManager(IRenderNodeContextManager&&) = delete;
125     IRenderNodeContextManager& operator=(IRenderNodeContextManager&&) = delete;
126 };
127 RENDER_END_NAMESPACE()
128 
129 #endif // API_RENDER_IRENDER_NODE_CONTEXT_MANAGER_H
130