• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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         RENDER_NS::RenderHandle tlas;
138     };
139     struct DefaultSamplers {
140         RENDER_NS::RenderHandle cubemapHandle;
141 
142         RENDER_NS::RenderHandle linearHandle;
143         RENDER_NS::RenderHandle nearestHandle;
144         RENDER_NS::RenderHandle linearMipHandle;
145     };
146     DefaultSamplers defaultSamplers_;
147     RENDER_NS::RenderHandle defaultColorPrePassHandle_;
148     ShadowBuffers shadowBuffers_;
149 
150     struct CurrentScene {
151         RenderCamera camera;
152 
153         RENDER_NS::RenderHandle cameraEnvRadianceHandle;
154         RENDER_NS::RenderHandle prePassColorTarget;
155 
156         uint32_t cameraIdx { 0 };
157         BASE_NS::Math::Vec4 sceneTimingData { 0.0f, 0.0f, 0.0f, 0.0f };
158 
159         BASE_NS::string customCameraName;
160         uint64_t customCameraId { INVALID_CAM_ID };
161         BASE_NS::string customCamRngName;
162     };
163     struct ConfigurationNames {
164         BASE_NS::string renderDataStoreName;
165         BASE_NS::string postProcessConfigurationName;
166     };
167     struct ClusterBinders {
168         RENDER_NS::IDescriptorSetBinder::Ptr clusterBuffersSet0;
169         RENDER_NS::PipelineLayout pl;
170 
171         RENDER_NS::RenderHandle shaderHandleCluster;
172         RENDER_NS::PipelineLayout pipelineLayout;
173         RENDER_NS::RenderHandle psoHandle;
174     };
175     ClusterBinders clusterBinders_;
176 
177     struct GlobalDescriptorSets {
178         // default material set 0 descriptor set
179         RENDER_NS::RenderHandleReference dmSet0;
180         RENDER_NS::IDescriptorSetBinder::Ptr dmSet0Binder;
181     };
182     GlobalDescriptorSets globalDescs_;
183 
184     void SetDefaultGpuImageDescs();
185     void ParseRenderNodeInputs();
186     void CreateResources();
187     void CreateResourceBaseTargets();
188     void RegisterOutputs();
189 
190     void UpdateCurrentScene(const IRenderDataStoreDefaultScene& dataStoreScene,
191         const IRenderDataStoreDefaultCamera& dataStoreCamera, const IRenderDataStoreDefaultLight& dataStoreLight);
192     void CreateBuffers();
193     void UpdateBuffers();
194     void UpdateGeneralUniformBuffer();
195     void UpdateEnvironmentUniformBuffer();
196     void UpdateFogUniformBuffer();
197     void UpdatePostProcessUniformBuffer();
198     void UpdateLightBuffer();
199     void UpdatePostProcessConfiguration();
200     void ClusterLights(RENDER_NS::IRenderCommandList& cmdList);
201     void UpdateGlobalDescriptorSets(RENDER_NS::IRenderCommandList& cmdList);
202 
203     SceneRenderDataStores stores_;
204     BASE_NS::string dsWeatherName_;
205 
206     CameraResourceSetup camRes_;
207     UboHandles uboHandles_;
208     CurrentScene currentScene_;
209     CreatedTargets createdTargets_;
210     RENDER_NS::RenderHandle defaultCubemap_;
211 
212     RENDER_NS::RenderPostProcessConfiguration currentRenderPPConfiguration_;
213 
214     bool rtEnabled_ { false };
215 };
216 CORE3D_END_NAMESPACE()
217 
218 #endif // CORE__RENDER__NODE__RENDER_NODE_DEFAULT_CAMERA_CONTROLLER_H
219