[dawn] Dump shaders on failure toggle This change introduces "dump_shaders_on_failure" toggle. Internally this only currently applies to the d3d backends but it could apply to others in the future. Bug: 429187478 Change-Id: I9051b541b1249d3fb142253f619002df43b5243f Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/250754 Reviewed-by: James Price <jrprice@google.com> Commit-Queue: Peter McNeeley <petermcneeley@google.com>
diff --git a/src/dawn/native/Toggles.cpp b/src/dawn/native/Toggles.cpp index 0ca42ea..2eb4aae 100644 --- a/src/dawn/native/Toggles.cpp +++ b/src/dawn/native/Toggles.cpp
@@ -211,6 +211,11 @@ "Dump shaders for debugging purposes. Dumped shaders will be log via EmitLog, thus printed " "in Chrome console or consumed by user-defined callback function.", "https://crbug.com/dawn/792", ToggleStage::Device}}, + {Toggle::DumpShadersOnFailure, + {"dump_shaders_on_failure", + "Dump shaders only on failure. Used for logging purposes. Dumped shaders will be log via " + "EmitLog, thus printed in Chrome console or consumed by user-defined callback function.", + "https://crbug.com/dawn/792", ToggleStage::Device}}, {Toggle::DisableWorkgroupInit, {"disable_workgroup_init", "Disables the workgroup memory zero-initialization for compute shaders.",
diff --git a/src/dawn/native/Toggles.h b/src/dawn/native/Toggles.h index 9368ae1..7d96451 100644 --- a/src/dawn/native/Toggles.h +++ b/src/dawn/native/Toggles.h
@@ -74,6 +74,7 @@ EmitHLSLDebugSymbols, DisallowSpirv, DumpShaders, + DumpShadersOnFailure, DisableWorkgroupInit, DisableDemoteToHelper, VulkanUseDemoteToHelperInvocationExtension,
diff --git a/src/dawn/native/d3d/D3DCompilationRequest.h b/src/dawn/native/d3d/D3DCompilationRequest.h index 5080eb0..04c4056 100644 --- a/src/dawn/native/d3d/D3DCompilationRequest.h +++ b/src/dawn/native/d3d/D3DCompilationRequest.h
@@ -78,7 +78,8 @@ X(UnsafeUnserializedValue<LimitsForCompilationRequest>, adapterSupportedLimits) \ X(uint32_t, maxSubgroupSize) \ X(bool, disableSymbolRenaming) \ - X(bool, dumpShaders) + X(bool, dumpShaders) \ + X(bool, dumpShadersOnFailure) #define D3D_BYTECODE_COMPILATION_REQUEST_MEMBERS(X) \ X(bool, hasShaderF16Feature) \
diff --git a/src/dawn/native/d3d/ShaderUtils.cpp b/src/dawn/native/d3d/ShaderUtils.cpp index 3724664..1f6eda5 100644 --- a/src/dawn/native/d3d/ShaderUtils.cpp +++ b/src/dawn/native/d3d/ShaderUtils.cpp
@@ -144,7 +144,7 @@ ResultOrError<ComPtr<IDxcBlob>> CompileShaderDXC(const d3d::D3DBytecodeCompilationRequest& r, const std::string& entryPointName, const std::string& hlslSource, - bool dumpShaders) { + bool dumpShadersOnFailure) { DxcBuffer dxcBuffer; dxcBuffer.Ptr = hlslSource.c_str(); dxcBuffer.Size = hlslSource.length(); @@ -170,7 +170,7 @@ ComPtr<IDxcBlobEncoding> errors; DAWN_TRY(CheckHRESULT(result->GetErrorBuffer(&errors), "DXC get error buffer")); - if (dumpShaders) { + if (dumpShadersOnFailure) { return DAWN_VALIDATION_ERROR( "DXC compile failed with error: %s msg: %s\n/* Generated HLSL: */\n%s\n", hrAsString, static_cast<char*>(errors->GetBufferPointer()), hlslSource.c_str()); @@ -186,7 +186,7 @@ ResultOrError<ComPtr<ID3DBlob>> CompileShaderFXC(const d3d::D3DBytecodeCompilationRequest& r, const std::string& entryPointName, const std::string& hlslSource, - bool dumpShaders) { + bool dumpShadersOnFailure) { ComPtr<ID3DBlob> compiledShader; ComPtr<ID3DBlob> errors; @@ -196,7 +196,7 @@ if (FAILED(result)) { const char* resultAsString = HRESULTAsString(result); - if (dumpShaders) { + if (dumpShadersOnFailure) { std::string errorMsg = errors ? static_cast<char*>(errors->GetBufferPointer()) : ""; return DAWN_VALIDATION_ERROR( "FXC compile failed with error: %s msg: %s\n/* Generated HLSL: */\n%s\n", @@ -356,7 +356,7 @@ ResultOrError<CompiledShader> CompileShader(d3d::D3DCompilationRequest r) { CompiledShader compiledShader; - bool dumpShaders = r.hlsl.dumpShaders; + bool dumpShadersOnFailure = r.hlsl.dumpShaders || r.hlsl.dumpShadersOnFailure; // Compile the source shader to HLSL. DAWN_TRY(TranslateToHLSL(std::move(r.hlsl), r.tracePlatform, &compiledShader)); @@ -367,7 +367,7 @@ DAWN_TRY_ASSIGN( compiledDXCShader, CompileShaderDXC(r.bytecode, r.hlsl.tintOptions.remapped_entry_point_name, - compiledShader.hlslSource, dumpShaders)); + compiledShader.hlslSource, dumpShadersOnFailure)); compiledShader.shaderBlob = CreateBlob(std::move(compiledDXCShader)); break; } @@ -377,7 +377,7 @@ DAWN_TRY_ASSIGN( compiledFXCShader, CompileShaderFXC(r.bytecode, r.hlsl.tintOptions.remapped_entry_point_name, - compiledShader.hlslSource, dumpShaders)); + compiledShader.hlslSource, dumpShadersOnFailure)); compiledShader.shaderBlob = CreateBlob(std::move(compiledFXCShader)); break; } @@ -385,7 +385,7 @@ // If dumpShaders is false, we don't need the HLSL for logging. Clear the contents so it // isn't stored into the cache. - if (!dumpShaders) { + if (!r.hlsl.dumpShaders) { compiledShader.hlslSource = ""; } return compiledShader;
diff --git a/src/dawn/native/d3d11/ShaderModuleD3D11.cpp b/src/dawn/native/d3d11/ShaderModuleD3D11.cpp index 49677a5..d9f8350 100644 --- a/src/dawn/native/d3d11/ShaderModuleD3D11.cpp +++ b/src/dawn/native/d3d11/ShaderModuleD3D11.cpp
@@ -92,6 +92,7 @@ req.hlsl.shaderModel = 50; req.hlsl.disableSymbolRenaming = device->IsToggleEnabled(Toggle::DisableSymbolRenaming); req.hlsl.dumpShaders = device->IsToggleEnabled(Toggle::DumpShaders); + req.hlsl.dumpShadersOnFailure = device->IsToggleEnabled(Toggle::DumpShadersOnFailure); req.hlsl.tintOptions.remapped_entry_point_name = device->GetIsolatedEntryPointName(); req.bytecode.hasShaderF16Feature = false;
diff --git a/src/dawn/native/d3d12/ShaderModuleD3D12.cpp b/src/dawn/native/d3d12/ShaderModuleD3D12.cpp index c2dd378..56ced4f 100644 --- a/src/dawn/native/d3d12/ShaderModuleD3D12.cpp +++ b/src/dawn/native/d3d12/ShaderModuleD3D12.cpp
@@ -135,6 +135,7 @@ ->GetAppliedShaderModelUnderToggles(device->GetTogglesState()); req.hlsl.disableSymbolRenaming = device->IsToggleEnabled(Toggle::DisableSymbolRenaming); req.hlsl.dumpShaders = device->IsToggleEnabled(Toggle::DumpShaders); + req.hlsl.dumpShadersOnFailure = device->IsToggleEnabled(Toggle::DumpShadersOnFailure); req.hlsl.tintOptions.remapped_entry_point_name = device->GetIsolatedEntryPointName(); req.bytecode.hasShaderF16Feature = device->HasFeature(Feature::ShaderF16);