From a3694203a23af8baeffb7208172721365bec4e5f Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Thu, 25 Jun 2026 11:21:13 +0200 Subject: [PATCH] Optimize development-only shaders and rendering code to compile it out in Release game builds --- .../MaterialTemplates/Deformable.shader | 1 + .../Editor/MaterialTemplates/Particle.shader | 1 + .../Editor/MaterialTemplates/Surface.shader | 1 + .../Editor/MaterialTemplates/Terrain.shader | 1 + Flax.flaxproj | 2 +- Source/Editor/Cooker/Steps/CookAssetsStep.cpp | 7 ++++ Source/Editor/Cooker/Steps/CookAssetsStep.h | 1 + Source/Editor/Cooker/Steps/DeployDataStep.cpp | 7 ++++ Source/Editor/Windows/OutputLogWindow.cs | 2 + Source/Engine/Graphics/Config.h | 3 ++ Source/Engine/Graphics/Enums.h | 10 +++++ Source/Engine/Graphics/GPUDevice.cpp | 6 ++- Source/Engine/Graphics/GPUPipelineState.h | 2 +- .../Materials/DeferredMaterialShader.cpp | 4 +- .../Materials/DeferredMaterialShader.h | 6 +-- .../Materials/DeformableMaterialShader.cpp | 10 ++--- .../Materials/DeformableMaterialShader.h | 6 +-- .../Materials/ForwardMaterialShader.cpp | 4 +- .../Materials/ForwardMaterialShader.h | 8 +++- .../Graphics/Materials/MaterialShader.cpp | 13 +++++- .../Graphics/Materials/MaterialShader.h | 10 ++--- .../Materials/MaterialShaderFeatures.cpp | 2 +- .../Materials/ParticleMaterialShader.cpp | 4 +- .../Materials/ParticleMaterialShader.h | 6 +-- .../Materials/TerrainMaterialShader.cpp | 4 +- .../Materials/TerrainMaterialShader.h | 6 +-- Source/Engine/Graphics/Models/Mesh.cpp | 8 ++-- Source/Engine/Graphics/Models/MeshBase.h | 4 +- .../Shaders/Cache/ShaderAssetBase.cpp | 1 + Source/Engine/Level/Actors/StaticModel.cpp | 4 +- Source/Engine/Renderer/Editor/LODPreview.cpp | 5 ++- Source/Engine/Renderer/Editor/LODPreview.h | 4 +- .../Renderer/Editor/LightmapUVsDensity.cpp | 5 ++- .../Renderer/Editor/LightmapUVsDensity.h | 4 +- .../Renderer/Editor/MaterialComplexity.cpp | 5 ++- .../Renderer/Editor/MaterialComplexity.h | 4 +- .../Renderer/Editor/QuadOverdrawPass.cpp | 5 ++- .../Engine/Renderer/Editor/QuadOverdrawPass.h | 4 +- .../Engine/Renderer/Editor/VertexColors.cpp | 5 ++- Source/Engine/Renderer/Editor/VertexColors.h | 4 +- Source/Engine/Renderer/GBufferPass.cpp | 12 +++--- Source/Engine/Renderer/GBufferPass.h | 4 +- .../GI/DynamicDiffuseGlobalIllumination.cpp | 4 +- .../GI/DynamicDiffuseGlobalIllumination.h | 2 +- .../Renderer/GI/GlobalSurfaceAtlasPass.cpp | 10 +++++ .../Renderer/GI/GlobalSurfaceAtlasPass.h | 4 ++ .../Renderer/GlobalSignDistanceFieldPass.cpp | 42 +++++++++---------- .../Renderer/GlobalSignDistanceFieldPass.h | 4 ++ Source/Engine/Renderer/LightPass.cpp | 4 ++ Source/Engine/Renderer/LightPass.h | 4 ++ Source/Engine/Renderer/Lightmaps.h | 2 + Source/Engine/Renderer/MotionBlurPass.cpp | 10 +++++ Source/Engine/Renderer/MotionBlurPass.h | 6 +++ Source/Engine/Renderer/Renderer.cpp | 34 ++++++++------- Source/Engine/ShadersCompilation/Config.h | 5 +++ .../Parser/ShaderFunctionReader.h | 11 +++-- .../Parser/ShaderProcessing.Parse.cpp | 2 +- .../Parser/ShaderProcessing.cpp | 8 ++-- .../Parser/ShaderProcessing.h | 5 ++- .../ShadersCompilation/ShadersCompilation.cpp | 5 ++- Source/Shaders/GI/GlobalSurfaceAtlas.shader | 1 + Source/Shaders/GlobalSignDistanceField.shader | 2 + Source/Shaders/Lights.shader | 2 + Source/Shaders/MotionBlur.shader | 1 + 64 files changed, 252 insertions(+), 121 deletions(-) diff --git a/Content/Editor/MaterialTemplates/Deformable.shader b/Content/Editor/MaterialTemplates/Deformable.shader index 86a9200f3..cd11eb179 100644 --- a/Content/Editor/MaterialTemplates/Deformable.shader +++ b/Content/Editor/MaterialTemplates/Deformable.shader @@ -387,6 +387,7 @@ void PS_Depth(PixelInput input) // Pixel Shader function for Quad Overdraw Pass (editor-only) [earlydepthstencil] META_PS(USE_EDITOR, FEATURE_LEVEL_SM5) +META_FLAG(DevelopmentOnly) void PS_QuadOverdraw(float4 svPos : SV_Position, uint primId : SV_PrimitiveID) { DoQuadOverdraw(svPos, primId); diff --git a/Content/Editor/MaterialTemplates/Particle.shader b/Content/Editor/MaterialTemplates/Particle.shader index 76a09e788..0405ebf1a 100644 --- a/Content/Editor/MaterialTemplates/Particle.shader +++ b/Content/Editor/MaterialTemplates/Particle.shader @@ -690,6 +690,7 @@ void PS_Depth(PixelInput input) // Pixel Shader function for Quad Overdraw Pass (editor-only) [earlydepthstencil] META_PS(USE_EDITOR, FEATURE_LEVEL_SM5) +META_FLAG(DevelopmentOnly) void PS_QuadOverdraw(float4 svPos : SV_Position, uint primId : SV_PrimitiveID) { DoQuadOverdraw(svPos, primId); diff --git a/Content/Editor/MaterialTemplates/Surface.shader b/Content/Editor/MaterialTemplates/Surface.shader index ee4a5cada..7df7bc9e9 100644 --- a/Content/Editor/MaterialTemplates/Surface.shader +++ b/Content/Editor/MaterialTemplates/Surface.shader @@ -594,6 +594,7 @@ void PS_Depth(PixelInput input) // Pixel Shader function for Quad Overdraw Pass (editor-only) [earlydepthstencil] META_PS(USE_EDITOR, FEATURE_LEVEL_SM5) +META_FLAG(DevelopmentOnly) void PS_QuadOverdraw(float4 svPos : SV_Position, uint primId : SV_PrimitiveID) { DoQuadOverdraw(svPos, primId); diff --git a/Content/Editor/MaterialTemplates/Terrain.shader b/Content/Editor/MaterialTemplates/Terrain.shader index b897335f9..2876bf2b9 100644 --- a/Content/Editor/MaterialTemplates/Terrain.shader +++ b/Content/Editor/MaterialTemplates/Terrain.shader @@ -471,6 +471,7 @@ void PS_Depth(PixelInput input) // Pixel Shader function for Quad Overdraw Pass (editor-only) [earlydepthstencil] META_PS(USE_EDITOR, FEATURE_LEVEL_SM5) +META_FLAG(DevelopmentOnly) void PS_QuadOverdraw(float4 svPos : SV_Position, uint primId : SV_PrimitiveID) { DoQuadOverdraw(svPos, primId); diff --git a/Flax.flaxproj b/Flax.flaxproj index d128ab6e1..65aad0f7f 100644 --- a/Flax.flaxproj +++ b/Flax.flaxproj @@ -4,7 +4,7 @@ "Major": 1, "Minor": 13, "Revision": 0, - "Build": 7006 + "Build": 7007 }, "Company": "Flax", "Copyright": "Copyright (c) 2012-2026 Wojciech Figat. All rights reserved.", diff --git a/Source/Editor/Cooker/Steps/CookAssetsStep.cpp b/Source/Editor/Cooker/Steps/CookAssetsStep.cpp index 6e3e7501e..2c584ce46 100644 --- a/Source/Editor/Cooker/Steps/CookAssetsStep.cpp +++ b/Source/Editor/Cooker/Steps/CookAssetsStep.cpp @@ -242,6 +242,11 @@ void CookAssetsStep::CacheData::Load(CookingData& data) LOG(Info, "{0} option has been modified.", TEXT("ShadersReverseZ")); invalidateShaders = true; } + if ((data.Configuration != BuildConfiguration::Release) != Settings.Global.ShadersDevelopment) + { + LOG(Info, "{0} option has been modified.", TEXT("ShadersDevelopment")); + invalidateShaders = true; + } #if PLATFORM_TOOLS_WINDOWS if (data.Platform == BuildPlatform::Windows32 || data.Platform == BuildPlatform::Windows64) { @@ -432,6 +437,7 @@ bool ProcessShaderBase(CookAssetsStep::AssetCookData& data, ShaderAssetBase* ass options.NoOptimize = data.Cache.Settings.Global.ShadersNoOptimize; options.GenerateDebugData = data.Cache.Settings.Global.ShadersGenerateDebugData; options.TreatWarningsAsErrors = false; + options.DevelopmentShaders = data.Cache.Settings.Global.ShadersDevelopment; options.Output = &cacheStream; options.Platform = data.Data.Tools->GetPlatform(); Array includes; @@ -1086,6 +1092,7 @@ bool CookAssetsStep::Perform(CookingData& data) cache.Settings.Global.ShadersNoOptimize = buildSettings->ShadersNoOptimize; cache.Settings.Global.ShadersGenerateDebugData = buildSettings->ShadersGenerateDebugData; cache.Settings.Global.ShadersReverseZ = REVERSE_Z; + cache.Settings.Global.ShadersDevelopment = data.Configuration != BuildConfiguration::Release; cache.Settings.Global.StreamingSettingsAssetId = gameSettings->Streaming; cache.Settings.Global.ShadersVersion = GPU_SHADER_CACHE_VERSION; cache.Settings.Global.MaterialGraphVersion = MATERIAL_GRAPH_VERSION; diff --git a/Source/Editor/Cooker/Steps/CookAssetsStep.h b/Source/Editor/Cooker/Steps/CookAssetsStep.h index 612b363dd..02351bada 100644 --- a/Source/Editor/Cooker/Steps/CookAssetsStep.h +++ b/Source/Editor/Cooker/Steps/CookAssetsStep.h @@ -98,6 +98,7 @@ public: bool ShadersNoOptimize; bool ShadersGenerateDebugData; bool ShadersReverseZ; + bool ShadersDevelopment; Guid StreamingSettingsAssetId; int32 ShadersVersion; int32 MaterialGraphVersion; diff --git a/Source/Editor/Cooker/Steps/DeployDataStep.cpp b/Source/Editor/Cooker/Steps/DeployDataStep.cpp index 049ae3e36..7c888000f 100644 --- a/Source/Editor/Cooker/Steps/DeployDataStep.cpp +++ b/Source/Editor/Cooker/Steps/DeployDataStep.cpp @@ -417,6 +417,13 @@ bool DeployDataStep::Perform(CookingData& data) data.AddRootEngineAsset(TEXT("Shaders/SSR")); data.AddRootEngineAsset(TEXT("Shaders/SDF")); data.AddRootEngineAsset(TEXT("Shaders/VolumetricFog")); + if (data.Configuration != BuildConfiguration::Release) + { + data.AddRootEngineAsset(TEXT("Shaders/Editor/LightmapUVsDensity")); + data.AddRootEngineAsset(TEXT("Shaders/Editor/MaterialComplexity")); + data.AddRootEngineAsset(TEXT("Shaders/Editor/QuadOverdraw")); + data.AddRootEngineAsset(TEXT("Shaders/Editor/VertexColors")); + } data.AddRootEngineAsset(TEXT("Engine/DefaultMaterial")); data.AddRootEngineAsset(TEXT("Engine/DefaultDeformableMaterial")); data.AddRootEngineAsset(TEXT("Engine/DefaultTerrainMaterial")); diff --git a/Source/Editor/Windows/OutputLogWindow.cs b/Source/Editor/Windows/OutputLogWindow.cs index 1478a9ac9..77c393bde 100644 --- a/Source/Editor/Windows/OutputLogWindow.cs +++ b/Source/Editor/Windows/OutputLogWindow.cs @@ -177,6 +177,8 @@ namespace FlaxEditor.Windows { // Focus back the input field as user want to modify command from history Owner.HideHistory(); + if (Owner == null) + return true; Owner.HideSearch(); Owner.RootWindow.Focus(); Owner.Focus(); diff --git a/Source/Engine/Graphics/Config.h b/Source/Engine/Graphics/Config.h index 0d5f53f13..feab4c9ce 100644 --- a/Source/Engine/Graphics/Config.h +++ b/Source/Engine/Graphics/Config.h @@ -91,6 +91,9 @@ // True if use debug tools and flow for shaders #define GPU_ENABLE_SHADERS_DEBUG_LAYER (BUILD_DEBUG) +// True if use development features for graphics (eg. debug view shaders) +#define GPU_ENABLE_DEVELOPMENT (!BUILD_RELEASE || USE_EDITOR) + // Maximum size of the texture that is supported by the engine (specific platforms can have lower limit) #define GPU_MAX_TEXTURE_SIZE 16384 #define GPU_MAX_TEXTURE_MIP_LEVELS 15 diff --git a/Source/Engine/Graphics/Enums.h b/Source/Engine/Graphics/Enums.h index d25414f9f..1ff21b411 100644 --- a/Source/Engine/Graphics/Enums.h +++ b/Source/Engine/Graphics/Enums.h @@ -172,6 +172,11 @@ API_ENUM() enum class ShaderProfileFeatures /// TessellationShaders = 4, + /// + /// Development-only shaders are supported. Enabled in Editor or non-Release builds. + /// + DevelopmentShaders = 8, + API_ENUM(Attributes = "HideInEditor") MAX }; @@ -1250,6 +1255,11 @@ enum class ShaderFlags : uint32 /// Indicates that vertex shader function outputs data for the geometry shader. /// VertexToGeometryShader = 4, + + /// + /// Marks shader as used only in development builds: non-release or in editor. Shader won't be compiled for final game release build. + /// + DevelopmentOnly = 8, }; DECLARE_ENUM_OPERATORS(ShaderFlags); diff --git a/Source/Engine/Graphics/GPUDevice.cpp b/Source/Engine/Graphics/GPUDevice.cpp index ca9f4c8e4..1e79d5a58 100644 --- a/Source/Engine/Graphics/GPUDevice.cpp +++ b/Source/Engine/Graphics/GPUDevice.cpp @@ -107,6 +107,10 @@ void GPUPipelineState::GetDebugName(DebugName& name) const bool GPUPipelineState::Init(const Description& desc) { +#if GPU_ENABLE_DEVELOPMENT + CHECK_RETURN(desc.VS, true); +#endif + // Cache description in development builds #if !BUILD_RELEASE DebugDesc = desc; @@ -128,7 +132,7 @@ bool GPUPipelineState::Init(const Description& desc) CHECK_STAGE(PS); #undef CHECK_STAGE -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT // Estimate somehow performance cost of this pipeline state for the content profiling const int32 textureLookupCost = 20; const int32 tessCost = 300; diff --git a/Source/Engine/Graphics/GPUPipelineState.h b/Source/Engine/Graphics/GPUPipelineState.h index d02e911a4..f2295d927 100644 --- a/Source/Engine/Graphics/GPUPipelineState.h +++ b/Source/Engine/Graphics/GPUPipelineState.h @@ -186,7 +186,7 @@ public: typedef Array> DebugName; void GetDebugName(DebugName& name) const; #endif -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT int32 Complexity; #endif diff --git a/Source/Engine/Graphics/Materials/DeferredMaterialShader.cpp b/Source/Engine/Graphics/Materials/DeferredMaterialShader.cpp index 67a3159f7..e7ac1fbdb 100644 --- a/Source/Engine/Graphics/Materials/DeferredMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/DeferredMaterialShader.cpp @@ -87,7 +87,7 @@ void DeferredMaterialShader::Bind(BindParameters& params) const auto cache = params.Instanced ? &_cacheInstanced : &_cache; PipelineStateCache* psCache = cache->GetPS(view.Pass, useLightmap, useSkinning, usePerBoneMotionBlur); ASSERT(psCache); - GPUPipelineState* state = psCache->GetPS(cullMode, wireframe); + GPUPipelineState* state = psCache->GetPS(this, cullMode, wireframe); // Bind pipeline context->SetState(state); @@ -165,7 +165,7 @@ bool DeferredMaterialShader::Load() psDesc.StencilEnable = false; psDesc.StencilPassOp = StencilOperation::Keep; -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT if (_shader->HasShader("PS_QuadOverdraw")) { // Quad Overdraw diff --git a/Source/Engine/Graphics/Materials/DeferredMaterialShader.h b/Source/Engine/Graphics/Materials/DeferredMaterialShader.h index 8d5dde16f..182fc1939 100644 --- a/Source/Engine/Graphics/Materials/DeferredMaterialShader.h +++ b/Source/Engine/Graphics/Materials/DeferredMaterialShader.h @@ -20,7 +20,7 @@ private: PipelineStateCache MotionVectors; PipelineStateCache MotionVectorsSkinned; PipelineStateCache MotionVectorsSkinnedPerBone; -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT PipelineStateCache QuadOverdraw; PipelineStateCache QuadOverdrawSkinned; #endif @@ -37,7 +37,7 @@ private: return useLightmap ? &DefaultLightmap : (useSkinning ? &DefaultSkinned : &Default); case DrawPass::MotionVectors: return useSkinning ? (perBoneMotionBlur ? &MotionVectorsSkinnedPerBone : &MotionVectorsSkinned) : &MotionVectors; -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT case DrawPass::QuadOverdraw: return useSkinning ? &QuadOverdrawSkinned : &QuadOverdraw; #endif @@ -55,7 +55,7 @@ private: DepthSkinned.Release(); MotionVectors.Release(); MotionVectorsSkinned.Release(); -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT QuadOverdraw.Release(); QuadOverdrawSkinned.Release(); #endif diff --git a/Source/Engine/Graphics/Materials/DeformableMaterialShader.cpp b/Source/Engine/Graphics/Materials/DeformableMaterialShader.cpp index de19f51f0..c5e9435af 100644 --- a/Source/Engine/Graphics/Materials/DeformableMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/DeformableMaterialShader.cpp @@ -91,7 +91,7 @@ void DeformableMaterialShader::Bind(BindParameters& params) } PipelineStateCache* psCache = _cache.GetPS(view.Pass); ASSERT(psCache); - GPUPipelineState* state = psCache->GetPS(cullMode, wireframe); + GPUPipelineState* state = psCache->GetPS(this, cullMode, wireframe); // Bind pipeline context->SetState(state); @@ -123,7 +123,7 @@ bool DeformableMaterialShader::Load() } #endif -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT if (_shader->HasShader("PS_QuadOverdraw")) { // Quad Overdraw @@ -178,11 +178,7 @@ bool DeformableMaterialShader::Load() psDesc.DepthClipEnable = false; psDesc.DepthWriteEnable = true; psDesc.DepthEnable = true; -#if REVERSE_Z - psDesc.DepthFunc = ComparisonFunc::Greater; -#else - psDesc.DepthFunc = ComparisonFunc::Less; -#endif + psDesc.DepthFunc = ComparisonFunc::Default; psDesc.HS = nullptr; psDesc.DS = nullptr; _cache.Depth.Init(psDesc); diff --git a/Source/Engine/Graphics/Materials/DeformableMaterialShader.h b/Source/Engine/Graphics/Materials/DeformableMaterialShader.h index 45651c090..a1e2725e3 100644 --- a/Source/Engine/Graphics/Materials/DeformableMaterialShader.h +++ b/Source/Engine/Graphics/Materials/DeformableMaterialShader.h @@ -14,7 +14,7 @@ private: { PipelineStateCache Default; PipelineStateCache Depth; -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT PipelineStateCache QuadOverdraw; #endif @@ -29,7 +29,7 @@ private: case DrawPass::GlobalSurfaceAtlas: case DrawPass::Forward: return &Default; -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT case DrawPass::QuadOverdraw: return &QuadOverdraw; #endif @@ -42,7 +42,7 @@ private: { Default.Release(); Depth.Release(); -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT QuadOverdraw.Release(); #endif } diff --git a/Source/Engine/Graphics/Materials/ForwardMaterialShader.cpp b/Source/Engine/Graphics/Materials/ForwardMaterialShader.cpp index 523c8c859..4e3102d9f 100644 --- a/Source/Engine/Graphics/Materials/ForwardMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/ForwardMaterialShader.cpp @@ -87,7 +87,7 @@ void ForwardMaterialShader::Bind(BindParameters& params) const auto cacheObj = params.Instanced ? &_cacheInstanced : &_cache; PipelineStateCache* psCache = cacheObj->GetPS(view.Pass, useSkinning); ASSERT(psCache); - GPUPipelineState* state = psCache->GetPS(cullMode, wireframe); + GPUPipelineState* state = psCache->GetPS(this, cullMode, wireframe); // Bind pipeline context->SetState(state); @@ -120,7 +120,7 @@ bool ForwardMaterialShader::Load() } #endif -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT if (_shader->HasShader("PS_QuadOverdraw")) { // Quad Overdraw diff --git a/Source/Engine/Graphics/Materials/ForwardMaterialShader.h b/Source/Engine/Graphics/Materials/ForwardMaterialShader.h index 353b36fc6..15e49e1af 100644 --- a/Source/Engine/Graphics/Materials/ForwardMaterialShader.h +++ b/Source/Engine/Graphics/Materials/ForwardMaterialShader.h @@ -18,7 +18,7 @@ private: PipelineStateCache DepthSkinned; PipelineStateCache Distortion; PipelineStateCache DistortionSkinned; -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT PipelineStateCache QuadOverdraw; PipelineStateCache QuadOverdrawSkinned; #endif @@ -33,7 +33,7 @@ private: return useSkinning ? &DistortionSkinned : &Distortion; case DrawPass::Forward: return useSkinning ? &DefaultSkinned : &Default; -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT case DrawPass::QuadOverdraw: return useSkinning ? &QuadOverdrawSkinned : &QuadOverdraw; #endif @@ -50,6 +50,10 @@ private: DepthSkinned.Release(); Distortion.Release(); DistortionSkinned.Release(); +#if GPU_ENABLE_DEVELOPMENT + QuadOverdraw.Release(); + QuadOverdrawSkinned.Release(); +#endif } }; diff --git a/Source/Engine/Graphics/Materials/MaterialShader.cpp b/Source/Engine/Graphics/Materials/MaterialShader.cpp index 7a39cd991..9391ec8b3 100644 --- a/Source/Engine/Graphics/Materials/MaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/MaterialShader.cpp @@ -117,12 +117,21 @@ void IMaterial::BindParameters::BindDrawData() GPUContext->BindCB(2, PerDrawConstants); } -GPUPipelineState* MaterialShader::PipelineStateCache::InitPS(CullMode mode, bool wireframe) +GPUPipelineState* MaterialShader::PipelineStateCache::InitPS(const MaterialShader* owner, CullMode mode, bool wireframe) { Desc.CullMode = mode; Desc.Wireframe = wireframe; auto ps = GPUDevice::Instance->CreatePipelineState(); - ps->Init(Desc); + if (ps->Init(Desc)) + { +#if GPU_ENABLE_RESOURCE_NAMING + LOG(Error, "Failed to initialize PSO for material '{}'", owner->GetShader()->GetName()); +#else + LOG(Error, "Failed to initialize PSO"); +#endif + SAFE_DELETE_GPU_RESOURCE(ps); + return nullptr; + } return ps; } diff --git a/Source/Engine/Graphics/Materials/MaterialShader.h b/Source/Engine/Graphics/Materials/MaterialShader.h index 5f78be257..fc3e6cd6c 100644 --- a/Source/Engine/Graphics/Materials/MaterialShader.h +++ b/Source/Engine/Graphics/Materials/MaterialShader.h @@ -36,24 +36,24 @@ protected: PipelineStateCache() { - Platform::MemoryClear(PS, sizeof(PS)); + Platform::MemoryClear(this, sizeof(*this)); } - void Init(GPUPipelineState::Description& desc) + void Init(const GPUPipelineState::Description& desc) { Desc = desc; } - GPUPipelineState* GetPS(CullMode mode, bool wireframe) + GPUPipelineState* GetPS(const MaterialShader* owner, CullMode mode, bool wireframe) { const int32 index = static_cast(mode) + (wireframe ? 3 : 0); auto ps = PS[index]; if (!ps) - PS[index] = ps = InitPS(mode, wireframe); + PS[index] = ps = InitPS(owner, mode, wireframe); return ps; } - GPUPipelineState* InitPS(CullMode mode, bool wireframe); + GPUPipelineState* InitPS(const MaterialShader* owner, CullMode mode, bool wireframe); void Release() { diff --git a/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp b/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp index 94b048d49..85e823360 100644 --- a/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp +++ b/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp @@ -125,7 +125,7 @@ bool LightmapFeature::Bind(MaterialShader::BindParameters& params, Span& c auto& drawCall = *params.DrawCall; const bool useLightmap = EnumHasAnyFlags(params.RenderContext.View.Flags, ViewFlags::GI) -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT && EnableLightmapsUsage #endif && drawCall.Surface.Lightmap != nullptr; diff --git a/Source/Engine/Graphics/Materials/ParticleMaterialShader.cpp b/Source/Engine/Graphics/Materials/ParticleMaterialShader.cpp index b0ad6217c..e8d187ae1 100644 --- a/Source/Engine/Graphics/Materials/ParticleMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/ParticleMaterialShader.cpp @@ -160,7 +160,7 @@ void ParticleMaterialShader::Bind(BindParameters& params) } } ASSERT(psCache); - GPUPipelineState* state = psCache->GetPS(cullMode, wireframe); + GPUPipelineState* state = psCache->GetPS(this, cullMode, wireframe); // Bind constants if (_cb) @@ -195,7 +195,7 @@ bool ParticleMaterialShader::Load() auto vsMesh = _shader->GetVS("VS_Model"); auto vsRibbon = _shader->GetVS("VS_Ribbon"); -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT if (_shader->HasShader("PS_QuadOverdraw")) { // Quad Overdraw diff --git a/Source/Engine/Graphics/Materials/ParticleMaterialShader.h b/Source/Engine/Graphics/Materials/ParticleMaterialShader.h index 6c660ad83..ab0e6efc9 100644 --- a/Source/Engine/Graphics/Materials/ParticleMaterialShader.h +++ b/Source/Engine/Graphics/Materials/ParticleMaterialShader.h @@ -15,7 +15,7 @@ private: PipelineStateCache Default; PipelineStateCache Depth; PipelineStateCache Distortion; -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT PipelineStateCache QuadOverdraw; #endif @@ -29,7 +29,7 @@ private: return &Distortion; case DrawPass::Forward: return &Default; -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT case DrawPass::QuadOverdraw: return &QuadOverdraw; #endif @@ -43,7 +43,7 @@ private: Default.Release(); Depth.Release(); Distortion.Release(); -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT QuadOverdraw.Release(); #endif } diff --git a/Source/Engine/Graphics/Materials/TerrainMaterialShader.cpp b/Source/Engine/Graphics/Materials/TerrainMaterialShader.cpp index b9a1189d9..12a960c9c 100644 --- a/Source/Engine/Graphics/Materials/TerrainMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/TerrainMaterialShader.cpp @@ -115,7 +115,7 @@ void TerrainMaterialShader::Bind(BindParameters& params) } const PipelineStateCache* psCache = _cache.GetPS(view.Pass, useLightmap); ASSERT(psCache); - GPUPipelineState* state = ((PipelineStateCache*)psCache)->GetPS(cullMode, wireframe); + GPUPipelineState* state = ((PipelineStateCache*)psCache)->GetPS(this, cullMode, wireframe); // Bind pipeline context->SetState(state); @@ -174,7 +174,7 @@ bool TerrainMaterialShader::Load() psDesc.PS = _shader->GetPS("PS_GBuffer", 1); _cache.DefaultLightmap.Init(psDesc); -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT if (_shader->HasShader("PS_QuadOverdraw")) { // Quad Overdraw diff --git a/Source/Engine/Graphics/Materials/TerrainMaterialShader.h b/Source/Engine/Graphics/Materials/TerrainMaterialShader.h index 7504c6311..9348bcf06 100644 --- a/Source/Engine/Graphics/Materials/TerrainMaterialShader.h +++ b/Source/Engine/Graphics/Materials/TerrainMaterialShader.h @@ -15,7 +15,7 @@ private: PipelineStateCache Default; PipelineStateCache DefaultLightmap; PipelineStateCache Depth; -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT PipelineStateCache QuadOverdraw; #endif @@ -29,7 +29,7 @@ private: case DrawPass::GBuffer | DrawPass::GlobalSurfaceAtlas: case DrawPass::GlobalSurfaceAtlas: return useLightmap ? &DefaultLightmap : &Default; -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT case DrawPass::QuadOverdraw: return &QuadOverdraw; #endif @@ -43,7 +43,7 @@ private: Default.Release(); DefaultLightmap.Release(); Depth.Release(); -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT QuadOverdraw.Release(); #endif } diff --git a/Source/Engine/Graphics/Models/Mesh.cpp b/Source/Engine/Graphics/Models/Mesh.cpp index 12305e189..0fffd0000 100644 --- a/Source/Engine/Graphics/Models/Mesh.cpp +++ b/Source/Engine/Graphics/Models/Mesh.cpp @@ -15,7 +15,7 @@ #include "Engine/Scripting/ManagedCLR/MCore.h" #include "Engine/Threading/Threading.h" #include "Engine/Profiler/ProfilerMemory.h" -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT #include "Engine/Renderer/GBufferPass.h" #endif @@ -242,7 +242,7 @@ void Mesh::Draw(const RenderContext& renderContext, MaterialBase* material, cons drawCall.Surface.PrevWorld = world; drawCall.PerInstanceRandom = perInstanceRandom; drawCall.StencilValue = stencilValue; -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT const ViewMode viewMode = renderContext.View.Mode; if (viewMode == ViewMode::LightmapUVsDensity || viewMode == ViewMode::LODPreview) GBufferPass::AddIndexBufferToModelLOD(_indexBuffer, &((Model*)_model)->LODs[_lodIndex]); @@ -309,7 +309,7 @@ void Mesh::Draw(const RenderContext& renderContext, const DrawInfo& info, float drawCall.Surface.LODDitherFactor = (byte)(lodDitherFactor * 255); drawCall.PerInstanceRandom = info.PerInstanceRandom; drawCall.StencilValue = info.StencilValue; -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT const ViewMode viewMode = renderContext.View.Mode; if (viewMode == ViewMode::LightmapUVsDensity || viewMode == ViewMode::LODPreview) GBufferPass::AddIndexBufferToModelLOD(_indexBuffer, &((Model*)_model)->LODs[_lodIndex]); @@ -372,7 +372,7 @@ void Mesh::Draw(const RenderContextBatch& renderContextBatch, const DrawInfo& in drawCall.Surface.LODDitherFactor = (byte)(lodDitherFactor * 255); drawCall.PerInstanceRandom = info.PerInstanceRandom; drawCall.StencilValue = info.StencilValue; -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT const ViewMode viewMode = renderContextBatch.GetMainContext().View.Mode; if (viewMode == ViewMode::LightmapUVsDensity || viewMode == ViewMode::LODPreview) GBufferPass::AddIndexBufferToModelLOD(_indexBuffer, &((Model*)_model)->LODs[_lodIndex]); diff --git a/Source/Engine/Graphics/Models/MeshBase.h b/Source/Engine/Graphics/Models/MeshBase.h index dc0430817..f0f261cfa 100644 --- a/Source/Engine/Graphics/Models/MeshBase.h +++ b/Source/Engine/Graphics/Models/MeshBase.h @@ -428,7 +428,7 @@ public: /// int8 SortOrder; -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT float LightmapScale; #endif @@ -437,7 +437,7 @@ public: { Platform::MemoryClear(this, sizeof(DrawInfo)); ForcedLOD = -1; -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT LightmapScale = -1; #endif } diff --git a/Source/Engine/Graphics/Shaders/Cache/ShaderAssetBase.cpp b/Source/Engine/Graphics/Shaders/Cache/ShaderAssetBase.cpp index becaf6cc4..0ff4285ec 100644 --- a/Source/Engine/Graphics/Shaders/Cache/ShaderAssetBase.cpp +++ b/Source/Engine/Graphics/Shaders/Cache/ShaderAssetBase.cpp @@ -252,6 +252,7 @@ bool ShaderAssetBase::LoadShaderCache(ShaderCacheResult& result) options.SourceLength = sourceLength; options.Profile = shaderProfile; options.Output = &cacheStream; + options.DevelopmentShaders = GPU_ENABLE_DEVELOPMENT; if (CommandLine::Options.ShaderDebug.IsTrue()) { options.GenerateDebugData = true; diff --git a/Source/Engine/Level/Actors/StaticModel.cpp b/Source/Engine/Level/Actors/StaticModel.cpp index 501421310..e35239fb0 100644 --- a/Source/Engine/Level/Actors/StaticModel.cpp +++ b/Source/Engine/Level/Actors/StaticModel.cpp @@ -402,7 +402,7 @@ void StaticModel::Draw(RenderContext& renderContext) draw.SortOrder = _sortOrder; draw.VertexColors = _vertexColorsCount ? _vertexColorsBuffer : nullptr; draw.SetStencilValue(_layer); -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT if (HasStaticFlag(StaticFlags::Lightmap)) draw.LightmapScale = _scaleInLightmap; #endif @@ -439,7 +439,7 @@ void StaticModel::Draw(RenderContextBatch& renderContextBatch) draw.SortOrder = _sortOrder; draw.VertexColors = _vertexColorsCount ? _vertexColorsBuffer : nullptr; draw.SetStencilValue(_layer); -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT if (HasStaticFlag(StaticFlags::Lightmap)) draw.LightmapScale = _scaleInLightmap; #endif diff --git a/Source/Engine/Renderer/Editor/LODPreview.cpp b/Source/Engine/Renderer/Editor/LODPreview.cpp index 9a754f69a..d26210eae 100644 --- a/Source/Engine/Renderer/Editor/LODPreview.cpp +++ b/Source/Engine/Renderer/Editor/LODPreview.cpp @@ -1,8 +1,9 @@ // Copyright (c) Wojciech Figat. All rights reserved. -#if USE_EDITOR - #include "LODPreview.h" + +#if GPU_ENABLE_DEVELOPMENT + #include "Engine/Core/Types/Variant.h" #include "Engine/Content/Content.h" #include "Engine/Content/Assets/Model.h" diff --git a/Source/Engine/Renderer/Editor/LODPreview.h b/Source/Engine/Renderer/Editor/LODPreview.h index 5e2450993..3d4514f40 100644 --- a/Source/Engine/Renderer/Editor/LODPreview.h +++ b/Source/Engine/Renderer/Editor/LODPreview.h @@ -2,7 +2,9 @@ #pragma once -#if USE_EDITOR +#include "Engine/Graphics/Config.h" + +#if GPU_ENABLE_DEVELOPMENT #include "Engine/Content/AssetReference.h" #include "Engine/Content/Assets/Material.h" diff --git a/Source/Engine/Renderer/Editor/LightmapUVsDensity.cpp b/Source/Engine/Renderer/Editor/LightmapUVsDensity.cpp index f30071223..ea68b1520 100644 --- a/Source/Engine/Renderer/Editor/LightmapUVsDensity.cpp +++ b/Source/Engine/Renderer/Editor/LightmapUVsDensity.cpp @@ -1,8 +1,9 @@ // Copyright (c) Wojciech Figat. All rights reserved. -#if USE_EDITOR - #include "LightmapUVsDensity.h" + +#if GPU_ENABLE_DEVELOPMENT + #include "Engine/Content/Content.h" #include "Engine/Content/Assets/Model.h" #include "Engine/Graphics/GPUDevice.h" diff --git a/Source/Engine/Renderer/Editor/LightmapUVsDensity.h b/Source/Engine/Renderer/Editor/LightmapUVsDensity.h index 782062068..8557c43f6 100644 --- a/Source/Engine/Renderer/Editor/LightmapUVsDensity.h +++ b/Source/Engine/Renderer/Editor/LightmapUVsDensity.h @@ -2,7 +2,9 @@ #pragma once -#if USE_EDITOR +#include "Engine/Graphics/Config.h" + +#if GPU_ENABLE_DEVELOPMENT #include "Engine/Content/AssetReference.h" #include "Engine/Content/Assets/Shader.h" diff --git a/Source/Engine/Renderer/Editor/MaterialComplexity.cpp b/Source/Engine/Renderer/Editor/MaterialComplexity.cpp index 1c55e539d..c6834caa7 100644 --- a/Source/Engine/Renderer/Editor/MaterialComplexity.cpp +++ b/Source/Engine/Renderer/Editor/MaterialComplexity.cpp @@ -1,8 +1,9 @@ // Copyright (c) Wojciech Figat. All rights reserved. -#if USE_EDITOR - #include "MaterialComplexity.h" + +#if GPU_ENABLE_DEVELOPMENT + #include "Engine/Core/Types/Variant.h" #include "Engine/Content/Content.h" #include "Engine/Content/Assets/Model.h" diff --git a/Source/Engine/Renderer/Editor/MaterialComplexity.h b/Source/Engine/Renderer/Editor/MaterialComplexity.h index 7072620bc..00bfad65c 100644 --- a/Source/Engine/Renderer/Editor/MaterialComplexity.h +++ b/Source/Engine/Renderer/Editor/MaterialComplexity.h @@ -2,7 +2,9 @@ #pragma once -#if USE_EDITOR +#include "Engine/Graphics/Config.h" + +#if GPU_ENABLE_DEVELOPMENT #include "Engine/Content/AssetReference.h" #include "Engine/Content/Assets/Material.h" diff --git a/Source/Engine/Renderer/Editor/QuadOverdrawPass.cpp b/Source/Engine/Renderer/Editor/QuadOverdrawPass.cpp index fcee51364..da1480128 100644 --- a/Source/Engine/Renderer/Editor/QuadOverdrawPass.cpp +++ b/Source/Engine/Renderer/Editor/QuadOverdrawPass.cpp @@ -1,8 +1,9 @@ // Copyright (c) Wojciech Figat. All rights reserved. -#if USE_EDITOR - #include "QuadOverdrawPass.h" + +#if GPU_ENABLE_DEVELOPMENT + #include "Engine/Engine/Time.h" #include "Engine/Content/Content.h" #include "Engine/Content/Assets/Material.h" diff --git a/Source/Engine/Renderer/Editor/QuadOverdrawPass.h b/Source/Engine/Renderer/Editor/QuadOverdrawPass.h index 73ca42a9c..b4ae48c66 100644 --- a/Source/Engine/Renderer/Editor/QuadOverdrawPass.h +++ b/Source/Engine/Renderer/Editor/QuadOverdrawPass.h @@ -2,7 +2,9 @@ #pragma once -#if USE_EDITOR +#include "Engine/Graphics/Config.h" + +#if GPU_ENABLE_DEVELOPMENT #include "../RendererPass.h" diff --git a/Source/Engine/Renderer/Editor/VertexColors.cpp b/Source/Engine/Renderer/Editor/VertexColors.cpp index d85c0b0f5..f3d7cc39b 100644 --- a/Source/Engine/Renderer/Editor/VertexColors.cpp +++ b/Source/Engine/Renderer/Editor/VertexColors.cpp @@ -1,8 +1,9 @@ // Copyright (c) Wojciech Figat. All rights reserved. -#if USE_EDITOR - #include "VertexColors.h" + +#if GPU_ENABLE_DEVELOPMENT + #include "Engine/Content/Content.h" #include "Engine/Graphics/GPUDevice.h" #include "Engine/Graphics/GPUContext.h" diff --git a/Source/Engine/Renderer/Editor/VertexColors.h b/Source/Engine/Renderer/Editor/VertexColors.h index 8c39b8223..d5c38d9a4 100644 --- a/Source/Engine/Renderer/Editor/VertexColors.h +++ b/Source/Engine/Renderer/Editor/VertexColors.h @@ -2,7 +2,9 @@ #pragma once -#if USE_EDITOR +#include "Engine/Graphics/Config.h" + +#if GPU_ENABLE_DEVELOPMENT #include "Engine/Content/AssetReference.h" #include "Engine/Content/Assets/Shader.h" diff --git a/Source/Engine/Renderer/GBufferPass.cpp b/Source/Engine/Renderer/GBufferPass.cpp index 2cba6aec8..8048331d2 100644 --- a/Source/Engine/Renderer/GBufferPass.cpp +++ b/Source/Engine/Renderer/GBufferPass.cpp @@ -2,7 +2,7 @@ #include "GBufferPass.h" #include "RenderList.h" -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT #include "Engine/Renderer/Editor/VertexColors.h" #include "Engine/Renderer/Editor/LightmapUVsDensity.h" #include "Engine/Renderer/Editor/LODPreview.h" @@ -31,7 +31,7 @@ GPU_CB_STRUCT(GBufferPassData { int32 ViewMode; }); -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT Dictionary GBufferPass::IndexBufferToModelLOD; CriticalSection GBufferPass::Locker; #endif @@ -104,7 +104,7 @@ void GBufferPass::Dispose() _gBufferShader = nullptr; _skyModel = nullptr; _boxModel = nullptr; -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT SAFE_DELETE(_lightmapUVsDensity); SAFE_DELETE(_vertexColors); SAFE_DELETE(_lodPreview); @@ -113,7 +113,7 @@ void GBufferPass::Dispose() #endif } -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT void DebugOverrideDrawCallsMaterial(const RenderContext& renderContext, IMaterial* material) { @@ -193,7 +193,7 @@ void GBufferPass::Fill(RenderContext& renderContext, GPUTexture* lightBuffer) if (checkIfSkipPass()) return; -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT // Special debug drawing if (renderContext.View.Mode == ViewMode::MaterialComplexity) { @@ -371,7 +371,7 @@ GPUTextureView* GBufferPass::RenderSkybox(RenderContext& renderContext, GPUConte return result; } -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT void GBufferPass::PreOverrideDrawCalls(RenderContext& renderContext) { diff --git a/Source/Engine/Renderer/GBufferPass.h b/Source/Engine/Renderer/GBufferPass.h index 893202161..26f6ffdc9 100644 --- a/Source/Engine/Renderer/GBufferPass.h +++ b/Source/Engine/Renderer/GBufferPass.h @@ -19,7 +19,7 @@ private: GPUPipelineState* _psLinearToSrgb = nullptr; AssetReference _skyModel; AssetReference _boxModel; -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT class LightmapUVsDensityMaterialShader* _lightmapUVsDensity = nullptr; class VertexColorsMaterialShader* _vertexColors = nullptr; class LODPreviewMaterialShader* _lodPreview = nullptr; @@ -57,7 +57,7 @@ public: /// Rendered cubemap or null if not ready or failed. GPUTextureView* RenderSkybox(RenderContext& renderContext, GPUContext* context); -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT // Temporary cache for faster debug previews drawing (used only during frame rendering). static Dictionary IndexBufferToModelLOD; static CriticalSection Locker; diff --git a/Source/Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.cpp b/Source/Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.cpp index ebbc92b01..e3afc6642 100644 --- a/Source/Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.cpp +++ b/Source/Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.cpp @@ -313,7 +313,7 @@ void DynamicDiffuseGlobalIlluminationPass::Dispose() _shader = nullptr; SAFE_DELETE_GPU_RESOURCE(_psIndirectLighting[0]); SAFE_DELETE_GPU_RESOURCE(_psIndirectLighting[1]); -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT _debugModel = nullptr; _debugMaterial = nullptr; #endif @@ -833,7 +833,7 @@ bool DynamicDiffuseGlobalIlluminationPass::Render(RenderContext& renderContext, context->DrawFullscreenTriangle(); } -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT // Probes debug drawing if (renderContext.View.Mode == ViewMode::GlobalIllumination && lightBuffer) { diff --git a/Source/Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.h b/Source/Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.h index 04a475010..4c502351e 100644 --- a/Source/Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.h +++ b/Source/Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.h @@ -49,7 +49,7 @@ private: GPUShaderProgramCS* _csUpdateProbesIrradiance; GPUShaderProgramCS* _csUpdateProbesDistance; GPUPipelineState* _psIndirectLighting[2] = {}; -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT AssetReference _debugModel; AssetReference _debugMaterial; #endif diff --git a/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp b/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp index 40194ce91..8feedd9cd 100644 --- a/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp +++ b/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp @@ -804,6 +804,7 @@ bool GlobalSurfaceAtlasPass::setupResources() // Create pipeline state GPUPipelineState::Description psDesc = GPUPipelineState::Description::DefaultFullscreenTriangle; +#if GPU_ENABLE_DEVELOPMENT if (!_psDebug0) { _psDebug0 = device->CreatePipelineState(); @@ -815,6 +816,7 @@ bool GlobalSurfaceAtlasPass::setupResources() if (_psDebug1->Init(psDesc)) return true; } +#endif psDesc.DepthEnable = true; psDesc.DepthWriteEnable = true; psDesc.DepthFunc = ComparisonFunc::Always; @@ -874,8 +876,10 @@ void GlobalSurfaceAtlasPass::OnShaderReloading(Asset* obj) SAFE_DELETE_GPU_RESOURCE(_psDirectLighting0); SAFE_DELETE_GPU_RESOURCE(_psDirectLighting1); SAFE_DELETE_GPU_RESOURCE(_psIndirectLighting); +#if GPU_ENABLE_DEVELOPMENT SAFE_DELETE_GPU_RESOURCE(_psDebug0); SAFE_DELETE_GPU_RESOURCE(_psDebug1); +#endif invalidateResources(); } @@ -894,8 +898,10 @@ void GlobalSurfaceAtlasPass::Dispose() SAFE_DELETE_GPU_RESOURCE(_psDirectLighting0); SAFE_DELETE_GPU_RESOURCE(_psDirectLighting1); SAFE_DELETE_GPU_RESOURCE(_psIndirectLighting); +#if GPU_ENABLE_DEVELOPMENT SAFE_DELETE_GPU_RESOURCE(_psDebug0); SAFE_DELETE_GPU_RESOURCE(_psDebug1); +#endif _cb0 = nullptr; _shader = nullptr; } @@ -1711,6 +1717,8 @@ bool GlobalSurfaceAtlasPass::Render(RenderContext& renderContext, GPUContext* co return notReady; } +#if GPU_ENABLE_DEVELOPMENT + void GlobalSurfaceAtlasPass::RenderDebug(RenderContext& renderContext, GPUContext* context, GPUTexture* output) { // Render all dependant effects before @@ -1807,6 +1815,8 @@ void GlobalSurfaceAtlasPass::RenderDebug(RenderContext& renderContext, GPUContex } } +#endif + void GlobalSurfaceAtlasPass::GetCullingData(Vector4& cullingPosDistance) const { cullingPosDistance = _surfaceAtlasData->CullingPosDistance; diff --git a/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.h b/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.h index 9a4db2b07..cce2e92c8 100644 --- a/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.h +++ b/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.h @@ -49,8 +49,10 @@ private: GPUPipelineState* _psDirectLighting0 = nullptr; GPUPipelineState* _psDirectLighting1 = nullptr; GPUPipelineState* _psIndirectLighting = nullptr; +#if GPU_ENABLE_DEVELOPMENT GPUPipelineState* _psDebug0 = nullptr; GPUPipelineState* _psDebug1 = nullptr; +#endif GPUConstantBuffer* _cb0 = nullptr; GPUShaderProgramCS* _csCullObjects; @@ -85,6 +87,7 @@ public: /// True if failed to render (platform doesn't support it, out of video memory, disabled feature or effect is not ready), otherwise false. bool Render(RenderContext& renderContext, GPUContext* context, BindingData& result); +#if GPU_ENABLE_DEVELOPMENT /// /// Renders the debug view. /// @@ -92,6 +95,7 @@ public: /// The GPU context. /// The output buffer. void RenderDebug(RenderContext& renderContext, GPUContext* context, GPUTexture* output); +#endif // Gets the culling view position (xyz) and view distance (w) void GetCullingData(Vector4& cullingPosDistance) const; diff --git a/Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp b/Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp index b015b2c74..913b176d1 100644 --- a/Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp +++ b/Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp @@ -704,8 +704,6 @@ bool GlobalSignDistanceFieldPass::setupResources() } if (!_shader->IsLoaded()) return true; - - const auto device = GPUDevice::Instance; const auto shader = _shader->GPU; // Check shader @@ -723,25 +721,6 @@ bool GlobalSignDistanceFieldPass::setupResources() if (!_objectsBuffer) _objectsBuffer = New(0, (uint32)sizeof(ObjectRasterizeData), false, TEXT("GlobalSDF.ObjectsBuffer")); - // Create pipeline state - // TODO: don't compile those shaders in Release builds (and skip PSOs) - GPUPipelineState::Description psDesc = GPUPipelineState::Description::DefaultFullscreenTriangle; - if (!_psDebug) - { - _psDebug = device->CreatePipelineState(); - psDesc.PS = shader->GetPS("PS_Debug"); - if (_psDebug->Init(psDesc)) - return true; - } - if (!_psOverdraw) - { - _psOverdraw = device->CreatePipelineState(); - psDesc.PS = shader->GetPS("PS_Overdraw"); - psDesc.BlendMode = BlendingMode::AlphaBlend; - if (_psOverdraw->Init(psDesc)) - return true; - } - return false; } @@ -749,8 +728,10 @@ bool GlobalSignDistanceFieldPass::setupResources() void GlobalSignDistanceFieldPass::OnShaderReloading(Asset* obj) { +#if GPU_ENABLE_DEVELOPMENT SAFE_DELETE_GPU_RESOURCE(_psDebug); SAFE_DELETE_GPU_RESOURCE(_psOverdraw); +#endif _csRasterizeModel0 = nullptr; _csRasterizeModel1 = nullptr; _csRasterizeHeightfield = nullptr; @@ -769,7 +750,10 @@ void GlobalSignDistanceFieldPass::Dispose() // Cleanup SAFE_DELETE(_objectsBuffer); +#if GPU_ENABLE_DEVELOPMENT SAFE_DELETE_GPU_RESOURCE(_psDebug); + SAFE_DELETE_GPU_RESOURCE(_psOverdraw); +#endif _shader = nullptr; } @@ -1178,6 +1162,8 @@ bool GlobalSignDistanceFieldPass::Render(RenderContext& renderContext, GPUContex return false; } +#if GPU_ENABLE_DEVELOPMENT + void GlobalSignDistanceFieldPass::RenderDebug(RenderContext& renderContext, GPUContext* context, GPUTexture* output) { BindingData bindingData; @@ -1186,6 +1172,18 @@ void GlobalSignDistanceFieldPass::RenderDebug(RenderContext& renderContext, GPUC context->Draw(output, renderContext.Buffers->GBuffer0); return; } + if (!_psDebug) + { + // Lazy init PSOs + auto psDesc = GPUPipelineState::Description::DefaultFullscreenTriangle; + _psDebug = GPUDevice::Instance->CreatePipelineState(); + psDesc.PS = _shader->GPU->GetPS("PS_Debug"); + _psDebug->Init(psDesc); + _psOverdraw = GPUDevice::Instance->CreatePipelineState(); + psDesc.PS = _shader->GPU->GetPS("PS_Overdraw"); + psDesc.BlendMode = BlendingMode::AlphaBlend; + _psOverdraw->Init(psDesc); + } PROFILE_GPU_CPU("Global SDF Debug"); const Float2 outputSize(output->Size()); @@ -1276,6 +1274,8 @@ void GlobalSignDistanceFieldPass::RenderDebug(RenderContext& renderContext, GPUC } } +#endif + void GlobalSignDistanceFieldPass::GetCullingData(BoundingBox& bounds) const { auto& cascade = *CurrentCascade.Get(); diff --git a/Source/Engine/Renderer/GlobalSignDistanceFieldPass.h b/Source/Engine/Renderer/GlobalSignDistanceFieldPass.h index c2f25dba7..23716c77d 100644 --- a/Source/Engine/Renderer/GlobalSignDistanceFieldPass.h +++ b/Source/Engine/Renderer/GlobalSignDistanceFieldPass.h @@ -33,8 +33,10 @@ public: private: bool _supported = false; AssetReference _shader; +#if GPU_ENABLE_DEVELOPMENT GPUPipelineState* _psDebug = nullptr; GPUPipelineState* _psOverdraw = nullptr; +#endif GPUShaderProgramCS* _csRasterizeModel0 = nullptr; GPUShaderProgramCS* _csRasterizeModel1 = nullptr; GPUShaderProgramCS* _csRasterizeHeightfield = nullptr; @@ -68,6 +70,7 @@ public: /// True if failed to render (platform doesn't support it, out of video memory, disabled feature or effect is not ready), otherwise false. bool Render(RenderContext& renderContext, GPUContext* context, BindingData& result); +#if GPU_ENABLE_DEVELOPMENT /// /// Renders the debug view. /// @@ -75,6 +78,7 @@ public: /// The GPU context. /// The output buffer. void RenderDebug(RenderContext& renderContext, GPUContext* context, GPUTexture* output); +#endif void GetCullingData(BoundingBox& bounds) const; diff --git a/Source/Engine/Renderer/LightPass.cpp b/Source/Engine/Renderer/LightPass.cpp index 94a16a62f..51cb10b42 100644 --- a/Source/Engine/Renderer/LightPass.cpp +++ b/Source/Engine/Renderer/LightPass.cpp @@ -408,6 +408,8 @@ void LightPass::RenderLights(RenderContextBatch& renderContextBatch, GPUTextureV context->ResetCB(); } +#if GPU_ENABLE_DEVELOPMENT + // Config for light complexity #define LIGHT_COMPLEXITY_DIR_COST 0.05f #define LIGHT_COMPLEXITY_LOCAL_COST 0.08f @@ -492,3 +494,5 @@ void LightPass::RenderDebugSphere(RenderContext& renderContext, GPUContext* cont context->SetState(_psLightOverlap[isViewInside]); _sphereModel->LODs[0].Meshes[0].Render(context); } + +#endif diff --git a/Source/Engine/Renderer/LightPass.h b/Source/Engine/Renderer/LightPass.h index 3a2d0d324..a918c7ec4 100644 --- a/Source/Engine/Renderer/LightPass.h +++ b/Source/Engine/Renderer/LightPass.h @@ -40,6 +40,7 @@ public: /// The light accumulation buffer (input and output). void RenderLights(RenderContextBatch& renderContextBatch, GPUTextureView* lightBuffer); +#if GPU_ENABLE_DEVELOPMENT /// /// Renders the debug view. /// @@ -47,6 +48,7 @@ public: /// The GPU context. /// The output buffer. void RenderDebug(RenderContext& renderContext, GPUContext* context, GPUTexture* output); +#endif private: #if COMPILE_WITH_DEV_ENV @@ -65,7 +67,9 @@ private: invalidateResources(); } #endif +#if GPU_ENABLE_DEVELOPMENT void RenderDebugSphere(RenderContext& renderContext, GPUContext* context, const struct RenderLightData& light, float radius) const; +#endif public: // [RendererPass] diff --git a/Source/Engine/Renderer/Lightmaps.h b/Source/Engine/Renderer/Lightmaps.h index f44637ddc..36e41de42 100644 --- a/Source/Engine/Renderer/Lightmaps.h +++ b/Source/Engine/Renderer/Lightmaps.h @@ -10,6 +10,8 @@ // Additional options used in editor for lightmaps baking extern bool IsRunningRadiancePass; extern bool IsBakingLightmaps; +#endif +#if GPU_ENABLE_DEVELOPMENT extern bool EnableLightmapsUsage; #endif diff --git a/Source/Engine/Renderer/MotionBlurPass.cpp b/Source/Engine/Renderer/MotionBlurPass.cpp index 69a26b825..f4b2f9018 100644 --- a/Source/Engine/Renderer/MotionBlurPass.cpp +++ b/Source/Engine/Renderer/MotionBlurPass.cpp @@ -50,7 +50,9 @@ bool MotionBlurPass::Init() { // Create pipeline states _psCameraMotionVectors = GPUDevice::Instance->CreatePipelineState(); +#if GPU_ENABLE_DEVELOPMENT _psMotionVectorsDebug = GPUDevice::Instance->CreatePipelineState(); +#endif _psTileMax = GPUDevice::Instance->CreatePipelineState(); _psTileMaxVariable = GPUDevice::Instance->CreatePipelineState(); _psNeighborMax = GPUDevice::Instance->CreatePipelineState(); @@ -96,12 +98,14 @@ bool MotionBlurPass::setupResources() if (_psCameraMotionVectors->Init(psDesc)) return true; } +#if GPU_ENABLE_DEVELOPMENT if (!_psMotionVectorsDebug->IsValid()) { psDesc.PS = shader->GetPS("PS_MotionVectorsDebug"); if (_psMotionVectorsDebug->Init(psDesc)) return true; } +#endif if (!_psTileMax->IsValid()) { psDesc.PS = shader->GetPS("PS_TileMax"); @@ -137,7 +141,9 @@ void MotionBlurPass::Dispose() // Cleanup SAFE_DELETE_GPU_RESOURCE(_psCameraMotionVectors); +#if GPU_ENABLE_DEVELOPMENT SAFE_DELETE_GPU_RESOURCE(_psMotionVectorsDebug); +#endif SAFE_DELETE_GPU_RESOURCE(_psTileMax); SAFE_DELETE_GPU_RESOURCE(_psTileMaxVariable); SAFE_DELETE_GPU_RESOURCE(_psNeighborMax); @@ -234,6 +240,8 @@ void MotionBlurPass::RenderMotionVectors(RenderContext& renderContext) } } +#if GPU_ENABLE_DEVELOPMENT + void MotionBlurPass::RenderDebug(RenderContext& renderContext, GPUTextureView* frame) { auto outputView = renderContext.Task->GetOutputView(); @@ -275,6 +283,8 @@ void MotionBlurPass::RenderDebug(RenderContext& renderContext, GPUTextureView* f RenderTargetPool::Release(motionObjectsDepth); } +#endif + void MotionBlurPass::Render(RenderContext& renderContext, GPUTexture*& frame, GPUTexture*& tmp) { const bool isCameraCut = renderContext.Task->IsCameraCut; diff --git a/Source/Engine/Renderer/MotionBlurPass.h b/Source/Engine/Renderer/MotionBlurPass.h index 6c8d51b3f..c6dde97c2 100644 --- a/Source/Engine/Renderer/MotionBlurPass.h +++ b/Source/Engine/Renderer/MotionBlurPass.h @@ -14,7 +14,9 @@ private: PixelFormat _motionVectorsFormat; AssetReference _shader; GPUPipelineState* _psCameraMotionVectors = nullptr; +#if GPU_ENABLE_DEVELOPMENT GPUPipelineState* _psMotionVectorsDebug = nullptr; +#endif GPUPipelineState* _psTileMax = nullptr; GPUPipelineState* _psTileMaxVariable = nullptr; GPUPipelineState* _psNeighborMax = nullptr; @@ -35,12 +37,14 @@ public: /// The rendering context. void RenderMotionVectors(RenderContext& renderContext); +#if GPU_ENABLE_DEVELOPMENT /// /// Renders the motion vectors debug view. /// /// The rendering context. /// The source frame. void RenderDebug(RenderContext& renderContext, GPUTextureView* frame); +#endif /// /// Renders the motion blur. Swaps the input with output if rendering is performed. Does nothing if rendering is not performed. @@ -56,7 +60,9 @@ private: void OnShaderReloading(Asset* obj) { _psCameraMotionVectors->ReleaseGPU(); +#if GPU_ENABLE_DEVELOPMENT _psMotionVectorsDebug->ReleaseGPU(); +#endif _psTileMax->ReleaseGPU(); _psTileMaxVariable->ReleaseGPU(); _psNeighborMax->ReleaseGPU(); diff --git a/Source/Engine/Renderer/Renderer.cpp b/Source/Engine/Renderer/Renderer.cpp index 62c546919..26897f054 100644 --- a/Source/Engine/Renderer/Renderer.cpp +++ b/Source/Engine/Renderer/Renderer.cpp @@ -41,6 +41,8 @@ #include "Engine/Profiler/ProfilerMemory.h" #if USE_EDITOR #include "Editor/Editor.h" +#endif +#if GPU_ENABLE_DEVELOPMENT #include "Editor/QuadOverdrawPass.h" #endif @@ -48,6 +50,8 @@ // Additional options used in editor for lightmaps baking bool IsRunningRadiancePass = false; bool IsBakingLightmaps = false; +#endif +#if GPU_ENABLE_DEVELOPMENT bool EnableLightmapsUsage = true; #endif @@ -97,17 +101,15 @@ bool RendererService::Init() PassList.Add(GlobalSignDistanceFieldPass::Instance()); PassList.Add(GlobalSurfaceAtlasPass::Instance()); PassList.Add(DynamicDiffuseGlobalIlluminationPass::Instance()); -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT PassList.Add(QuadOverdrawPass::Instance()); #endif +#if GPU_ENABLE_PRELOADING_RESOURCES // Skip when using Null renderer if (GPUDevice::Instance->GetRendererType() == RendererType::Null) - { return false; - } -#if GPU_ENABLE_PRELOADING_RESOURCES // Init child services for (int32 i = 0; i < PassList.Count(); i++) { @@ -471,7 +473,7 @@ void RenderInner(SceneRenderTask* task, RenderContext& renderContext, RenderCont LightPass::Instance()->SetupLights(renderContext, renderContextBatch); if (setup.UseShadows) ShadowsPass::Instance()->SetupShadows(renderContext, renderContextBatch); -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT GBufferPass::Instance()->PreOverrideDrawCalls(renderContext); #endif @@ -498,7 +500,7 @@ void RenderInner(SceneRenderTask* task, RenderContext& renderContext, RenderCont renderContextBatch.Contexts[i].List->DrainDelayedDraws(context, renderContextBatch, i); renderContext.List->PostDraw(context, renderContextBatch); -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT GBufferPass::Instance()->OverrideDrawCalls(renderContext); #endif } @@ -578,7 +580,7 @@ void RenderInner(SceneRenderTask* task, RenderContext& renderContext, RenderCont auto lightBuffer = RenderTargetPool::Get(tempDesc); RENDER_TARGET_POOL_SET_NAME(lightBuffer, "LightBuffer"); -#if USE_EDITOR +#if GPU_ENABLE_DEVELOPMENT if (renderContext.View.Mode == ViewMode::QuadOverdraw) { QuadOverdrawPass::Instance()->Render(renderContext, context, lightBuffer->View()); @@ -602,8 +604,13 @@ void RenderInner(SceneRenderTask* task, RenderContext& renderContext, RenderCont GBufferPass::Instance()->Fill(renderContext, lightBuffer); // Debug drawing +#if GPU_ENABLE_DEVELOPMENT switch (renderContext.View.Mode) { + case ViewMode::MaterialComplexity: + GBufferPass::Instance()->DrawMaterialComplexity(renderContext, context, lightBuffer->View()); + RenderTargetPool::Release(lightBuffer); + return; case ViewMode::LightOverlap: LightPass::Instance()->RenderDebug(renderContext, context, lightBuffer); break; @@ -622,6 +629,9 @@ void RenderInner(SceneRenderTask* task, RenderContext& renderContext, RenderCont renderContext.View.Mode == ViewMode::GlobalSurfaceAtlas || renderContext.View.Mode == ViewMode::GlobalSDF || renderContext.View.Mode == ViewMode::GlobalSDFOverdraw) +#else + if (renderContext.View.Mode == ViewMode::Emissive) +#endif { context->ResetRenderTarget(); context->SetRenderTarget(task->GetOutputView()); @@ -630,14 +640,6 @@ void RenderInner(SceneRenderTask* task, RenderContext& renderContext, RenderCont RenderTargetPool::Release(lightBuffer); return; } -#if USE_EDITOR - if (renderContext.View.Mode == ViewMode::MaterialComplexity) - { - GBufferPass::Instance()->DrawMaterialComplexity(renderContext, context, lightBuffer->View()); - RenderTargetPool::Release(lightBuffer); - return; - } -#endif // Render motion vectors MotionBlurPass::Instance()->RenderMotionVectors(renderContext); @@ -806,6 +808,7 @@ PRAGMA_ENABLE_DEPRECATION_WARNINGS context->ResetSR(); context->FlushState(); +#if GPU_ENABLE_DEVELOPMENT // Debug motion vectors if (renderContext.View.Mode == ViewMode::MotionVectors) { @@ -814,6 +817,7 @@ PRAGMA_ENABLE_DEPRECATION_WARNINGS RenderTargetPool::Release(frameBuffer); return; } +#endif // Anti Aliasing GPUTextureView* outputView = task->GetOutputView(); diff --git a/Source/Engine/ShadersCompilation/Config.h b/Source/Engine/ShadersCompilation/Config.h index 65d596235..469218a90 100644 --- a/Source/Engine/ShadersCompilation/Config.h +++ b/Source/Engine/ShadersCompilation/Config.h @@ -61,6 +61,11 @@ public: /// bool TreatWarningsAsErrors = false; + /// + /// Enables compilation of development-only shaders for. Used in non-release or editor builds. + /// + bool DevelopmentShaders = true; + /// /// Custom macros for the shader compilation /// diff --git a/Source/Engine/ShadersCompilation/Parser/ShaderFunctionReader.h b/Source/Engine/ShadersCompilation/Parser/ShaderFunctionReader.h index da821b716..955be9a17 100644 --- a/Source/Engine/ShadersCompilation/Parser/ShaderFunctionReader.h +++ b/Source/Engine/ShadersCompilation/Parser/ShaderFunctionReader.h @@ -391,6 +391,7 @@ namespace ShaderProcessing { FeatureLevel::ES3_1, "FEATURE_LEVEL_ES3_1" }, { FeatureLevel::SM4, "FEATURE_LEVEL_SM4" }, { FeatureLevel::SM5, "FEATURE_LEVEL_SM5" }, + { FeatureLevel::SM6, "FEATURE_LEVEL_SM6" }, }; bool missing = true; for (int32 i = 0; i < ARRAY_COUNT(levels); i++) @@ -430,10 +431,14 @@ namespace ShaderProcessing current.Permutations.Add(ShaderPermutation()); } + // Development-only shaders need a flag from the parser (setup by compilation pipeline) + if (EnumHasAllFlags(current.Flags, ShaderFlags::DevelopmentOnly)) + current.MinFeatures |= ShaderProfileFeatures::DevelopmentShaders; + // Check if use this shader program - if ((current.Flags & ShaderFlags::Hidden) == (ShaderFlags)0 && - current.MinFeatureLevel <= parser->GetFeatureLevel() && - EnumHasAllFlags(parser->GetFeatures(), current.MinFeatures)) + if ((current.Flags & ShaderFlags::Hidden) == (ShaderFlags)0 && // Is not hidden + current.MinFeatureLevel <= parser->GetFeatureLevel() && // Matches minimum Feature Level + EnumHasAllFlags(parser->GetFeatures(), current.MinFeatures)) // All GPU features are supported { // Cache read function ShaderMetaReaderType::_cache.Add(current); diff --git a/Source/Engine/ShadersCompilation/Parser/ShaderProcessing.Parse.cpp b/Source/Engine/ShadersCompilation/Parser/ShaderProcessing.Parse.cpp index b9892f4bf..cecd17e29 100644 --- a/Source/Engine/ShadersCompilation/Parser/ShaderProcessing.Parse.cpp +++ b/Source/Engine/ShadersCompilation/Parser/ShaderProcessing.Parse.cpp @@ -146,8 +146,8 @@ ShaderFlags ShaderProcessing::ParseShaderFlags(const Token& token) _PARSE_ENTRY(Hidden), _PARSE_ENTRY(NoFastMath), _PARSE_ENTRY(VertexToGeometryShader), + _PARSE_ENTRY(DevelopmentOnly), }; - static_assert(ARRAY_COUNT(data) == 4, "Invalid amount of Shader Flag data entries."); #undef _PARSE_ENTRY for (int32 i = 0; i < ARRAY_COUNT(data); i++) diff --git a/Source/Engine/ShadersCompilation/Parser/ShaderProcessing.cpp b/Source/Engine/ShadersCompilation/Parser/ShaderProcessing.cpp index 7ea79a3b8..3a04105e7 100644 --- a/Source/Engine/ShadersCompilation/Parser/ShaderProcessing.cpp +++ b/Source/Engine/ShadersCompilation/Parser/ShaderProcessing.cpp @@ -18,13 +18,13 @@ #include "ShaderFunctionReader.CS.h" #include "Config.h" -ShaderProcessing::Parser::Parser(const String& targetName, const char* source, int32 sourceLength, ParserMacros macros, ShaderProfile profile) +ShaderProcessing::Parser::Parser(const String& targetName, const char* source, int32 sourceLength, ParserMacros macros, ShaderProfile profile, ShaderProfileFeatures features) : failed(false) , targetName(targetName) , text(source, sourceLength) , _macros(macros) , _featureLevel(RenderTools::GetFeatureLevel(profile)) - , _features(RenderTools::GetShaderProfileFeatures(profile)) + , _features(features) { } @@ -32,10 +32,10 @@ ShaderProcessing::Parser::~Parser() { } -bool ShaderProcessing::Parser::Process(const String& targetName, const char* source, int32 sourceLength, ParserMacros macros, ShaderProfile profile, ShaderMeta* result) +bool ShaderProcessing::Parser::Process(const String& targetName, const char* source, int32 sourceLength, ParserMacros macros, ShaderProfile profile, ShaderProfileFeatures features, ShaderMeta* result) { PROFILE_CPU_NAMED("Shader.Parse"); - Parser parser(targetName, source, sourceLength, macros, profile); + Parser parser(targetName, source, sourceLength, macros, profile, features); parser.Process(result); return parser.Failed(); } diff --git a/Source/Engine/ShadersCompilation/Parser/ShaderProcessing.h b/Source/Engine/ShadersCompilation/Parser/ShaderProcessing.h index f0d9afb5f..b6d16b604 100644 --- a/Source/Engine/ShadersCompilation/Parser/ShaderProcessing.h +++ b/Source/Engine/ShadersCompilation/Parser/ShaderProcessing.h @@ -30,7 +30,7 @@ namespace ShaderProcessing ShaderProfileFeatures _features; private: - Parser(const String& targetName, const char* source, int32 sourceLength, ParserMacros macros, ShaderProfile profile); + Parser(const String& targetName, const char* source, int32 sourceLength, ParserMacros macros, ShaderProfile profile, ShaderProfileFeatures features); ~Parser(); public: @@ -42,9 +42,10 @@ namespace ShaderProcessing /// Amount of characters in the source code /// The input macros. /// The target shader profile. + /// The target shader features. /// Output result with metadata /// True if cannot process the file (too many errors), otherwise false - static bool Process(const String& targetName, const char* source, int32 sourceLength, ParserMacros macros, ShaderProfile profile, ShaderMeta* result); + static bool Process(const String& targetName, const char* source, int32 sourceLength, ParserMacros macros, ShaderProfile profile, ShaderProfileFeatures features, ShaderMeta* result); public: /// diff --git a/Source/Engine/ShadersCompilation/ShadersCompilation.cpp b/Source/Engine/ShadersCompilation/ShadersCompilation.cpp index e1104cca3..d147225b4 100644 --- a/Source/Engine/ShadersCompilation/ShadersCompilation.cpp +++ b/Source/Engine/ShadersCompilation/ShadersCompilation.cpp @@ -155,7 +155,10 @@ bool ShadersCompilation::Compile(ShaderCompilationOptions& options) // Process shader source to collect metadata ShaderMeta meta; - if (ShaderProcessing::Parser::Process(options.TargetName, options.Source, options.SourceLength, options.Macros, options.Profile, &meta)) + auto shaderFeatures = RenderTools::GetShaderProfileFeatures(options.Profile); + if (options.DevelopmentShaders) + shaderFeatures |= ShaderProfileFeatures::DevelopmentShaders; + if (ShaderProcessing::Parser::Process(options.TargetName, options.Source, options.SourceLength, options.Macros, options.Profile, shaderFeatures , &meta)) { LOG(Warning, "Failed to parse source code."); return true; diff --git a/Source/Shaders/GI/GlobalSurfaceAtlas.shader b/Source/Shaders/GI/GlobalSurfaceAtlas.shader index cfd2d67c5..fbd0bbd1b 100644 --- a/Source/Shaders/GI/GlobalSurfaceAtlas.shader +++ b/Source/Shaders/GI/GlobalSurfaceAtlas.shader @@ -337,6 +337,7 @@ TextureCube Skybox : register(t7); // Pixel shader for Global Surface Atlas debug drawing META_PS(true, FEATURE_LEVEL_SM5) +META_FLAG(DevelopmentOnly) META_PERMUTATION_1(GLOBAL_SURFACE_ATLAS_DEBUG_MODE=0) META_PERMUTATION_1(GLOBAL_SURFACE_ATLAS_DEBUG_MODE=1) float4 PS_Debug(Quad_VS2PS input) : SV_Target diff --git a/Source/Shaders/GlobalSignDistanceField.shader b/Source/Shaders/GlobalSignDistanceField.shader index 307ea9c61..ac6a20536 100644 --- a/Source/Shaders/GlobalSignDistanceField.shader +++ b/Source/Shaders/GlobalSignDistanceField.shader @@ -288,6 +288,7 @@ Texture3D GlobalSDFMip : register(t1); // Pixel shader for Global SDF debug drawing META_PS(true, FEATURE_LEVEL_SM5) +META_FLAG(DevelopmentOnly) float4 PS_Debug(Quad_VS2PS input) : SV_Target { #if 0 @@ -402,6 +403,7 @@ float4 GetHeatmap(float value) // Pixel shader for Global SDF overdraw drawing META_PS(true, FEATURE_LEVEL_SM5) +META_FLAG(DevelopmentOnly) float4 PS_Overdraw(Quad_VS2PS input) : SV_Target { // Use over-exposed diffuse as a base for scene identification diff --git a/Source/Shaders/Lights.shader b/Source/Shaders/Lights.shader index 7ce544fa7..8b9c00d78 100644 --- a/Source/Shaders/Lights.shader +++ b/Source/Shaders/Lights.shader @@ -134,6 +134,7 @@ float4 PS_Sky(Model_VS2PS input) : SV_Target0 // Pixel shader for light overlap rendering META_PS(true, FEATURE_LEVEL_ES2) +META_FLAG(DevelopmentOnly) float4 PS_Overlap(Model_VS2PS input) : SV_Target0 { return Light.Radius.xxxx; @@ -145,6 +146,7 @@ float4 PS_Overlap(Model_VS2PS input) : SV_Target0 // Pixel shader for light complexity rendering META_PS(true, FEATURE_LEVEL_ES2) +META_FLAG(DevelopmentOnly) float4 PS_Complexity(Quad_VS2PS input) : SV_Target0 { // Make depth-based outlines diff --git a/Source/Shaders/MotionBlur.shader b/Source/Shaders/MotionBlur.shader index e190cdd74..f44e5492c 100644 --- a/Source/Shaders/MotionBlur.shader +++ b/Source/Shaders/MotionBlur.shader @@ -69,6 +69,7 @@ float4 MotionVectorToColor(float2 v) // Pixel shader for motion vectors debug view META_PS(true, FEATURE_LEVEL_ES2) +META_FLAG(DevelopmentOnly) float4 PS_MotionVectorsDebug(Quad_VS2PS input) : SV_Target { float4 color = SAMPLE_RT(Input0, input.TexCoord);