• 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 CORE3D_RENDER__NODE__RENDER_NODE_CAMERA_SINGLE_POST_PROCESS_H
17 #define CORE3D_RENDER__NODE__RENDER_NODE_CAMERA_SINGLE_POST_PROCESS_H
18 
19 #include <3d/namespace.h>
20 #include <3d/render/intf_render_data_store_default_light.h>
21 #include <base/containers/string.h>
22 #include <base/util/uid.h>
23 #include <render/datastore/intf_render_data_store_post_process.h>
24 #include <render/datastore/render_data_store_render_pods.h>
25 #include <render/device/pipeline_state_desc.h>
26 #include <render/nodecontext/intf_pipeline_descriptor_set_binder.h>
27 #include <render/nodecontext/intf_render_node.h>
28 #include <render/render_data_structures.h>
29 #include <render/resource_handle.h>
30 
31 #include "render/render_node_scene_util.h"
32 
33 RENDER_BEGIN_NAMESPACE()
34 struct RenderNodeGraphInputs;
35 RENDER_END_NAMESPACE()
36 
37 CORE3D_BEGIN_NAMESPACE()
38 class IRenderDataStoreDefaultCamera;
39 class IRenderDataStoreDefaultScene;
40 
41 class RenderNodeCameraSinglePostProcess final : public RENDER_NS::IRenderNode {
42 public:
43     RenderNodeCameraSinglePostProcess() = default;
44     ~RenderNodeCameraSinglePostProcess() override = default;
45 
46     void InitNode(RENDER_NS::IRenderNodeContextManager& renderNodeContextMgr) override;
47     void PreExecuteFrame() override;
48     void ExecuteFrame(RENDER_NS::IRenderCommandList& cmdList) override;
GetExecuteFlags()49     ExecuteFlags GetExecuteFlags() const override
50     {
51         return 0U;
52     }
53 
54     // for plugin / factory interface
55     static constexpr BASE_NS::Uid UID { "6257f029-f747-44c7-8de9-87b41b8afd6a" };
56     static constexpr char const* TYPE_NAME = "RenderNodeCameraSinglePostProcess";
57     static constexpr IRenderNode::BackendFlags BACKEND_FLAGS = IRenderNode::BackendFlagBits::BACKEND_FLAG_BITS_DEFAULT;
58     static constexpr IRenderNode::ClassType CLASS_TYPE = IRenderNode::ClassType::CLASS_TYPE_NODE;
59     static IRenderNode* Create();
60     static void Destroy(IRenderNode* instance);
61 
62     struct ShadowBuffers {
63         RENDER_NS::RenderHandle pcfDepthHandle;
64         RENDER_NS::RenderHandle vsmColorHandle;
65 
66         RENDER_NS::RenderHandle pcfSamplerHandle;
67         RENDER_NS::RenderHandle vsmSamplerHandle;
68     };
69     struct DefaultImagesAndSamplers {
70         RENDER_NS::RenderHandle cubemapHandle;
71 
72         RENDER_NS::RenderHandle linearHandle;
73         RENDER_NS::RenderHandle nearestHandle;
74         RENDER_NS::RenderHandle linearMipHandle;
75 
76         RENDER_NS::RenderHandle colorPrePassHandle;
77     };
78 
79 private:
80     RENDER_NS::IRenderNodeContextManager* renderNodeContextMgr_ { nullptr };
81 
82     void RegisterOutputs();
83     void InitCreateBinders();
84     void ParseRenderNodeInputs();
85     void UpdateGlobalPostProcessUbo();
86     void UpdateImageData();
87     void ProcessPostProcessConfiguration();
88     void GetSceneUniformBuffers(const BASE_NS::string_view us);
89     void UpdateCurrentScene(const IRenderDataStoreDefaultScene& dataStoreScene,
90         const IRenderDataStoreDefaultCamera& dataStoreCamera, const IRenderDataStoreDefaultLight& dataStoreLight);
91     void UpdateSet0(RENDER_NS::IRenderCommandList& cmdList);
92     void BindDefaultResources(const uint32_t set, const RENDER_NS::DescriptorSetLayoutBindingResources& bindings);
93     void ExecuteSinglePostProcess(RENDER_NS::IRenderCommandList& cmdList);
94 
95     enum class DefaultOutputImage : uint32_t {
96         OUTPUT = 0,
97         INPUT_OUTPUT_COPY = 1,
98         INPUT = 2,
99         WHITE = 3,
100         BLACK = 4,
101     };
102 
103     static constexpr uint64_t INVALID_CAM_ID { 0xFFFFFFFFffffffff };
104     // Json resources which might need re-fetching
105     struct JsonInputs {
106         RENDER_NS::RenderNodeGraphInputs::InputRenderPass renderPass;
107         RENDER_NS::RenderNodeGraphInputs::InputResources resources;
108         RENDER_NS::RenderNodeGraphInputs::InputResources dispatchResources;
109 
110         RENDER_NS::RenderNodeGraphInputs::RenderDataStore renderDataStore;
111 
112         BASE_NS::string ppName;
113         DefaultOutputImage defaultOutputImage { DefaultOutputImage::OUTPUT };
114 
115         BASE_NS::string customCameraName;
116         uint64_t customCameraId { INVALID_CAM_ID };
117 
118         bool hasChangeableRenderPassHandles { false };
119         bool hasChangeableResourceHandles { false };
120         bool hasChangeableDispatchHandles { false };
121 
122         uint32_t inputIdx { ~0u };
123         uint32_t outputIdx { ~0u };
124     };
125     JsonInputs jsonInputs_;
126 
127     struct BuiltInVariables {
128         RENDER_NS::RenderHandle input;
129 
130         RENDER_NS::RenderHandle output;
131 
132         RENDER_NS::RenderHandle defBuffer;
133         RENDER_NS::RenderHandle defBlackImage;
134         RENDER_NS::RenderHandle defWhiteImage;
135         RENDER_NS::RenderHandle defSampler;
136     };
137     BuiltInVariables builtInVariables_;
138 
139     SceneBufferHandles sceneBuffers_;
140     SceneCameraBufferHandles cameraBuffers_;
141 
142     DefaultImagesAndSamplers defaultImagesAndSamplers_;
143 
144     struct CurrentScene {
145         RenderCamera camera;
146         RENDER_NS::RenderHandle cameraEnvRadianceHandle;
147         RENDER_NS::RenderHandle prePassColorTarget;
148 
149         bool hasShadow { false };
150         IRenderDataStoreDefaultLight::ShadowTypes shadowTypes {};
151         IRenderDataStoreDefaultLight::LightingFlags lightingFlags { 0u };
152     };
153     CurrentScene currentScene_;
154 
155     ShadowBuffers shadowBuffers_;
156 
157     RENDER_NS::RenderNodeHandles::InputRenderPass inputRenderPass_;
158     RENDER_NS::RenderNodeHandles::InputResources inputResources_;
159     RENDER_NS::RenderNodeHandles::InputResources dispatchResources_;
160     RENDER_NS::RenderHandle shader_;
161     RENDER_NS::PipelineLayout pipelineLayout_;
162     RENDER_NS::RenderHandle psoHandle_;
163     RENDER_NS::PushConstant pushConstant_;
164 
165     RENDER_NS::IPipelineDescriptorSetBinder::Ptr pipelineDescriptorSetBinder_;
166 
167     RENDER_NS::PostProcessConfiguration ppGlobalConfig_;
168     RENDER_NS::IRenderDataStorePostProcess::PostProcess ppLocalConfig_;
169 
170     bool graphics_ { true };
171     RENDER_NS::ShaderThreadGroup threadGroupSize_ { 1u, 1u, 1u };
172 
173     SceneRenderDataStores stores_;
174 
175     struct UboHandles {
176         // first 512 aligned is global post process
177         // after (256) we have effect local data
178         RENDER_NS::RenderHandleReference postProcess;
179     };
180     UboHandles ubos_;
181 
182     bool useAutoBindSet0_ { false };
183     bool valid_ { false };
184 };
185 CORE3D_END_NAMESPACE()
186 
187 #endif // CORE3D_RENDER__NODE__RENDER_NODE_CAMERA_SINGLE_POST_PROCESS_H
188