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 { + + + + + + + + +