From 0d1b8f81546e8005d443aa2da80f7ec3754924ab Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Thu, 20 Jun 2024 14:25:08 +0100 Subject: [PATCH] Embed D3D12 Pixel History DXIL compiled shaders as resources Fallback to use the embedded compiled shader if the source shader fails to compile Only try to get pixel history DXIL shaders for captures that use DXIL --- renderdoc/data/renderdoc.rc | 18 ++++++++ renderdoc/data/resource.h | 9 ++++ renderdoc/driver/d3d12/d3d12_debug.cpp | 43 +++++++++++++++++-- renderdoc/driver/d3d12/d3d12_shader_cache.cpp | 33 ++++++++++++++ renderdoc/driver/d3d12/d3d12_shader_cache.h | 2 + renderdoc/renderdoc.vcxproj | 11 ++++- 6 files changed, 111 insertions(+), 5 deletions(-) diff --git a/renderdoc/data/renderdoc.rc b/renderdoc/data/renderdoc.rc index 07623bdff..8dca43b31 100644 --- a/renderdoc/data/renderdoc.rc +++ b/renderdoc/data/renderdoc.rc @@ -131,6 +131,15 @@ RESOURCE_fixedcol_1_dxbc TYPE_EMBED fixedcol_1.dxbc RESOURCE_fixedcol_2_dxbc TYPE_EMBED fixedcol_2.dxbc RESOURCE_fixedcol_3_dxbc TYPE_EMBED fixedcol_3.dxbc RESOURCE_quadwrite_dxbc TYPE_EMBED quadwrite.dxbc +RESOURCE_pixelhistory_primitiveid_dxbc TYPE_EMBED pixelhistory_primitiveid.dxbc +RESOURCE_pixelhistory_fixedcol_0_dxbc TYPE_EMBED pixelhistory_fixedcol_0.dxbc +RESOURCE_pixelhistory_fixedcol_1_dxbc TYPE_EMBED pixelhistory_fixedcol_1.dxbc +RESOURCE_pixelhistory_fixedcol_2_dxbc TYPE_EMBED pixelhistory_fixedcol_2.dxbc +RESOURCE_pixelhistory_fixedcol_3_dxbc TYPE_EMBED pixelhistory_fixedcol_3.dxbc +RESOURCE_pixelhistory_fixedcol_4_dxbc TYPE_EMBED pixelhistory_fixedcol_4.dxbc +RESOURCE_pixelhistory_fixedcol_5_dxbc TYPE_EMBED pixelhistory_fixedcol_5.dxbc +RESOURCE_pixelhistory_fixedcol_6_dxbc TYPE_EMBED pixelhistory_fixedcol_6.dxbc +RESOURCE_pixelhistory_fixedcol_7_dxbc TYPE_EMBED pixelhistory_fixedcol_7.dxbc #else @@ -139,6 +148,15 @@ RESOURCE_fixedcol_1_dxbc TYPE_EMBED "hlsl/empty.dxbc" RESOURCE_fixedcol_2_dxbc TYPE_EMBED "hlsl/empty.dxbc" RESOURCE_fixedcol_3_dxbc TYPE_EMBED "hlsl/empty.dxbc" RESOURCE_quadwrite_dxbc TYPE_EMBED "hlsl/empty.dxbc" +RESOURCE_pixelhistory_primitiveid_dxbc TYPE_EMBED "hlsl/empty.dxbc" +RESOURCE_pixelhistory_fixedcol_0_dxbc TYPE_EMBED "hlsl/empty.dxbc" +RESOURCE_pixelhistory_fixedcol_1_dxbc TYPE_EMBED "hlsl/empty.dxbc" +RESOURCE_pixelhistory_fixedcol_2_dxbc TYPE_EMBED "hlsl/empty.dxbc" +RESOURCE_pixelhistory_fixedcol_3_dxbc TYPE_EMBED "hlsl/empty.dxbc" +RESOURCE_pixelhistory_fixedcol_4_dxbc TYPE_EMBED "hlsl/empty.dxbc" +RESOURCE_pixelhistory_fixedcol_5_dxbc TYPE_EMBED "hlsl/empty.dxbc" +RESOURCE_pixelhistory_fixedcol_6_dxbc TYPE_EMBED "hlsl/empty.dxbc" +RESOURCE_pixelhistory_fixedcol_7_dxbc TYPE_EMBED "hlsl/empty.dxbc" #endif diff --git a/renderdoc/data/resource.h b/renderdoc/data/resource.h index 95f4417ab..7e2cf17ae 100644 --- a/renderdoc/data/resource.h +++ b/renderdoc/data/resource.h @@ -27,6 +27,15 @@ #define RESOURCE_fixedcol_2_dxbc 115 #define RESOURCE_fixedcol_3_dxbc 116 #define RESOURCE_quadwrite_dxbc 117 +#define RESOURCE_pixelhistory_primitiveid_dxbc 122 +#define RESOURCE_pixelhistory_fixedcol_0_dxbc 123 +#define RESOURCE_pixelhistory_fixedcol_1_dxbc 124 +#define RESOURCE_pixelhistory_fixedcol_2_dxbc 125 +#define RESOURCE_pixelhistory_fixedcol_3_dxbc 126 +#define RESOURCE_pixelhistory_fixedcol_4_dxbc 127 +#define RESOURCE_pixelhistory_fixedcol_5_dxbc 128 +#define RESOURCE_pixelhistory_fixedcol_6_dxbc 129 +#define RESOURCE_pixelhistory_fixedcol_7_dxbc 130 #define RESOURCE_sourcecodepro_ttf 301 diff --git a/renderdoc/driver/d3d12/d3d12_debug.cpp b/renderdoc/driver/d3d12/d3d12_debug.cpp index 24f123b07..8c5c8e6f9 100644 --- a/renderdoc/driver/d3d12/d3d12_debug.cpp +++ b/renderdoc/driver/d3d12/d3d12_debug.cpp @@ -2925,16 +2925,51 @@ void D3D12Replay::PixelHistory::Init(WrappedID3D12Device *device, D3D12DebugMana shaderCache->GetShaderBlob(hlsl.c_str(), "RENDERDOC_PrimitiveIDPS", D3DCOMPILE_WARNINGS_ARE_ERRORS, {}, "ps_5_0", &PrimitiveIDPS); - shaderCache->GetShaderBlob(hlsl.c_str(), "RENDERDOC_PrimitiveIDPS", - D3DCOMPILE_WARNINGS_ARE_ERRORS, {}, "ps_6_0", &PrimitiveIDPSDxil); for(int i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i) { rdcstr hlsl_variant = "#define RT " + ToStr(i) + "\n" + hlsl; shaderCache->GetShaderBlob(hlsl_variant.c_str(), "RENDERDOC_PixelHistoryFixedColPS", D3DCOMPILE_WARNINGS_ARE_ERRORS, {}, "ps_5_0", &FixedColorPS[i]); - shaderCache->GetShaderBlob(hlsl_variant.c_str(), "RENDERDOC_PixelHistoryFixedColPS", - D3DCOMPILE_WARNINGS_ARE_ERRORS, {}, "ps_6_0", &FixedColorPSDxil[i]); + } + + // only create DXIL shaders if DXIL was used by the application to reduce the chance of failure + if(device->UsedDXIL()) + { + shaderCache->GetShaderBlob(hlsl.c_str(), "RENDERDOC_PrimitiveIDPS", + D3DCOMPILE_WARNINGS_ARE_ERRORS, {}, "ps_6_0", &PrimitiveIDPSDxil); + + if(PrimitiveIDPSDxil == NULL) + { + RDCWARN( + "Couldn't compile DXIL Pixel History Primitive ID shader at runtime, falling back to " + "baked DXIL shader"); + + PrimitiveIDPSDxil = shaderCache->GetPrimitiveIDShaderDXILBlob(); + if(!PrimitiveIDPSDxil) + { + RDCWARN("No fallback DXIL shader available!"); + } + } + for(int i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i) + { + rdcstr hlsl_variant = "#define RT " + ToStr(i) + "\n" + hlsl; + shaderCache->GetShaderBlob(hlsl_variant.c_str(), "RENDERDOC_PixelHistoryFixedColPS", + D3DCOMPILE_WARNINGS_ARE_ERRORS, {}, "ps_6_0", &FixedColorPSDxil[i]); + if(FixedColorPSDxil[i] == NULL) + { + RDCWARN( + "Couldn't compile DXIL Pixel History Fixed Color %d shader at runtime, falling back to " + "baked DXIL shader", + i); + + FixedColorPSDxil[i] = shaderCache->GetFixedColorShaderDXILBlob(i); + if(!FixedColorPSDxil[i]) + { + RDCWARN("No fallback DXIL shader available!"); + } + } + } } shaderCache->SetCaching(false); diff --git a/renderdoc/driver/d3d12/d3d12_shader_cache.cpp b/renderdoc/driver/d3d12/d3d12_shader_cache.cpp index 1b6ee7fd6..daf90444c 100644 --- a/renderdoc/driver/d3d12/d3d12_shader_cache.cpp +++ b/renderdoc/driver/d3d12/d3d12_shader_cache.cpp @@ -1072,6 +1072,39 @@ ID3DBlob *D3D12ShaderCache::GetQuadShaderDXILBlob() return ret; } +ID3DBlob *D3D12ShaderCache::GetPrimitiveIDShaderDXILBlob() +{ + rdcstr embedded = GetEmbeddedResource(pixelhistory_primitiveid_dxbc); + if(embedded.empty() || !embedded.beginsWith("DXBC")) + return NULL; + + ID3DBlob *ret = NULL; + D3D12ShaderCacheCallbacks.Create((uint32_t)embedded.size(), embedded.data(), &ret); + return ret; +} + +ID3DBlob *D3D12ShaderCache::GetFixedColorShaderDXILBlob(uint32_t variant) +{ + const rdcstr variants[] = { + GetEmbeddedResource(pixelhistory_fixedcol_0_dxbc), + GetEmbeddedResource(pixelhistory_fixedcol_1_dxbc), + GetEmbeddedResource(pixelhistory_fixedcol_2_dxbc), + GetEmbeddedResource(pixelhistory_fixedcol_3_dxbc), + GetEmbeddedResource(pixelhistory_fixedcol_4_dxbc), + GetEmbeddedResource(pixelhistory_fixedcol_5_dxbc), + GetEmbeddedResource(pixelhistory_fixedcol_6_dxbc), + GetEmbeddedResource(pixelhistory_fixedcol_7_dxbc), + }; + + const rdcstr embedded = variants[variant]; + if(embedded.empty() || !embedded.beginsWith("DXBC")) + return NULL; + + ID3DBlob *ret = NULL; + D3D12ShaderCacheCallbacks.Create((uint32_t)embedded.size(), embedded.data(), &ret); + return ret; +} + void D3D12ShaderCache::LoadDXC() { GetDXC(); diff --git a/renderdoc/driver/d3d12/d3d12_shader_cache.h b/renderdoc/driver/d3d12/d3d12_shader_cache.h index d6f859040..19e1dbf84 100644 --- a/renderdoc/driver/d3d12/d3d12_shader_cache.h +++ b/renderdoc/driver/d3d12/d3d12_shader_cache.h @@ -58,6 +58,8 @@ public: }; ID3DBlob *MakeFixedColShader(FixedColVariant variant, bool dxil = false); ID3DBlob *GetQuadShaderDXILBlob(); + ID3DBlob *GetPrimitiveIDShaderDXILBlob(); + ID3DBlob *GetFixedColorShaderDXILBlob(uint32_t variant); void LoadDXC(); diff --git a/renderdoc/renderdoc.vcxproj b/renderdoc/renderdoc.vcxproj index c5beeee10..fcd4ff3f6 100644 --- a/renderdoc/renderdoc.vcxproj +++ b/renderdoc/renderdoc.vcxproj @@ -818,7 +818,7 @@ namespace DXCEnumerateAndCheck { - + @@ -826,6 +826,15 @@ namespace DXCEnumerateAndCheck { + + + + + + + + +