From ea5e38fdd1ed2d7272c9290ccb239e4599bf5bf9 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Thu, 10 Nov 2022 00:22:23 +0100 Subject: [PATCH] Fixes for overriden draw calls material in debug views --- Source/Engine/Graphics/Materials/IMaterial.h | 3 + .../Renderer/Editor/MaterialComplexity.cpp | 17 +---- .../Renderer/Editor/MaterialComplexity.h | 5 +- Source/Engine/Renderer/GBufferPass.cpp | 71 ++++++++++++------- Source/Engine/Renderer/GBufferPass.h | 1 + Source/Engine/Renderer/Renderer.cpp | 4 ++ 6 files changed, 58 insertions(+), 43 deletions(-) diff --git a/Source/Engine/Graphics/Materials/IMaterial.h b/Source/Engine/Graphics/Materials/IMaterial.h index bd3337876..061da5192 100644 --- a/Source/Engine/Graphics/Materials/IMaterial.h +++ b/Source/Engine/Graphics/Materials/IMaterial.h @@ -129,6 +129,9 @@ public: /// True if can use instancing, otherwise false. virtual bool CanUseInstancing(InstancingHandler& handler) const { +#if BUILD_DEBUG + handler = { nullptr, nullptr, nullptr }; +#endif return false; } diff --git a/Source/Engine/Renderer/Editor/MaterialComplexity.cpp b/Source/Engine/Renderer/Editor/MaterialComplexity.cpp index 7fefb2a47..b20e1e976 100644 --- a/Source/Engine/Renderer/Editor/MaterialComplexity.cpp +++ b/Source/Engine/Renderer/Editor/MaterialComplexity.cpp @@ -19,9 +19,6 @@ #include "Engine/Renderer/RenderList.h" #include "Engine/Renderer/Lightmaps.h" -// The limit for maximum material complexity (estimated based on shader textures, instructions and GPU stages usage). -#define COMPLEXITY_LIMIT 1700 - const MaterialInfo& MaterialComplexityMaterialShader::WrapperShader::GetInfo() const { if (MaterialAsset) @@ -77,7 +74,7 @@ void MaterialComplexityMaterialShader::WrapperShader::Bind(BindParameters& param ASSERT_LOW_LAYER(material && material->IsReady()); material->Bind(params); GPUPipelineState* materialPs = params.GPUContext->GetState(); - const float complexity = (float)Math::Min(materialPs->Complexity, COMPLEXITY_LIMIT) / COMPLEXITY_LIMIT; + const float complexity = (float)Math::Min(materialPs->Complexity, MATERIAL_COMPLEXITY_LIMIT) / MATERIAL_COMPLEXITY_LIMIT; // Draw with custom color const Color color(complexity, complexity, complexity, 1.0f); @@ -103,7 +100,7 @@ MaterialComplexityMaterialShader::MaterialComplexityMaterialShader() #undef INIT_WRAPPER } -void MaterialComplexityMaterialShader::DebugOverrideDrawCallsMaterial(RenderContext& renderContext, GPUContext* context, GPUTextureView* lightBuffer) +void MaterialComplexityMaterialShader::DebugOverrideDrawCallsMaterial(RenderContext& renderContext) { // Cache 'ready' state for wrappers bool isReady[ARRAY_COUNT(_wrappers) + 1]; @@ -116,16 +113,6 @@ void MaterialComplexityMaterialShader::DebugOverrideDrawCallsMaterial(RenderCont DebugOverrideDrawCallsMaterial(e, isReady); for (auto& e : renderContext.List->BatchedDrawCalls) DebugOverrideDrawCallsMaterial(e.DrawCall, isReady); - - // Initialize background with complexity of the sky (uniform) - if (renderContext.List->Sky) - { - renderContext.List->Sky->ApplySky(context, renderContext, Matrix::Identity); - GPUPipelineState* materialPs = context->GetState(); - const float complexity = (float)Math::Min(materialPs->Complexity, COMPLEXITY_LIMIT) / COMPLEXITY_LIMIT; - context->Clear(lightBuffer, Color(complexity, complexity, complexity, 1.0f)); - renderContext.List->Sky = nullptr; - } } void MaterialComplexityMaterialShader::Draw(RenderContext& renderContext, GPUContext* context, GPUTextureView* lightBuffer) diff --git a/Source/Engine/Renderer/Editor/MaterialComplexity.h b/Source/Engine/Renderer/Editor/MaterialComplexity.h index 716964f0d..f7d7dd00c 100644 --- a/Source/Engine/Renderer/Editor/MaterialComplexity.h +++ b/Source/Engine/Renderer/Editor/MaterialComplexity.h @@ -11,6 +11,9 @@ class GPUPipelineState; +// The limit for maximum material complexity (estimated based on shader textures, instructions and GPU stages usage). +#define MATERIAL_COMPLEXITY_LIMIT 1700 + /// /// Rendering material shaders complexity to visualize performance of pixels rendering in editor. /// @@ -39,7 +42,7 @@ private: public: MaterialComplexityMaterialShader(); - void DebugOverrideDrawCallsMaterial(RenderContext& renderContext, GPUContext* context, GPUTextureView* lightBuffer); + void DebugOverrideDrawCallsMaterial(RenderContext& renderContext); void Draw(RenderContext& renderContext, GPUContext* context, GPUTextureView* lightBuffer); private: diff --git a/Source/Engine/Renderer/GBufferPass.cpp b/Source/Engine/Renderer/GBufferPass.cpp index 9f7f331af..cbe948b47 100644 --- a/Source/Engine/Renderer/GBufferPass.cpp +++ b/Source/Engine/Renderer/GBufferPass.cpp @@ -102,7 +102,7 @@ void GBufferPass::Dispose() #if USE_EDITOR -void DebugOverrideDrawCallsMaterial(RenderContext& renderContext, IMaterial* material) +void DebugOverrideDrawCallsMaterial(const RenderContext& renderContext, IMaterial* material) { if (!material->IsReady()) return; @@ -114,7 +114,7 @@ void DebugOverrideDrawCallsMaterial(RenderContext& renderContext, IMaterial* mat auto& drawCallsList = renderContext.List->DrawCallsLists[(int32)DrawCallsListType::GBuffer]; for (int32 i : drawCallsList.Indices) { - auto& drawCall = renderContext.List->DrawCalls[i]; + auto& drawCall = renderContext.List->DrawCalls.Get()[i]; if (drawCall.Material->IsSurface()) { drawCall.Material = material; @@ -127,7 +127,7 @@ void DebugOverrideDrawCallsMaterial(RenderContext& renderContext, IMaterial* mat auto& drawCallsList = renderContext.List->DrawCallsLists[(int32)DrawCallsListType::GBufferNoDecals]; for (int32 i : drawCallsList.Indices) { - auto& drawCall = renderContext.List->DrawCalls[i]; + auto& drawCall = renderContext.List->DrawCalls.Get()[i]; if (drawCall.Material->IsSurface()) { drawCall.Material = material; @@ -176,32 +176,20 @@ void GBufferPass::Fill(RenderContext& renderContext, GPUTextureView* lightBuffer } #if USE_EDITOR - // Override draw calls material to use material debug shader - if (renderContext.View.Mode == ViewMode::LightmapUVsDensity) + // Special debug drawing + if (renderContext.View.Mode == ViewMode::MaterialComplexity) { - if (!_lightmapUVsDensity) - _lightmapUVsDensity = New(); - DebugOverrideDrawCallsMaterial(renderContext, _lightmapUVsDensity); + // Initialize background with complexity of the sky (uniform) + if (renderContext.List->Sky) + { + renderContext.List->Sky->ApplySky(context, renderContext, Matrix::Identity); + GPUPipelineState* materialPs = context->GetState(); + const float complexity = (float)Math::Min(materialPs->Complexity, MATERIAL_COMPLEXITY_LIMIT) / MATERIAL_COMPLEXITY_LIMIT; + context->Clear(lightBuffer, Color(complexity, complexity, complexity, 1.0f)); + renderContext.List->Sky = nullptr; + } } - else if (renderContext.View.Mode == ViewMode::VertexColors) - { - if (!_vertexColors) - _vertexColors = New(); - DebugOverrideDrawCallsMaterial(renderContext, _vertexColors); - } - else if (renderContext.View.Mode == ViewMode::LODPreview) - { - if (!_lodPreview) - _lodPreview = New(); - DebugOverrideDrawCallsMaterial(renderContext, _lodPreview); - } - else if (renderContext.View.Mode == ViewMode::MaterialComplexity) - { - if (!_materialComplexity) - _materialComplexity = New(); - _materialComplexity->DebugOverrideDrawCallsMaterial(renderContext, context, lightBuffer); - } - if (renderContext.View.Mode == ViewMode::PhysicsColliders) + else if (renderContext.View.Mode == ViewMode::PhysicsColliders) { context->ResetRenderTarget(); return; @@ -328,6 +316,35 @@ GPUTextureView* GBufferPass::RenderSkybox(RenderContext& renderContext, GPUConte return result; } +void GBufferPass::OverrideDrawCalls(RenderContext& renderContext) +{ + // Override draw calls material to use material debug shader + if (renderContext.View.Mode == ViewMode::LightmapUVsDensity) + { + if (!_lightmapUVsDensity) + _lightmapUVsDensity = New(); + DebugOverrideDrawCallsMaterial(renderContext, _lightmapUVsDensity); + } + else if (renderContext.View.Mode == ViewMode::VertexColors) + { + if (!_vertexColors) + _vertexColors = New(); + DebugOverrideDrawCallsMaterial(renderContext, _vertexColors); + } + else if (renderContext.View.Mode == ViewMode::LODPreview) + { + if (!_lodPreview) + _lodPreview = New(); + DebugOverrideDrawCallsMaterial(renderContext, _lodPreview); + } + else if (renderContext.View.Mode == ViewMode::MaterialComplexity) + { + if (!_materialComplexity) + _materialComplexity = New(); + _materialComplexity->DebugOverrideDrawCallsMaterial(renderContext); + } +} + #if USE_EDITOR void GBufferPass::DrawMaterialComplexity(RenderContext& renderContext, GPUContext* context, GPUTextureView* lightBuffer) diff --git a/Source/Engine/Renderer/GBufferPass.h b/Source/Engine/Renderer/GBufferPass.h index 8ff3f6091..81a65a108 100644 --- a/Source/Engine/Renderer/GBufferPass.h +++ b/Source/Engine/Renderer/GBufferPass.h @@ -46,6 +46,7 @@ public: GPUTextureView* RenderSkybox(RenderContext& renderContext, GPUContext* context); #if USE_EDITOR + void OverrideDrawCalls(RenderContext& renderContext); void DrawMaterialComplexity(RenderContext& renderContext, GPUContext* context, GPUTextureView* lightBuffer); #endif diff --git a/Source/Engine/Renderer/Renderer.cpp b/Source/Engine/Renderer/Renderer.cpp index e2c3d1bec..3efa812fa 100644 --- a/Source/Engine/Renderer/Renderer.cpp +++ b/Source/Engine/Renderer/Renderer.cpp @@ -356,6 +356,10 @@ void RenderInner(SceneRenderTask* task, RenderContext& renderContext, RenderCont for (const int64 label : renderContextBatch.WaitLabels) JobSystem::Wait(label); renderContextBatch.WaitLabels.Clear(); + +#if USE_EDITOR + GBufferPass::Instance()->OverrideDrawCalls(renderContext); +#endif } // Sort draw calls