From 4a73100da66bd70ce6b4a0c1013b9eaee3a16e18 Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Tue, 29 Oct 2024 08:35:00 +0000 Subject: [PATCH] D3D12 Shader Debug loop downwards from highest shader model to 6.0 CheckFeatureSupport will return E_INVALIDARG if HighestShaderModel isn't known by the current runtime. --- renderdoc/driver/d3d12/d3d12_debug.cpp | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_debug.cpp b/renderdoc/driver/d3d12/d3d12_debug.cpp index 9a2869a80..0ee6773ec 100644 --- a/renderdoc/driver/d3d12/d3d12_debug.cpp +++ b/renderdoc/driver/d3d12/d3d12_debug.cpp @@ -835,11 +835,29 @@ bool D3D12DebugManager::CreateShaderDebugResources() RDCERR("Failed to compile DXIL vertex shader for shader debugging"); return false; } + // CheckFeatureSupport returns E_INVALIDARG if HighestShaderModel isn't known by the current runtime. + int smMajor = 6; + int smMinor = -1; + for(smMinor = D3D_HIGHEST_SHADER_MODEL & 0xF; smMinor >= 0; smMinor--) + { + D3D_SHADER_MODEL smModel = (D3D_SHADER_MODEL)(smMajor << 4 | smMinor); + D3D12_FEATURE_DATA_SHADER_MODEL smMaxSupport = {smModel}; + if(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_SHADER_MODEL, &smMaxSupport, + sizeof(smMaxSupport)) == S_OK) + { + smMajor = smMaxSupport.HighestShaderModel >> 4; + smMinor = smMaxSupport.HighestShaderModel & 0xF; + break; + } + } + if(smMinor < 0) + { + RDCERR("Failed to find highest shader model 6.x supported by the current runtime"); + return false; + } + ID3DBlob *dxilPsBlob = NULL; - D3D12_FEATURE_DATA_SHADER_MODEL smMaxSupport = {D3D_SHADER_MODEL_6_8}; - m_pDevice->CheckFeatureSupport(D3D12_FEATURE_SHADER_MODEL, &smMaxSupport, sizeof(smMaxSupport)); - D3D_SHADER_MODEL smModel = smMaxSupport.HighestShaderModel; - rdcstr psSM = StringFormat::Fmt("ps_%d_%d", (smModel >> 4), (smModel & 0xf)); + rdcstr psSM = StringFormat::Fmt("ps_%d_%d", smMajor, smMinor); if(m_pDevice->GetShaderCache()->GetShaderBlob(hlsl.c_str(), "RENDERDOC_DebugSamplePS", D3DCOMPILE_WARNINGS_ARE_ERRORS, {}, psSM.c_str(), &dxilPsBlob) != "")