• 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_ENV_H
17 #define CORE__RENDER__NODE__RENDER_NODE_DEFAULT_ENV_H
18 
19 #include <3d/render/render_data_defines_3d.h>
20 #include <base/containers/string.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/render_data_structures.h>
27 #include <render/resource_handle.h>
28 
29 #include "render/render_node_scene_util.h"
30 
31 CORE3D_BEGIN_NAMESPACE()
32 class IRenderDataStoreDefaultCamera;
33 class IRenderDataStoreDefaultScene;
34 
35 class RenderNodeDefaultEnv final : public RENDER_NS::IRenderNode {
36 public:
37     explicit RenderNodeDefaultEnv() = default;
38     ~RenderNodeDefaultEnv() 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 { "e3bc29b2-c1d0-4322-a41a-449354fd5a42" };
50     static constexpr const char* const TYPE_NAME = "RenderNodeDefaultEnv";
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 DefaultImages {
57         RENDER_NS::RenderHandle cubeHandle;
58         RENDER_NS::RenderHandle texHandle;
59     };
60 
61 private:
62     RENDER_NS::IRenderNodeContextManager* renderNodeContextMgr_ { nullptr };
63 
64     struct ShaderData {
65         RENDER_NS::RenderHandle pso;
66         RENDER_NS::RenderHandle shader;
67         // typically set 3 (with old compatibility might be the set 1)
68         bool customSet { false };
69         uint32_t customSetIndex { ~0U };
70 
71         RENDER_NS::RenderHandle pl;
72         RENDER_NS::PipelineLayout plData;
73     };
74 
75     void ParseRenderNodeInputs();
76 
77     void RenderData(const IRenderDataStoreDefaultCamera& dsCamera, RENDER_NS::IRenderCommandList& cmdList);
78     bool UpdateAndBindCustomSet(RENDER_NS::IRenderCommandList& cmdList, const RenderCamera::Environment& renderEnv);
79     void UpdateCurrentScene(
80         const IRenderDataStoreDefaultScene& dataStoreScene, const IRenderDataStoreDefaultCamera& dataStoreCamera);
81     ShaderData GetPso(const RENDER_NS::RenderHandle shaderHandle,
82         const RenderCamera::Environment::BackgroundType bgType,
83         const RENDER_NS::RenderPostProcessConfiguration& renderPostProcessConfiguration);
84     void CreateDescriptorSets();
85     void UpdatePostProcessConfiguration();
86     BASE_NS::array_view<const RENDER_NS::DynamicStateEnum> GetDynamicStates() const;
87     void ResetRenderSlotData(const bool enableMultiview);
88     void EvaluateFogBits();
89 
90     static constexpr uint64_t INVALID_CAM_ID { 0xFFFFFFFFffffffff };
91     struct JsonInputs {
92         RENDER_NS::RenderNodeGraphInputs::RenderDataStore renderDataStore;
93 
94         BASE_NS::string customCameraName;
95         uint64_t customCameraId { INVALID_CAM_ID };
96         uint32_t nodeFlags { 0u };
97 
98         RENDER_NS::RenderNodeGraphInputs::InputRenderPass renderPass;
99         bool hasChangeableRenderPassHandles { false };
100 
101         uint32_t renderSlotId { ~0u };
102         uint32_t shaderRenderSlotMultiviewId { ~0u };
103     };
104     JsonInputs jsonInputs_;
105     RENDER_NS::RenderNodeHandles::InputRenderPass inputRenderPass_;
106 
107     SceneRenderDataStores stores_;
108 
109     RENDER_NS::RenderHandle cubemapSampler;
110 
111     RenderCamera::Environment::BackgroundType currentBgType_ { RenderCamera::Environment::BG_TYPE_NONE };
112     RenderCamera::ShaderFlags currentCameraShaderFlags_ { 0U };
113 
114     RENDER_NS::IDescriptorSetBinder::Ptr builtInSet3_;
115 
116     bool enableMultiView_ { false };
117 
118     struct CurrentScene {
119         RenderCamera camera;
120         RENDER_NS::ViewportDesc viewportDesc;
121         RENDER_NS::ScissorDesc scissorDesc;
122 
123         RenderCamera::ShaderFlags cameraShaderFlags { 0u }; // evaluated based on camera and scene flags
124     };
125     CurrentScene currentScene_;
126     DefaultImages defaultImages_;
127     BASE_NS::string cameraName_;
128 
129     ShaderData currShaderData_;
130     ShaderData defaultShaderData_;
131     RENDER_NS::RenderHandle defaultSkyShader_;
132 
133     RENDER_NS::RenderPass renderPass_;
134     // the base default render node graph from RNG setup
135     RENDER_NS::RenderPass rngRenderPass_;
136     bool fsrEnabled_ { false };
137 
138     RENDER_NS::RenderPostProcessConfiguration currentRenderPPConfiguration_;
139 };
140 CORE3D_END_NAMESPACE()
141 
142 #endif // CORE__RENDER__NODE__RENDER_NODE_DEFAULT_ENV_H
143