Divide Framework 0.1
A free and open-source 3D Framework under heavy development
Loading...
Searching...
No Matches
RenderPass.cpp
Go to the documentation of this file.
1
2
3#include "config.h"
4
7
14
16
20
23
26
27namespace Divide
28{
29
30 namespace
31 {
32 // We need a proper, time-based system, to check reflection budget
33 namespace ReflectionUtil
34 {
36
37 [[nodiscard]] bool isInBudget() noexcept
38 {
39 return g_reflectionBudget < Config::MAX_REFLECTIVE_NODES_IN_VIEW;
40 }
41 void resetBudget() noexcept
42 {
44 }
45 void updateBudget() noexcept
46 {
48 }
49 [[nodiscard]] U16 currentEntry() noexcept
50 {
51 return g_reflectionBudget;
52 }
53 }
54
55 namespace RefractionUtil
56 {
58
59 [[nodiscard]] bool isInBudget() noexcept
60 {
61 return g_refractionBudget < Config::MAX_REFRACTIVE_NODES_IN_VIEW;
62 }
63 void resetBudget() noexcept
64 {
66 }
67 void updateBudget() noexcept
68 {
70 }
71 [[nodiscard]] U16 currentEntry() noexcept
72 {
73 return g_refractionBudget;
74 }
75 }
76 }
77
78 RenderPass::RenderPass( RenderPassManager& parent, GFXDevice& context, const RenderStage renderStage, const vector<RenderStage>& dependencies )
79 : _dependencies( dependencies )
80 , _context( context )
81 , _parent( parent )
82 , _config( context.context().config() )
83 , _name( TypeUtil::RenderStageToString( renderStage ) )
84 , _stageFlag( renderStage )
85 {
86 for ( U8 i = 0u; i < to_base( _stageFlag ); ++i )
87 {
88 const U8 passCountToSkip = TotalPassCountForStage( static_cast<RenderStage>(i) );
90 }
91 }
92
94 {
95 return
96 {
98 ._lastNodeCount = &_lastNodeCount,
99 ._uniforms = &_uniforms
100 };
101 }
102
103 void RenderPass::render( [[maybe_unused]] const PlayerIndex idx, [[maybe_unused]] const Task& parentTask, const SceneRenderState& renderState, GFX::CommandBuffer& bufferInOut, GFX::MemoryBarrierCommand& memCmdInOut ) const
104 {
106
107 switch ( _stageFlag )
108 {
110 {
111 PROFILE_SCOPE( "RenderPass - Main", Profiler::Category::Scene );
112
113 RenderPassParams params{};
114 params._singleNodeRenderGUID = -1;
115 params._passName = "MainRenderPass";
116 params._stagePass = RenderStagePass{ _stageFlag, RenderPassType::COUNT };
117
118 params._targetDescriptorPrePass._drawMask[to_base( GFXDevice::ScreenTargets::VELOCITY )] = true;
119 params._targetDescriptorPrePass._drawMask[to_base( GFXDevice::ScreenTargets::NORMALS )] = true;
120 params._targetDescriptorPrePass._keepMSAADataAfterResolve = true;
121
122 params._targetDescriptorMainPass._drawMask[to_base( GFXDevice::ScreenTargets::ALBEDO )] = true;
123 params._targetDescriptorMainPass._autoResolveMSAA = false;
124 params._targetDescriptorMainPass._keepMSAADataAfterResolve = true;
125
126 params._targetHIZ = RenderTargetNames::HI_Z;
127 params._clearDescriptorMainPass[RT_DEPTH_ATTACHMENT_IDX]._enabled = false;
128
129 if constexpr (true)
130 {
131 STUBBED("TODO: Figure out why we need to clear the main render target in order to avoid NAN/INF issues in SSR -Ionut");
132 params._clearDescriptorMainPass[to_base( GFXDevice::ScreenTargets::ALBEDO )] = { DefaultColours::DIVIDE_BLUE, true };
133 }
134
135 //Not everything gets drawn during the depth PrePass (E.g. sky)
136 params._clearDescriptorPrePass[RT_DEPTH_ATTACHMENT_IDX] = DEFAULT_CLEAR_ENTRY;
137 params._clearDescriptorPrePass[to_base( GFXDevice::ScreenTargets::VELOCITY )] = { VECTOR4_ZERO, true };
138 params._clearDescriptorPrePass[to_base( GFXDevice::ScreenTargets::NORMALS )] = { VECTOR4_ZERO, true };
139 params._targetOIT = RenderTargetNames::OIT;
140 params._target = RenderTargetNames::SCREEN;
141 params._useMSAA = _config.rendering.MSAASamples > 0u;
142
143 GFX::EnqueueCommand<GFX::BeginDebugScopeCommand>( bufferInOut )->_scopeName = "Main Display Pass";
144
145 Camera* playerCamera = Attorney::ProjectManagerCameraAccessor::playerCamera( _parent.parent().projectManager().get() );
146 _parent.doCustomPass( playerCamera, params, bufferInOut, memCmdInOut );
147 const CameraSnapshot& camSnapshot = playerCamera->snapshot();
148
149 GFX::EnqueueCommand<GFX::PushCameraCommand>( bufferInOut )->_cameraSnapshot = camSnapshot;
150
151 GFX::BeginRenderPassCommand* beginRenderPassCmd = GFX::EnqueueCommand<GFX::BeginRenderPassCommand>( bufferInOut );
152 beginRenderPassCmd->_name = "DO_POST_RENDER_PASS";
153 beginRenderPassCmd->_target = RenderTargetNames::SCREEN;
154 beginRenderPassCmd->_descriptor._drawMask[to_base( GFXDevice::ScreenTargets::ALBEDO )] = true;
155
156 GFX::EnqueueCommand<GFX::BeginDebugScopeCommand>( bufferInOut )->_scopeName = "Debug Draw Pass";
157 Attorney::ProjectManagerRenderPass::debugDraw( _parent.parent().projectManager().get(), bufferInOut, memCmdInOut );
158 GFX::EnqueueCommand<GFX::EndDebugScopeCommand>( bufferInOut );
159
160 if constexpr ( Config::Build::ENABLE_EDITOR )
161 {
163 }
164
165 GFX::EnqueueCommand<GFX::EndRenderPassCommand>( bufferInOut );
166
167 GFX::EnqueueCommand<GFX::PopCameraCommand>( bufferInOut );
168
169 GFX::EnqueueCommand<GFX::EndDebugScopeCommand>( bufferInOut );
170 } break;
172 {
173 if constexpr( Config::Build::ENABLE_EDITOR )
174 {
175 PROFILE_SCOPE( "RenderPass - Node Preview", Profiler::Category::Scene );
176 const Editor& editor = _context.context().editor();
177 if (editor.running() && editor.nodePreviewWindowVisible())
178 {
179 RenderPassParams params = {};
181
182 params._singleNodeRenderGUID = renderState.singleNodeRenderGUID();
183 params._minExtents.set( 1.0f );
185 params._target = editor.getNodePreviewTarget()._targetID;
186 params._passName = "Node Preview";
188 params._clearDescriptorMainPass[to_base( RTColourAttachmentSlot::SLOT_0 )] = {editor.nodePreviewBGColour(), true};
192
193 _parent.doCustomPass( editor.nodePreviewCamera(), params, bufferInOut, memCmdInOut );
194
195 const CameraSnapshot& camSnapshot = editor.nodePreviewCamera()->snapshot();
196 GFX::EnqueueCommand<GFX::PushCameraCommand>( bufferInOut )->_cameraSnapshot = camSnapshot;
197
198 GFX::BeginRenderPassCommand* beginRenderPassCmd = GFX::EnqueueCommand<GFX::BeginRenderPassCommand>( bufferInOut );
199 beginRenderPassCmd->_name = "DO_POST_RENDER_PASS";
200 beginRenderPassCmd->_target = params._target;
201 beginRenderPassCmd->_descriptor._drawMask[to_base( RTColourAttachmentSlot::SLOT_0 )] = true;
202
203 Attorney::EditorRenderPassExecutor::postRender( _context.context().editor(), RenderStage::NODE_PREVIEW, camSnapshot, params._target, bufferInOut, memCmdInOut );
204
205 GFX::EnqueueCommand<GFX::EndRenderPassCommand>( bufferInOut );
206
207 GFX::EnqueueCommand<GFX::PopCameraCommand>( bufferInOut );
208 }
209 }
210 } break;
212 {
213 PROFILE_SCOPE( "RenderPass - Shadow", Profiler::Category::Scene );
215 {
216 ProjectManager* mgr = _parent.parent().projectManager().get();
218
220
221 GFX::EnqueueCommand<GFX::BeginDebugScopeCommand>( bufferInOut )->_scopeName = "Shadow Render Stage";
222 lightPool.sortLightData( RenderStage::SHADOW, camera->snapshot() );
223 lightPool.generateShadowMaps( *camera, bufferInOut, memCmdInOut );
224
225 GFX::EnqueueCommand<GFX::EndDebugScopeCommand>( bufferInOut );
226 }
227 } break;
228
230 {
231 ProjectManager* mgr = _parent.parent().projectManager().get();
233
234 GFX::EnqueueCommand<GFX::BeginDebugScopeCommand>( bufferInOut )->_scopeName = "Reflection Pass";
235 {
236 PROFILE_SCOPE( "RenderPass - Probes", Profiler::Category::Scene );
238
239 SceneEnvironmentProbePool* envProbPool = Attorney::SceneRenderPass::getEnvProbes( mgr->activeProject()->getActiveScene() );
240 envProbPool->lockProbeList();
241 const EnvironmentProbeList& probes = envProbPool->sortAndGetLocked( camera->snapshot()._eye );
242 U32 probeIdx = 0u;
243 for ( const auto& probe : probes )
244 {
245 if ( probe->refresh( bufferInOut, memCmdInOut ) && ++probeIdx == Config::MAX_REFLECTIVE_PROBES_PER_PASS )
246 {
247 break;
248 }
249 }
250 envProbPool->unlockProbeList();
251 }
252 {
253 PROFILE_SCOPE( "RenderPass - Reflection", Profiler::Category::Scene );
254 static VisibleNodeList<> s_Nodes;
255 //Update classic reflectors (e.g. mirrors, water, etc)
256 //Get list of reflective nodes from the scene manager
257 mgr->getSortedReflectiveNodes( camera, RenderStage::REFLECTION, true, s_Nodes );
258
259 // While in budget, update reflections
260 ReflectionUtil::resetBudget();
261 for ( size_t i = 0; i < s_Nodes.size(); ++i )
262 {
263 const VisibleNode& node = s_Nodes.node( i );
264 RenderingComponent* const rComp = node._node->get<RenderingComponent>();
266 ReflectionUtil::currentEntry(),
267 ReflectionUtil::isInBudget(),
268 camera,
269 renderState,
270 bufferInOut,
271 memCmdInOut ) )
272 {
273 ReflectionUtil::updateBudget();
274 }
275 }
276 }
277 GFX::EnqueueCommand<GFX::EndDebugScopeCommand>( bufferInOut );
278
279 } break;
280
282 {
283 static VisibleNodeList<> s_Nodes;
284
285 GFX::EnqueueCommand<GFX::BeginDebugScopeCommand>( bufferInOut )->_scopeName = "Refraction Pass";
286
287 PROFILE_SCOPE( "RenderPass - Refraction", Profiler::Category::Scene );
288 // Get list of refractive nodes from the scene manager
289 const ProjectManager* mgr = _parent.parent().projectManager().get();
291 {
292 mgr->getSortedRefractiveNodes( camera, RenderStage::REFRACTION, true, s_Nodes );
293 // While in budget, update refractions
294 RefractionUtil::resetBudget();
295 for ( size_t i = 0; i < s_Nodes.size(); ++i )
296 {
297 const VisibleNode& node = s_Nodes.node( i );
298 RenderingComponent* const rComp = node._node->get<RenderingComponent>();
300 RefractionUtil::currentEntry(),
301 RefractionUtil::isInBudget(),
302 camera,
303 renderState,
304 bufferInOut,
305 memCmdInOut ) )
306 {
307 RefractionUtil::updateBudget();
308 }
309 }
310 }
311
312 GFX::EnqueueCommand<GFX::EndDebugScopeCommand>( bufferInOut );
313
314 } break;
315
318 break;
319 };
320 }
321
322} //namespace Divide
#define STUBBED(x)
#define DIVIDE_UNEXPECTED_CALL()
#define PROFILE_SCOPE_AUTO(CATEGORY)
Definition: Profiler.h:87
#define PROFILE_SCOPE(NAME, CATEGORY)
Definition: Profiler.h:86
static void postRender(Editor &editor, const RenderStage stage, const CameraSnapshot &cameraSnapshot, const RenderTargetID target, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
Definition: Editor.h:743
static Camera * playerCamera(const Divide::ProjectManager *mgr, const bool skipOverride=false) noexcept
static LightPool & lightPool(Divide::ProjectManager *mgr)
static void debugDraw(Divide::ProjectManager *mgr, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
static bool updateRefraction(RenderingComponent &renderable, const U16 refractionIndex, const bool inBudget, Camera *camera, const SceneRenderState &renderState, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
static bool updateReflection(RenderingComponent &renderable, const U16 reflectionIndex, const bool inBudget, Camera *camera, const SceneRenderState &renderState, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
static SceneEnvironmentProbePool * getEnvProbes(Scene *scene) noexcept
Definition: Scene.h:450
const CameraSnapshot & snapshot() const noexcept
Returns the internal camera snapshot data (eye, orientation, etc)
Definition: Camera.inl:43
const RenderTargetHandle & getNodePreviewTarget() const noexcept
Definition: Editor.inl:78
Rough around the edges Adapter pattern abstracting the actual rendering API and access to the GPU.
Definition: GFXDevice.h:215
Kernel & parent() noexcept
void generateShadowMaps(const Camera &playerCamera, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
Definition: LightPool.cpp:229
void sortLightData(RenderStage stage, const CameraSnapshot &cameraSnapshot)
Definition: LightPool.cpp:423
PlatformContext & context() noexcept
Editor & editor() noexcept
void getSortedReflectiveNodes(const Camera *camera, RenderStage stage, bool inView, VisibleNodeList<> &nodesOut) const
get the full list of reflective nodes
void getSortedRefractiveNodes(const Camera *camera, RenderStage stage, bool inView, VisibleNodeList<> &nodesOut) const
get the full list of refractive nodes
Configuration & _config
Definition: RenderPass.h:91
RenderStage _stageFlag
Definition: RenderPass.h:99
PassData getPassData() const noexcept
Definition: RenderPass.cpp:93
UniformData _uniforms
Definition: RenderPass.h:93
void render(PlayerIndex idx, const Task &parentTask, const SceneRenderState &renderState, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut) const
Definition: RenderPass.cpp:103
RenderPassManager & _parent
Definition: RenderPass.h:90
GFXDevice & _context
Definition: RenderPass.h:89
RenderPass(RenderPassManager &parent, GFXDevice &context, RenderStage renderStage, const vector< RenderStage > &dependencies)
Definition: RenderPass.cpp:78
void doCustomPass(Camera *const camera, RenderPassParams params, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
const EnvironmentProbeList & sortAndGetLocked(const vec3< F32 > &position)
static void Prepare(GFX::CommandBuffer &bufferInOut)
FORCE_INLINE T * get() const
Returns a pointer to a specific component. Returns null if the SGN does not have the component reques...
void set(const T *v) noexcept
set the 3 components of the vector manually using a source pointer to a (large enough) array
Definition: MathVectors.h:707
constexpr bool ENABLE_EDITOR
Definition: config.h:66
constexpr U8 MAX_REFLECTIVE_PROBES_PER_PASS
Maximum number of environment probes we are allowed to update per frame.
Definition: config.h:141
constexpr U16 MAX_VISIBLE_NODES
Estimated maximum number of visible objects per render pass (this includes debug primitives)
Definition: config.h:120
constexpr Optick::Category::Type Scene
Definition: Profiler.h:66
Handle console commands that start with a forward slash.
Definition: AIProcessor.cpp:7
static constexpr U32 RT_DEPTH_ATTACHMENT_IDX
Definition: RTAttachment.h:71
void SetDefaultDrawDescriptor(RenderPassParams &params)
uint8_t U8
eastl::vector< Type > vector
Definition: Vector.h:42
Project & parent
Definition: DefaultScene.h:41
uint16_t U16
static constexpr U8 TotalPassCountForStage(const RenderStage renderStage)
RTClearEntry DEFAULT_CLEAR_ENTRY
vector< EnvironmentProbeComponent * > EnvironmentProbeList
uint32_t U32
static const vec4< F32 > VECTOR4_ZERO
Definition: MathVectors.h:1435
constexpr auto to_base(const Type value) -> Type
struct Divide::Configuration::Rendering::ShadowMapping shadowMapping
struct Divide::Configuration::Rendering rendering
static constexpr RTColourAttachmentSlot ALBEDO
Definition: GFXDevice.h:228
static constexpr RTColourAttachmentSlot NORMALS
Definition: GFXDevice.h:230
static constexpr RTColourAttachmentSlot VELOCITY
Definition: GFXDevice.h:229
RTClearDescriptor _clearDescriptorPrePass
RTDrawDescriptor _targetDescriptorPrePass
RTDrawDescriptor _targetDescriptorMainPass
RTClearDescriptor _clearDescriptorMainPass
RenderTargetID _targetID
Definition: RenderTarget.h:47
static RenderTargetID HI_Z
Definition: GFXDevice.h:204
static RenderTargetID OIT
Definition: GFXDevice.h:200
static RenderTargetID SCREEN
Definition: GFXDevice.h:197
SceneGraphNode * _node
size_t size() const noexcept
const T & node(const size_t idx) const noexcept