• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 CORE__RENDER__NODE__RENDER_NODE_DEFAULT_CAMERA_CONTROLLER_H
17 #define CORE__RENDER__NODE__RENDER_NODE_DEFAULT_CAMERA_CONTROLLER_H
18 
19 #include <base/containers/string.h>
20 #include <base/containers/unordered_map.h>
21 #include <base/util/uid.h>
22 #include <core/namespace.h>
23 #include <render/datastore/render_data_store_render_pods.h>
24 #include <render/nodecontext/intf_pipeline_descriptor_set_binder.h>
25 #include <render/nodecontext/intf_render_node.h>
26 #include <render/resource_handle.h>
27 
28 #include "render/render_node_scene_util.h"
29 
30 CORE3D_BEGIN_NAMESPACE()
31 class IRenderDataStoreDefaultMaterial;
32 class IRenderDataStoreDefaultLight;
33 class IRenderDataStoreDefaultScene;
34 
35 class RenderNodeDefaultCameraController final : public RENDER_NS::IRenderNode {
36 public:
37     RenderNodeDefaultCameraController() = default;
38     ~RenderNodeDefaultCameraController() override = default;
39 
40     void InitNode(RENDER_NS::IRenderNodeContextManager& renderNodeContextMgr) override;
41     void PreExecuteFrame() override;
42     void ExecuteFrame(RENDER_NS::IRenderCommandList& cmdList) override;
GetExecuteFlags()43     ExecuteFlags GetExecuteFlags() const override
44     {
45         return 0U;
46     }
47 
48     // for plugin / factory interface
49     static constexpr BASE_NS::Uid UID { "46144344-29f8-4fc1-913a-ed5f6f2e20d0" };
50     static constexpr char const* TYPE_NAME = "RenderNodeDefaultCameraController";
51     static constexpr IRenderNode::BackendFlags BACKEND_FLAGS = IRenderNode::BackendFlagBits::BACKEND_FLAG_BITS_DEFAULT;
52     static constexpr IRenderNode::ClassType CLASS_TYPE = IRenderNode::ClassType::CLASS_TYPE_NODE;
53     static IRenderNode* Create();
54     static void Destroy(IRenderNode* instance);
55 
56     struct ImageDescs {
57         RENDER_NS::GpuImageDesc depth;
58 
59         RENDER_NS::GpuImageDesc output;
60 
61         RENDER_NS::GpuImageDesc color;
62         RENDER_NS::GpuImageDesc velocityNormal;
63         RENDER_NS::GpuImageDesc history;
64         RENDER_NS::GpuImageDesc baseColor;
65         RENDER_NS::GpuImageDesc material;
66     };
67 
68     struct CreatedTargets {
69         RENDER_NS::RenderHandleReference outputColor;
70         RENDER_NS::RenderHandleReference depth;
71 
72         // NOTE: depending on the post processes and the output target one could re-use colorTarget as resolve
73         // With hdrp and no msaa acts as a 3d scene camera rendering output
74         RENDER_NS::RenderHandleReference colorResolve;
75 
76         RENDER_NS::RenderHandleReference colorMsaa;
77         RENDER_NS::RenderHandleReference depthMsaa;
78 
79         // used in both DF and FW pipeline (not with light-weight)
80         RENDER_NS::RenderHandleReference velocityNormal;
81         // enabled with a flag with both DF and FW (not with light-weight)
82         RENDER_NS::RenderHandleReference history[2u];
83 
84         RENDER_NS::RenderHandleReference baseColor;
85         RENDER_NS::RenderHandleReference material;
86 
87         ImageDescs imageDescs;
88     };
89 
90     struct CameraResourceSetup {
91         BASE_NS::Math::UVec2 outResolution { 0u, 0u };
92         BASE_NS::Math::UVec2 renResolution { 0u, 0u };
93 
94         RenderCamera::Flags camFlags { 0u };
95         RenderCamera::RenderPipelineType pipelineType { RenderCamera::RenderPipelineType::FORWARD };
96 
97         RENDER_NS::RenderHandle colorTarget;
98         RENDER_NS::RenderHandle depthTarget;
99 
100         uint32_t historyFlipFrame { 0 };
101 
102         RENDER_NS::DeviceBackendType backendType { RENDER_NS::DeviceBackendType::VULKAN };
103 
104         ImageDescs inputImageDescs;
105 
106         bool isMultiview { false };
107         RENDER_NS::SampleCountFlags sampleCountFlags { RENDER_NS::SampleCountFlagBits::CORE_SAMPLE_COUNT_4_BIT };
108     };
109     struct ShadowBuffers {
110         RENDER_NS::RenderHandle depthHandle;
111         RENDER_NS::RenderHandle vsmColorHandle;
112 
113         RENDER_NS::RenderHandle pcfSamplerHandle;
114         RENDER_NS::RenderHandle vsmSamplerHandle;
115     };
116 
117 private:
118     RENDER_NS::IRenderNodeContextManager* renderNodeContextMgr_ { nullptr };
119 
120     static constexpr uint64_t INVALID_CAM_ID { 0xFFFFFFFFffffffff };
121     struct JsonInputs {
122         BASE_NS::string customCameraName;
123         uint64_t customCameraId { INVALID_CAM_ID };
124     };
125     JsonInputs jsonInputs_;
126 
127     struct UboHandles {
128         RENDER_NS::RenderHandle cameraData;
129         RENDER_NS::RenderHandleReference generalData;
130         RENDER_NS::RenderHandleReference environment;
131         RENDER_NS::RenderHandleReference postProcess;
132         RENDER_NS::RenderHandleReference fog;
133 
134         RENDER_NS::RenderHandleReference light;
135         RENDER_NS::RenderHandleReference lightCluster;
136     };
137     struct DefaultSamplers {
138         RENDER_NS::RenderHandle cubemapHandle;
139 
140         RENDER_NS::RenderHandle linearHandle;
141         RENDER_NS::RenderHandle nearestHandle;
142         RENDER_NS::RenderHandle linearMipHandle;
143     };
144     DefaultSamplers defaultSamplers_;
145     RENDER_NS::RenderHandle defaultColorPrePassHandle_;
146     ShadowBuffers shadowBuffers_;
147 
148     struct CurrentScene {
149         RenderCamera camera;
150 
151         RENDER_NS::RenderHandle cameraEnvRadianceHandle;
152         RENDER_NS::RenderHandle prePassColorTarget;
153 
154         uint32_t cameraIdx { 0 };
155         BASE_NS::Math::Vec4 sceneTimingData { 0.0f, 0.0f, 0.0f, 0.0f };
156 
157         BASE_NS::string customCameraName;
158         uint64_t customCameraId { INVALID_CAM_ID };
159         BASE_NS::string customCamRngName;
160     };
161     struct ConfigurationNames {
162         BASE_NS::string renderDataStoreName;
163         BASE_NS::string postProcessConfigurationName;
164     };
165     struct ClusterBinders {
166         RENDER_NS::IDescriptorSetBinder::Ptr clusterBuffersSet0;
167         RENDER_NS::PipelineLayout pl;
168 
169         RENDER_NS::RenderHandle shaderHandleCluster;
170         RENDER_NS::PipelineLayout pipelineLayout;
171         Render::RenderHandle psoHandle;
172     };
173     ClusterBinders clusterBinders_;
174 
175     struct GlobalDescriptorSets {
176         // default material set 0 descriptor set
177         RENDER_NS::RenderHandleReference dmSet0;
178         RENDER_NS::IDescriptorSetBinder::Ptr dmSet0Binder;
179     };
180     GlobalDescriptorSets globalDescs_;
181 
182     void SetDefaultGpuImageDescs();
183     void ParseRenderNodeInputs();
184     void CreateResources();
185     void CreateResourceBaseTargets();
186     void RegisterOutputs();
187 
188     void UpdateCurrentScene(const IRenderDataStoreDefaultScene& dataStoreScene,
189         const IRenderDataStoreDefaultCamera& dataStoreCamera, const IRenderDataStoreDefaultLight& dataStoreLight);
190     void CreateBuffers();
191     void UpdateBuffers();
192     void UpdateGeneralUniformBuffer();
193     void UpdateEnvironmentUniformBuffer();
194     void UpdateFogUniformBuffer();
195     void UpdatePostProcessUniformBuffer();
196     void UpdateLightBuffer();
197     void UpdatePostProcessConfiguration();
198     void ClusterLights(RENDER_NS::IRenderCommandList& cmdList);
199     void UpdateGlobalDescriptorSets(RENDER_NS::IRenderCommandList& cmdList);
200 
201     SceneRenderDataStores stores_;
202     CameraResourceSetup camRes_;
203     UboHandles uboHandles_;
204     CurrentScene currentScene_;
205     CreatedTargets createdTargets_;
206     RENDER_NS::RenderHandle defaultCubemap_;
207 
208     RENDER_NS::RenderPostProcessConfiguration currentRenderPPConfiguration_;
209 };
210 CORE3D_END_NAMESPACE()
211 
212 #endif // CORE__RENDER__NODE__RENDER_NODE_DEFAULT_CAMERA_CONTROLLER_H
213