From 38606cb43a64894d9bf2e275cac9131d889e33d9 Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Tue, 7 Dec 2021 18:22:40 +0100 Subject: [PATCH] Add support for exporting pdb files for D3D12 shaders if debug data is enabled --- .../DirectX/ShaderCompilerDX.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Source/Engine/ShadersCompilation/DirectX/ShaderCompilerDX.cpp b/Source/Engine/ShadersCompilation/DirectX/ShaderCompilerDX.cpp index c03c10ae7..614e11a3e 100644 --- a/Source/Engine/ShadersCompilation/DirectX/ShaderCompilerDX.cpp +++ b/Source/Engine/ShadersCompilation/DirectX/ShaderCompilerDX.cpp @@ -5,11 +5,14 @@ #include "ShaderCompilerDX.h" #include "Engine/Core/Log.h" #include "Engine/Threading/Threading.h" +#include "Engine/Engine/Globals.h" #include "Engine/Graphics/Config.h" #include "Engine/GraphicsDevice/DirectX/DX12/Types.h" #include "Engine/Utilities/StringConverter.h" #include "Engine/Platform/Win32/IncludeWindowsHeaders.h" #include "Engine/Platform/Windows/ComPtr.h" +#include "Engine/Platform/FileSystem.h" +#include "Engine/Platform/File.h" #include #include @@ -173,6 +176,13 @@ bool ShaderCompilerDX::CompileShader(ShaderFunctionMeta& meta, WritePermutationD args.Add(entryPoint.Get()); args.Add(options->TargetName.Get()); Array> argsFull; + String debugOutputFolder; + if (_context->Options->GenerateDebugData) + { + debugOutputFolder = Globals::ProjectCacheFolder / TEXT("Shaders") / TEXT("DXC"); + if (!FileSystem::DirectoryExists(debugOutputFolder)) + FileSystem::CreateDirectory(debugOutputFolder); + } // Compile all shader function permutations for (int32 permutationIndex = 0; permutationIndex < meta.Permutations.Count(); permutationIndex++) @@ -274,6 +284,15 @@ bool ShaderCompilerDX::CompileShader(ShaderFunctionMeta& meta, WritePermutationD _context->OnCollectDebugInfo(meta, permutationIndex, (const char*)disassemblyUtf8->GetBufferPointer(), (int32)disassemblyUtf8->GetBufferSize()); } #endif + if (_context->Options->GenerateDebugData) + { + ComPtr pdbBlob; + ComPtr pdbName; + if (results->GetOutput(DXC_OUT_PDB, IID_PPV_ARGS(pdbBlob.GetAddressOf()), pdbName.GetAddressOf()) == S_OK) + { + File::WriteAllBytes(debugOutputFolder / String(pdbName->GetStringPointer(), (int32)pdbName->GetStringLength()), (byte*)pdbBlob->GetBufferPointer(), (int32)pdbBlob->GetBufferSize()); + } + } // Perform shader reflection if (FAILED(containerReflection->Load(shaderBuffer)))