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);
