D3D: Add d3d_skip_shader_optimizations toggle Adds a new toggle, `d3d_skip_shader_optimizations`, to force the D3DCOMPILE_SKIP_OPTIMIZATION flag during shader compilation in D3D11 and D3D12. This can be used to speed up shader compilation time by skipping optimization passes. Bug: 439845637 Change-Id: Ie085076b5c2e66b196d812fbb9cc3c6686b75923 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/258114 Commit-Queue: Quyen Le <lehoangquyen@chromium.org> Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/dawn/native/Toggles.cpp b/src/dawn/native/Toggles.cpp index 40d643e..38b3fc2 100644 --- a/src/dawn/native/Toggles.cpp +++ b/src/dawn/native/Toggles.cpp
@@ -547,6 +547,10 @@ "workaround issues where FXC can miscompile code that depends on special float values (NaN, " "INF, etc).", "https://crbug.com/tint/976", ToggleStage::Device}}, + {Toggle::D3DSkipShaderOptimizations, + {"d3d_skip_shader_optimizations", + "Sets the D3DCOMPILE_SKIP_OPTIMIZATION compilation flag when compiling HLSL code.", + "https://crbug.com/439845637", ToggleStage::Device}}, {Toggle::PolyFillPacked4x8DotProduct, {"polyfill_packed_4x8_dot_product", "Always use the polyfill version of dot4I8Packed() and dot4U8Packed().",
diff --git a/src/dawn/native/Toggles.h b/src/dawn/native/Toggles.h index bf41d35..2320424 100644 --- a/src/dawn/native/Toggles.h +++ b/src/dawn/native/Toggles.h
@@ -134,6 +134,7 @@ D3D12CreateNotZeroedHeap, D3D12DontUseNotZeroedHeapFlagOnTexturesAsCommitedResources, D3DDisableIEEEStrictness, + D3DSkipShaderOptimizations, PolyFillPacked4x8DotProduct, PolyfillPackUnpack4x8Norm, EnableSubgroupsIntelGen9,
diff --git a/src/dawn/native/d3d11/ComputePipelineD3D11.cpp b/src/dawn/native/d3d11/ComputePipelineD3D11.cpp index 038c754..95f523b 100644 --- a/src/dawn/native/d3d11/ComputePipelineD3D11.cpp +++ b/src/dawn/native/d3d11/ComputePipelineD3D11.cpp
@@ -65,6 +65,9 @@ if (device->IsToggleEnabled(Toggle::EmitHLSLDebugSymbols)) { compileFlags |= D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION; } + if (device->IsToggleEnabled(Toggle::D3DSkipShaderOptimizations)) { + compileFlags |= D3DCOMPILE_SKIP_OPTIMIZATION; + } // Tint does matrix multiplication expecting row major matrices compileFlags |= D3DCOMPILE_PACK_MATRIX_ROW_MAJOR;
diff --git a/src/dawn/native/d3d11/RenderPipelineD3D11.cpp b/src/dawn/native/d3d11/RenderPipelineD3D11.cpp index fca67bd..2e8ef8f 100644 --- a/src/dawn/native/d3d11/RenderPipelineD3D11.cpp +++ b/src/dawn/native/d3d11/RenderPipelineD3D11.cpp
@@ -449,6 +449,9 @@ if (device->IsToggleEnabled(Toggle::EmitHLSLDebugSymbols)) { compileFlags |= D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION; } + if (device->IsToggleEnabled(Toggle::D3DSkipShaderOptimizations)) { + compileFlags |= D3DCOMPILE_SKIP_OPTIMIZATION; + } // Tint does matrix multiplication expecting row major matrices compileFlags |= D3DCOMPILE_PACK_MATRIX_ROW_MAJOR;
diff --git a/src/dawn/native/d3d12/ComputePipelineD3D12.cpp b/src/dawn/native/d3d12/ComputePipelineD3D12.cpp index 92ee191..dd3de80 100644 --- a/src/dawn/native/d3d12/ComputePipelineD3D12.cpp +++ b/src/dawn/native/d3d12/ComputePipelineD3D12.cpp
@@ -62,6 +62,10 @@ compileFlags |= D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION; } + if (device->IsToggleEnabled(Toggle::D3DSkipShaderOptimizations)) { + compileFlags |= D3DCOMPILE_SKIP_OPTIMIZATION; + } + if (device->IsToggleEnabled(Toggle::UseDXC) && ((compileFlags & D3DCOMPILE_OPTIMIZATION_LEVEL2) == 0)) { // DXC's default opt level is /O3, unlike FXC's /O1. Set explicitly, otherwise there's no
diff --git a/src/dawn/native/d3d12/RenderPipelineD3D12.cpp b/src/dawn/native/d3d12/RenderPipelineD3D12.cpp index ec98d48..12ec7d9 100644 --- a/src/dawn/native/d3d12/RenderPipelineD3D12.cpp +++ b/src/dawn/native/d3d12/RenderPipelineD3D12.cpp
@@ -327,6 +327,10 @@ compileFlags |= D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION; } + if (device->IsToggleEnabled(Toggle::D3DSkipShaderOptimizations)) { + compileFlags |= D3DCOMPILE_SKIP_OPTIMIZATION; + } + if (device->IsToggleEnabled(Toggle::UseDXC) && ((compileFlags & D3DCOMPILE_OPTIMIZATION_LEVEL2) == 0)) { // DXC's default opt level is /O3, unlike FXC's /O1. Set explicitly, otherwise there's no