[d3d] Move DumpCompiledShader to d3d folder
It will be shared between D3D11 and D3D12.
Bug: dawn:1705
Change-Id: If38122484a9063f158e83d364e2615a4ff10ead7
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/124884
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Peng Huang <penghuang@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/dawn/native/d3d/ShaderUtils.cpp b/src/dawn/native/d3d/ShaderUtils.cpp
index ca39e92..222dc34 100644
--- a/src/dawn/native/d3d/ShaderUtils.cpp
+++ b/src/dawn/native/d3d/ShaderUtils.cpp
@@ -14,6 +14,7 @@
#include "dawn/native/d3d/ShaderUtils.h"
+#include <sstream>
#include <string>
#include <utility>
#include <vector>
@@ -21,6 +22,8 @@
#include "dawn/native/d3d/BlobD3D.h"
#include "dawn/native/d3d/D3DCompilationRequest.h"
#include "dawn/native/d3d/D3DError.h"
+#include "dawn/native/d3d/DeviceD3D.h"
+#include "dawn/native/d3d/PlatformFunctions.h"
#include "dawn/native/d3d/UtilsD3D.h"
#include "dawn/platform/DawnPlatform.h"
#include "dawn/platform/tracing/TraceEvent.h"
@@ -240,6 +243,68 @@
return std::move(result.hlsl);
}
+std::string CompileFlagsToStringFXC(uint32_t compileFlags) {
+ struct Flag {
+ uint32_t value;
+ const char* name;
+ };
+ constexpr Flag flags[] = {
+ // Populated from d3dcompiler.h
+#define F(f) Flag{f, #f}
+ F(D3DCOMPILE_DEBUG),
+ F(D3DCOMPILE_SKIP_VALIDATION),
+ F(D3DCOMPILE_SKIP_OPTIMIZATION),
+ F(D3DCOMPILE_PACK_MATRIX_ROW_MAJOR),
+ F(D3DCOMPILE_PACK_MATRIX_COLUMN_MAJOR),
+ F(D3DCOMPILE_PARTIAL_PRECISION),
+ F(D3DCOMPILE_FORCE_VS_SOFTWARE_NO_OPT),
+ F(D3DCOMPILE_FORCE_PS_SOFTWARE_NO_OPT),
+ F(D3DCOMPILE_NO_PRESHADER),
+ F(D3DCOMPILE_AVOID_FLOW_CONTROL),
+ F(D3DCOMPILE_PREFER_FLOW_CONTROL),
+ F(D3DCOMPILE_ENABLE_STRICTNESS),
+ F(D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY),
+ F(D3DCOMPILE_IEEE_STRICTNESS),
+ F(D3DCOMPILE_RESERVED16),
+ F(D3DCOMPILE_RESERVED17),
+ F(D3DCOMPILE_WARNINGS_ARE_ERRORS),
+ F(D3DCOMPILE_RESOURCES_MAY_ALIAS),
+ F(D3DCOMPILE_ENABLE_UNBOUNDED_DESCRIPTOR_TABLES),
+ F(D3DCOMPILE_ALL_RESOURCES_BOUND),
+ F(D3DCOMPILE_DEBUG_NAME_FOR_SOURCE),
+ F(D3DCOMPILE_DEBUG_NAME_FOR_BINARY),
+#undef F
+ };
+
+ std::string result;
+ for (const Flag& f : flags) {
+ if ((compileFlags & f.value) != 0) {
+ result += f.name + std::string("\n");
+ }
+ }
+
+ // Optimization level must be handled separately as two bits are used, and the values
+ // don't map neatly to 0-3.
+ constexpr uint32_t d3dCompileFlagsBits = D3DCOMPILE_OPTIMIZATION_LEVEL2;
+ switch (compileFlags & d3dCompileFlagsBits) {
+ case D3DCOMPILE_OPTIMIZATION_LEVEL0:
+ result += "D3DCOMPILE_OPTIMIZATION_LEVEL0";
+ break;
+ case D3DCOMPILE_OPTIMIZATION_LEVEL1:
+ result += "D3DCOMPILE_OPTIMIZATION_LEVEL1";
+ break;
+ case D3DCOMPILE_OPTIMIZATION_LEVEL2:
+ result += "D3DCOMPILE_OPTIMIZATION_LEVEL2";
+ break;
+ case D3DCOMPILE_OPTIMIZATION_LEVEL3:
+ result += "D3DCOMPILE_OPTIMIZATION_LEVEL3";
+ break;
+ }
+ result += std::string("\n");
+
+ return result;
+}
+
} // anonymous namespace
ResultOrError<CompiledShader> CompileShader(d3d::D3DCompilationRequest r) {
@@ -277,4 +342,45 @@
return compiledShader;
}
+void DumpCompiledShader(Device* device,
+ const CompiledShader& compiledShader,
+ uint32_t compileFlags) {
+ std::ostringstream dumpedMsg;
+ dumpedMsg << "/* Dumped generated HLSL */" << std::endl
+ << compiledShader.hlslSource << std::endl;
+
+ if (device->IsToggleEnabled(Toggle::UseDXC)) {
+ dumpedMsg << "/* Dumped disassembled DXIL */" << std::endl;
+ const Blob& shaderBlob = compiledShader.shaderBlob;
+ ComPtr<IDxcBlobEncoding> dxcBlob;
+ ComPtr<IDxcBlobEncoding> disassembly;
+ if (FAILED(device->GetDxcLibrary()->CreateBlobWithEncodingFromPinned(
+ shaderBlob.Data(), shaderBlob.Size(), 0, &dxcBlob)) ||
+ FAILED(device->GetDxcCompiler()->Disassemble(dxcBlob.Get(), &disassembly))) {
+ dumpedMsg << "DXC disassemble failed" << std::endl;
+ } else {
+ dumpedMsg << std::string_view(static_cast<const char*>(disassembly->GetBufferPointer()),
+ disassembly->GetBufferSize());
+ }
+ } else {
+ dumpedMsg << "/* FXC compile flags */ " << std::endl
+ << CompileFlagsToStringFXC(compileFlags) << std::endl;
+ dumpedMsg << "/* Dumped disassembled DXBC */" << std::endl;
+ ComPtr<ID3DBlob> disassembly;
+ const Blob& shaderBlob = compiledShader.shaderBlob;
+ UINT flags =
+ // Some literals are printed as floats with precision(6) which is not enough
+ // precision for values very close to 0, so always print literals as hex values.
+ D3D_DISASM_PRINT_HEX_LITERALS;
+ if (FAILED(device->GetFunctions()->d3dDisassemble(shaderBlob.Data(), shaderBlob.Size(),
+ flags, nullptr, &disassembly))) {
+ dumpedMsg << "D3D disassemble failed" << std::endl;
+ } else {
+ dumpedMsg << std::string_view(static_cast<const char*>(disassembly->GetBufferPointer()),
+ disassembly->GetBufferSize());
+ }
+ }
+ device->EmitLog(WGPULoggingType_Info, dumpedMsg.str().c_str());
+}
+
} // namespace dawn::native::d3d
diff --git a/src/dawn/native/d3d/ShaderUtils.h b/src/dawn/native/d3d/ShaderUtils.h
index bbfc2b1..9e79324 100644
--- a/src/dawn/native/d3d/ShaderUtils.h
+++ b/src/dawn/native/d3d/ShaderUtils.h
@@ -24,6 +24,8 @@
namespace dawn::native::d3d {
+class Device;
+
#define COMPILED_SHADER_MEMBERS(X) \
X(Blob, shaderBlob) \
X(std::string, hlslSource) \
@@ -38,6 +40,10 @@
ResultOrError<CompiledShader> CompileShader(d3d::D3DCompilationRequest r);
+void DumpCompiledShader(Device* device,
+ const CompiledShader& compiledShader,
+ uint32_t compileFlags);
+
} // namespace dawn::native::d3d
#endif // SRC_DAWN_NATIVE_D3D_SHADEUTILS_H_
diff --git a/src/dawn/native/d3d12/ShaderModuleD3D12.cpp b/src/dawn/native/d3d12/ShaderModuleD3D12.cpp
index 0c3d819..7df96ca 100644
--- a/src/dawn/native/d3d12/ShaderModuleD3D12.cpp
+++ b/src/dawn/native/d3d12/ShaderModuleD3D12.cpp
@@ -38,71 +38,6 @@
namespace dawn::native::d3d12 {
-namespace {
-std::string CompileFlagsToStringFXC(uint32_t compileFlags) {
- struct Flag {
- uint32_t value;
- const char* name;
- };
- constexpr Flag flags[] = {
- // Populated from d3dcompiler.h
-#define F(f) Flag{f, #f}
- F(D3DCOMPILE_DEBUG),
- F(D3DCOMPILE_SKIP_VALIDATION),
- F(D3DCOMPILE_SKIP_OPTIMIZATION),
- F(D3DCOMPILE_PACK_MATRIX_ROW_MAJOR),
- F(D3DCOMPILE_PACK_MATRIX_COLUMN_MAJOR),
- F(D3DCOMPILE_PARTIAL_PRECISION),
- F(D3DCOMPILE_FORCE_VS_SOFTWARE_NO_OPT),
- F(D3DCOMPILE_FORCE_PS_SOFTWARE_NO_OPT),
- F(D3DCOMPILE_NO_PRESHADER),
- F(D3DCOMPILE_AVOID_FLOW_CONTROL),
- F(D3DCOMPILE_PREFER_FLOW_CONTROL),
- F(D3DCOMPILE_ENABLE_STRICTNESS),
- F(D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY),
- F(D3DCOMPILE_IEEE_STRICTNESS),
- F(D3DCOMPILE_RESERVED16),
- F(D3DCOMPILE_RESERVED17),
- F(D3DCOMPILE_WARNINGS_ARE_ERRORS),
- F(D3DCOMPILE_RESOURCES_MAY_ALIAS),
- F(D3DCOMPILE_ENABLE_UNBOUNDED_DESCRIPTOR_TABLES),
- F(D3DCOMPILE_ALL_RESOURCES_BOUND),
- F(D3DCOMPILE_DEBUG_NAME_FOR_SOURCE),
- F(D3DCOMPILE_DEBUG_NAME_FOR_BINARY),
-#undef F
- };
-
- std::string result;
- for (const Flag& f : flags) {
- if ((compileFlags & f.value) != 0) {
- result += f.name + std::string("\n");
- }
- }
-
- // Optimization level must be handled separately as two bits are used, and the values
- // don't map neatly to 0-3.
- constexpr uint32_t d3dCompileFlagsBits = D3DCOMPILE_OPTIMIZATION_LEVEL2;
- switch (compileFlags & d3dCompileFlagsBits) {
- case D3DCOMPILE_OPTIMIZATION_LEVEL0:
- result += "D3DCOMPILE_OPTIMIZATION_LEVEL0";
- break;
- case D3DCOMPILE_OPTIMIZATION_LEVEL1:
- result += "D3DCOMPILE_OPTIMIZATION_LEVEL1";
- break;
- case D3DCOMPILE_OPTIMIZATION_LEVEL2:
- result += "D3DCOMPILE_OPTIMIZATION_LEVEL2";
- break;
- case D3DCOMPILE_OPTIMIZATION_LEVEL3:
- result += "D3DCOMPILE_OPTIMIZATION_LEVEL3";
- break;
- }
- result += std::string("\n");
-
- return result;
-}
-
-} // anonymous namespace
-
// static
ResultOrError<Ref<ShaderModule>> ShaderModule::Create(
Device* device,
@@ -276,44 +211,7 @@
d3d::CompileShader);
if (device->IsToggleEnabled(Toggle::DumpShaders)) {
- std::ostringstream dumpedMsg;
- dumpedMsg << "/* Dumped generated HLSL */" << std::endl
- << compiledShader->hlslSource << std::endl;
-
- if (device->IsToggleEnabled(Toggle::UseDXC)) {
- dumpedMsg << "/* Dumped disassembled DXIL */" << std::endl;
- const Blob& shaderBlob = compiledShader->shaderBlob;
- ComPtr<IDxcBlobEncoding> dxcBlob;
- ComPtr<IDxcBlobEncoding> disassembly;
- if (FAILED(device->GetDxcLibrary()->CreateBlobWithEncodingFromPinned(
- shaderBlob.Data(), shaderBlob.Size(), 0, &dxcBlob)) ||
- FAILED(device->GetDxcCompiler()->Disassemble(dxcBlob.Get(), &disassembly))) {
- dumpedMsg << "DXC disassemble failed" << std::endl;
- } else {
- dumpedMsg << std::string_view(
- static_cast<const char*>(disassembly->GetBufferPointer()),
- disassembly->GetBufferSize());
- }
- } else {
- dumpedMsg << "/* FXC compile flags */ " << std::endl
- << CompileFlagsToStringFXC(compileFlags) << std::endl;
- dumpedMsg << "/* Dumped disassembled DXBC */" << std::endl;
- ComPtr<ID3DBlob> disassembly;
- const Blob& shaderBlob = compiledShader->shaderBlob;
- UINT flags =
- // Some literals are printed as floats with precision(6) which is not enough
- // precision for values very close to 0, so always print literals as hex values.
- D3D_DISASM_PRINT_HEX_LITERALS;
- if (FAILED(device->GetFunctions()->d3dDisassemble(shaderBlob.Data(), shaderBlob.Size(),
- flags, nullptr, &disassembly))) {
- dumpedMsg << "D3D disassemble failed" << std::endl;
- } else {
- dumpedMsg << std::string_view(
- static_cast<const char*>(disassembly->GetBufferPointer()),
- disassembly->GetBufferSize());
- }
- }
- device->EmitLog(WGPULoggingType_Info, dumpedMsg.str().c_str());
+ d3d::DumpCompiledShader(device, *compiledShader, compileFlags);
}
device->GetBlobCache()->EnsureStored(compiledShader);