Skip to content

Commit cdbe904

Browse files
committed
WIP: separated SceneRenderer + RenderGraph
-> SceneRendererPanel - Toggles - PostFX - Visualization - Shadows -> SceneDebuggerPanel - Timers - Per-Pass - CPU/GPU Memory - Workload - Pipeline Counters - ShaderReload RenderGraph: Exposes a SceneRenderer debug snapshot with pass inputs/outputs, texture format, resolution, mip/layer ranges, lifetime, alias group, alias source/live alias state, graph-derived current state, and tracked image state:
1 parent 6bb2ff8 commit cdbe904

9 files changed

Lines changed: 871 additions & 371 deletions

File tree

Core/Source/Lux/Renderer/SceneRenderer.cpp

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2449,6 +2449,86 @@ namespace Lux {
24492449
addPass("DOF", compositeOutputs, addRenderPassResources("DOF", m_DOFPass));
24502450
}
24512451

2452+
SceneRenderer::RenderGraphDebugSnapshot SceneRenderer::GetRenderGraphDebugSnapshot()
2453+
{
2454+
BuildRenderGraph();
2455+
2456+
RenderGraphDebugSnapshot snapshot;
2457+
const auto lifetimes = m_RenderGraph.BuildAliasPlan();
2458+
const auto& textures = m_RenderGraph.GetTextures();
2459+
const auto& passes = m_RenderGraph.GetPasses();
2460+
2461+
snapshot.Textures.reserve(textures.size());
2462+
for (uint32_t resource = 0; resource < textures.size(); resource++)
2463+
{
2464+
const RenderGraph::TextureDesc& texture = textures[resource];
2465+
RenderGraphTextureDebugInfo& textureInfo = snapshot.Textures.emplace_back();
2466+
textureInfo.Resource = resource;
2467+
textureInfo.Name = texture.Name;
2468+
textureInfo.Format = texture.Format;
2469+
textureInfo.Usage = texture.Usage;
2470+
textureInfo.Dimension = texture.Dimension;
2471+
textureInfo.Width = texture.Width;
2472+
textureInfo.Height = texture.Height;
2473+
textureInfo.Mips = texture.Mips;
2474+
textureInfo.Layers = texture.Layers;
2475+
textureInfo.EstimatedBytes = Utils::GetImageMemorySize(texture.Format, texture.Width, texture.Height, texture.Mips, texture.Layers);
2476+
textureInfo.Transient = texture.Transient;
2477+
textureInfo.AllowAlias = texture.AllowAlias;
2478+
2479+
if (resource < lifetimes.size())
2480+
{
2481+
const RenderGraph::ResourceLifetime& lifetime = lifetimes[resource];
2482+
textureInfo.FirstPass = lifetime.FirstPass;
2483+
textureInfo.LastPass = lifetime.LastPass;
2484+
textureInfo.AliasGroup = lifetime.AliasIndex;
2485+
}
2486+
2487+
if (texture.Image)
2488+
{
2489+
textureInfo.AliasedNow = texture.Image->IsTransientAlias();
2490+
textureInfo.CurrentState = texture.Image->GetImageInfo().State;
2491+
}
2492+
}
2493+
2494+
auto containsResource = [](const std::vector<RenderGraph::ResourceHandle>& resources, RenderGraph::ResourceHandle resource)
2495+
{
2496+
return std::find(resources.begin(), resources.end(), resource) != resources.end();
2497+
};
2498+
2499+
auto accessState = [&](const RenderGraph::PassDesc& pass, RenderGraph::ResourceHandle resource, bool asInput)
2500+
{
2501+
const bool read = containsResource(pass.Reads, resource);
2502+
const bool write = containsResource(pass.Writes, resource);
2503+
if (read && write)
2504+
return std::string("ReadWrite");
2505+
return std::string(asInput ? "Read" : "Write");
2506+
};
2507+
2508+
snapshot.Passes.reserve(passes.size());
2509+
for (const RenderGraph::PassDesc& pass : passes)
2510+
{
2511+
RenderGraphPassDebugInfo& passInfo = snapshot.Passes.emplace_back();
2512+
passInfo.Name = pass.Name;
2513+
2514+
for (RenderGraph::ResourceHandle resource : pass.Reads)
2515+
{
2516+
if (resource >= textures.size())
2517+
continue;
2518+
passInfo.Inputs.push_back({ resource, accessState(pass, resource, true) });
2519+
}
2520+
2521+
for (RenderGraph::ResourceHandle resource : pass.Writes)
2522+
{
2523+
if (resource >= textures.size())
2524+
continue;
2525+
passInfo.Outputs.push_back({ resource, accessState(pass, resource, false) });
2526+
}
2527+
}
2528+
2529+
return snapshot;
2530+
}
2531+
24522532
void SceneRenderer::UpdateRenderGraphStatistics()
24532533
{
24542534
auto& memoryStats = m_Statistics.MemoryStats;
@@ -4085,6 +4165,17 @@ namespace Lux {
40854165

40864166
BeginProfiledGPU("LightCullingPass");
40874167
Renderer::LightCulling(m_CommandBuffer, m_LightCullingPass, nullptr, { m_LightTilesCountX, m_LightTilesCountY, 1 });
4168+
4169+
Ref<RenderCommandBuffer> commandBuffer = m_CommandBuffer;
4170+
Ref<StorageBufferSet> visiblePointLightIndices = m_SBSVisiblePointLightIndices;
4171+
Ref<StorageBufferSet> visibleSpotLightIndices = m_SBSVisibleSpotLightIndices;
4172+
Renderer::Submit([commandBuffer, visiblePointLightIndices, visibleSpotLightIndices]() mutable
4173+
{
4174+
nvrhi::CommandListHandle commandList = commandBuffer->GetActive();
4175+
commandList->setBufferState(visiblePointLightIndices->RT_Get()->GetHandle(), nvrhi::ResourceStates::ShaderResource);
4176+
commandList->setBufferState(visibleSpotLightIndices->RT_Get()->GetHandle(), nvrhi::ResourceStates::ShaderResource);
4177+
});
4178+
40884179
EndProfiledGPU();
40894180
}
40904181

Core/Source/Lux/Renderer/SceneRenderer.h

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include <array>
2929
#include <limits>
3030
#include <map>
31+
#include <string>
3132
#include <unordered_map>
3233
#include <vector>
3334

@@ -313,6 +314,46 @@ namespace Lux {
313314
std::vector<PassProfile> PassProfiles;
314315
};
315316

317+
struct RenderGraphResourceAccessDebugInfo
318+
{
319+
uint32_t Resource = RenderGraph::InvalidResource;
320+
std::string State;
321+
};
322+
323+
struct RenderGraphTextureDebugInfo
324+
{
325+
uint32_t Resource = RenderGraph::InvalidResource;
326+
std::string Name;
327+
ImageFormat Format = ImageFormat::None;
328+
ImageUsage Usage = ImageUsage::None;
329+
nvrhi::TextureDimension Dimension = nvrhi::TextureDimension::Unknown;
330+
uint32_t Width = 0;
331+
uint32_t Height = 0;
332+
uint32_t Mips = 0;
333+
uint32_t Layers = 0;
334+
uint64_t EstimatedBytes = 0;
335+
uint32_t FirstPass = UINT32_MAX;
336+
uint32_t LastPass = UINT32_MAX;
337+
uint32_t AliasGroup = UINT32_MAX;
338+
bool Transient = false;
339+
bool AllowAlias = false;
340+
bool AliasedNow = false;
341+
nvrhi::ResourceStates CurrentState = nvrhi::ResourceStates::Unknown;
342+
};
343+
344+
struct RenderGraphPassDebugInfo
345+
{
346+
std::string Name;
347+
std::vector<RenderGraphResourceAccessDebugInfo> Inputs;
348+
std::vector<RenderGraphResourceAccessDebugInfo> Outputs;
349+
};
350+
351+
struct RenderGraphDebugSnapshot
352+
{
353+
std::vector<RenderGraphPassDebugInfo> Passes;
354+
std::vector<RenderGraphTextureDebugInfo> Textures;
355+
};
356+
316357
public:
317358
SceneRenderer() = default;
318359
SceneRenderer(Ref<Scene> scene,
@@ -413,6 +454,7 @@ namespace Lux {
413454

414455
const glm::mat4& GetScreenSpaceProjectionMatrix() const { return m_ScreenSpaceProjectionMatrix; }
415456
const Statistics& GetStatistics() const { return m_Statistics; }
457+
RenderGraphDebugSnapshot GetRenderGraphDebugSnapshot();
416458
const Frustum& GetCameraFrustum() const { return m_SceneData.CameraFrustum; }
417459

418460
bool IsReady() const { return m_ResourcesCreatedGPU; }

Editor/SandboxProject/Sandbox.luxproj

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,35 @@ Project:
1515
RenderingTechnique: Forward
1616
SceneRenderer:
1717
Rendering:
18-
FrustumCulling: true
19-
GPUDrivenRendering: true
18+
FrustumCulling: false
19+
OcclusionCulling: false
20+
GPUDrivenRendering: false
2021
GTAO: true
2122
GTAOBentNormals: true
2223
GTAODenoisePasses: 8
2324
AOShadowTolerance: 4
2425
SSR: true
2526
JumpFloodOutline: true
27+
RenderScaleMode: Scale100
28+
DynamicResolutionMinScale: 0.5
29+
DynamicResolutionMaxScale: 1
30+
DynamicResolutionTargetGPUTime: 16.6700001
31+
TextureMipBias: 0
32+
DistanceMipBias: false
33+
DistanceMipBiasStart: 50
34+
DistanceMipBiasEnd: 250
35+
DistanceMipBiasMax: 2
36+
OcclusionDepthBias: 0.00300000003
37+
OcclusionBoundsScale: 1.14999998
38+
GTAOResolutionScale: 1
39+
GTAOTemporalAccumulation: true
40+
GTAOTemporalBlend: 0.850000024
41+
SSRResolutionScale: 1
42+
SSRTemporalAccumulation: true
43+
SSRTemporalBlend: 0.899999976
2644
Shadows:
2745
SoftShadows: true
46+
ShadowCulling: true
2847
MaxDistance: 200
2948
DistanceFade: 25
3049
SplitLambda: 0.920000017
@@ -34,17 +53,19 @@ Project:
3453
PostFX:
3554
Bloom:
3655
Enabled: true
56+
ResolutionScale: 2
3757
Threshold: 1
3858
Knee: 0.100000001
3959
UpsampleScale: 1
4060
Intensity: 1
4161
DirtIntensity: 1
4262
DOF:
4363
Enabled: true
64+
ResolutionScale: 1
4465
FocusDistance: 4
4566
BlurSize: 0.75
4667
SSR:
47-
HalfRes: true
68+
HalfRes: false
4869
MaxSteps: 70
4970
Brightness: 0.699999988
5071
DepthTolerance: 0.800000012

Editor/Source/EditorLayer.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "Panels/TextEditorPanel.h"
3131
#include "Panels/ContentBrowserPanel.h"
3232
#include "Panels/SceneRendererPanel.h"
33+
#include "Panels/RendererDebuggerPanel.h"
3334
#include "Panels/ApplicationSettingsPanel.h"
3435
#include "Panels/AssetManagerPanel.h"
3536
#include "Panels/ProjectSettingsWindow.h"
@@ -60,6 +61,7 @@ namespace Lux {
6061
#define APPLICATION_SETTINGS_PANEL_ID "ApplicationSettingsPanel"
6162
#define SCRIPT_ENGINE_DEBUG_PANEL_ID "ScriptEngineDebugPanel"
6263
#define SCENE_RENDERER_PANEL_ID "SceneRendererPanel"
64+
#define RENDERER_DEBUGGER_PANEL_ID "RendererDebuggerPanel"
6365
#define PHYSICS_CAPTURES_PANEL_ID "PhysicsCapturesPanel"
6466

6567
namespace {
@@ -176,6 +178,7 @@ namespace Lux {
176178
m_ConsolePanel = m_PanelManager->AddPanel<EditorConsolePanel>(PanelCategory::View, CONSOLE_PANEL_ID, "Log", true);
177179

178180
m_SceneRendererPanel = m_PanelManager->AddPanel<SceneRendererPanel>(PanelCategory::View, SCENE_RENDERER_PANEL_ID, "Scene Renderer", true);
181+
m_RendererDebuggerPanel = m_PanelManager->AddPanel<RendererDebuggerPanel>(PanelCategory::View, RENDERER_DEBUGGER_PANEL_ID, "Renderer Debugger", false);
179182

180183
ApplicationSettingsPanel::EditorPreferencesBindings editorPreferencesBindings{};
181184
editorPreferencesBindings.VSync = &m_VSync;
@@ -235,6 +238,8 @@ namespace Lux {
235238

236239
if (m_SceneRendererPanel)
237240
m_SceneRendererPanel->SetContext(m_SceneRenderer);
241+
if (m_RendererDebuggerPanel)
242+
m_RendererDebuggerPanel->SetContext(m_SceneRenderer);
238243

239244
m_PanelManager->SetSceneContext(m_EditorScene);
240245
m_PanelManager->OnProjectChanged(Project::GetActive());
@@ -286,6 +291,7 @@ namespace Lux {
286291
m_EditorViewport->Shutdown();
287292
m_EditorViewport.reset();
288293
m_SceneRenderer.reset();
294+
m_RendererDebuggerPanel.reset();
289295
m_SceneRendererPanel.reset();
290296
m_SceneHierarchyPanel.reset();
291297
EditorResources::Shutdown();
@@ -1610,6 +1616,8 @@ namespace Lux {
16101616

16111617
if (m_SceneRendererPanel)
16121618
m_SceneRendererPanel->SetContext(m_SceneRenderer);
1619+
if (m_RendererDebuggerPanel)
1620+
m_RendererDebuggerPanel->SetContext(m_SceneRenderer);
16131621
}
16141622

16151623
void EditorLayer::OpenScene()
@@ -1641,6 +1649,8 @@ namespace Lux {
16411649

16421650
if (m_SceneRendererPanel)
16431651
m_SceneRendererPanel->SetContext(m_SceneRenderer);
1652+
if (m_RendererDebuggerPanel)
1653+
m_RendererDebuggerPanel->SetContext(m_SceneRenderer);
16441654
}
16451655

16461656
void EditorLayer::SaveScene()
@@ -1689,6 +1699,8 @@ namespace Lux {
16891699

16901700
if (m_SceneRendererPanel)
16911701
m_SceneRendererPanel->SetContext(m_SceneRenderer);
1702+
if (m_RendererDebuggerPanel)
1703+
m_RendererDebuggerPanel->SetContext(m_SceneRenderer);
16921704
}
16931705

16941706
void EditorLayer::OnSceneSimulate()
@@ -1713,6 +1725,8 @@ namespace Lux {
17131725

17141726
if (m_SceneRendererPanel)
17151727
m_SceneRendererPanel->SetContext(m_SceneRenderer);
1728+
if (m_RendererDebuggerPanel)
1729+
m_RendererDebuggerPanel->SetContext(m_SceneRenderer);
17161730
}
17171731

17181732
void EditorLayer::OnSceneStop()
@@ -1739,6 +1753,8 @@ namespace Lux {
17391753

17401754
if (m_SceneRendererPanel)
17411755
m_SceneRendererPanel->SetContext(m_SceneRenderer);
1756+
if (m_RendererDebuggerPanel)
1757+
m_RendererDebuggerPanel->SetContext(m_SceneRenderer);
17421758
}
17431759

17441760
void EditorLayer::OnScenePause()

Editor/Source/EditorLayer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ namespace Lux
2525
{
2626
class SceneHierarchyPanel;
2727
class SceneRendererPanel;
28+
class RendererDebuggerPanel;
2829

2930
class EditorLayer : public Layer
3031
{
@@ -94,6 +95,7 @@ namespace Lux
9495
Ref<SceneRenderer> m_SceneRenderer;
9596
Ref<SceneHierarchyPanel> m_SceneHierarchyPanel;
9697
Ref<SceneRendererPanel> m_SceneRendererPanel;
98+
Ref<RendererDebuggerPanel> m_RendererDebuggerPanel;
9799
Ref<EditorConsolePanel> m_ConsolePanel;
98100

99101
// Temp

0 commit comments

Comments
 (0)