From 2d8930d88ed42b9f4ffbd4dc1937af9d175bfc0c Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Tue, 3 Dec 2024 07:33:12 +0000 Subject: [PATCH] Added D3D12APIWrapper::GetResourceReferenceInfo() Gets the resource details for a direct heap access binding --- renderdoc/driver/d3d12/d3d12_dxil_debug.cpp | 154 ++++++++++++++++++++ renderdoc/driver/d3d12/d3d12_dxil_debug.h | 1 + renderdoc/driver/shaders/dxil/dxil_debug.h | 1 + 3 files changed, 156 insertions(+) diff --git a/renderdoc/driver/d3d12/d3d12_dxil_debug.cpp b/renderdoc/driver/d3d12/d3d12_dxil_debug.cpp index 299231657..cc37a493b 100644 --- a/renderdoc/driver/d3d12/d3d12_dxil_debug.cpp +++ b/renderdoc/driver/d3d12/d3d12_dxil_debug.cpp @@ -38,6 +38,80 @@ using namespace DXILDebug; namespace DXILDebug { +static DXBC::ResourceRetType ConvertCompTypeToResourceRetType(const CompType compType) +{ + switch(compType) + { + case CompType::Float: return DXBC::ResourceRetType::RETURN_TYPE_FLOAT; + case CompType::UNormSRGB: + case CompType::UNorm: return DXBC::ResourceRetType::RETURN_TYPE_UNORM; + case CompType::SNorm: return DXBC::ResourceRetType::RETURN_TYPE_SNORM; + case CompType::UInt: return DXBC::ResourceRetType::RETURN_TYPE_UINT; + case CompType::SInt: return DXBC::ResourceRetType::RETURN_TYPE_SINT; + case CompType::Typeless: + case CompType::UScaled: + case CompType::SScaled: + case CompType::Depth: + default: + RDCERR("Unexpected component type %s", ToStr(compType).c_str()); + return DXBC::ResourceRetType ::RETURN_TYPE_UNKNOWN; + } +} + +static DXBCBytecode::ResourceDimension ConvertSRVResourceDimensionToResourceDimension( + D3D12_SRV_DIMENSION dim) +{ + switch(dim) + { + case D3D12_SRV_DIMENSION_UNKNOWN: + return DXBCBytecode::ResourceDimension::RESOURCE_DIMENSION_UNKNOWN; + case D3D12_SRV_DIMENSION_BUFFER: + return DXBCBytecode::ResourceDimension ::RESOURCE_DIMENSION_BUFFER; + case D3D12_SRV_DIMENSION_TEXTURE1D: + return DXBCBytecode::ResourceDimension::RESOURCE_DIMENSION_TEXTURE1D; + case D3D12_SRV_DIMENSION_TEXTURE1DARRAY: + return DXBCBytecode::ResourceDimension::RESOURCE_DIMENSION_TEXTURE1DARRAY; + case D3D12_SRV_DIMENSION_TEXTURE2D: + return DXBCBytecode::ResourceDimension::RESOURCE_DIMENSION_TEXTURE2D; + case D3D12_SRV_DIMENSION_TEXTURE2DARRAY: + return DXBCBytecode::ResourceDimension::RESOURCE_DIMENSION_TEXTURE2DARRAY; + case D3D12_SRV_DIMENSION_TEXTURE2DMS: + return DXBCBytecode::ResourceDimension::RESOURCE_DIMENSION_TEXTURE2DMS; + case D3D12_SRV_DIMENSION_TEXTURE2DMSARRAY: + return DXBCBytecode::ResourceDimension::RESOURCE_DIMENSION_TEXTURE2DMSARRAY; + case D3D12_SRV_DIMENSION_TEXTURE3D: + return DXBCBytecode::ResourceDimension::RESOURCE_DIMENSION_TEXTURE3D; + case D3D12_SRV_DIMENSION_TEXTURECUBE: + return DXBCBytecode::ResourceDimension::RESOURCE_DIMENSION_TEXTURECUBE; + case D3D12_SRV_DIMENSION_TEXTURECUBEARRAY: + return DXBCBytecode::ResourceDimension::RESOURCE_DIMENSION_TEXTURECUBEARRAY; + default: + RDCERR("Unexpected SRV dimension %s", ToStr(dim).c_str()); + return DXBCBytecode::ResourceDimension::RESOURCE_DIMENSION_UNKNOWN; + } +} + +static DXDebug::SamplerMode ConvertSamplerFilterToSamplerMode(D3D12_FILTER filter) +{ + switch(filter) + { + case D3D12_FILTER_COMPARISON_MIN_MAG_MIP_POINT: + case D3D12_FILTER_COMPARISON_MIN_MAG_POINT_MIP_LINEAR: + case D3D12_FILTER_COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT: + case D3D12_FILTER_COMPARISON_MIN_POINT_MAG_MIP_LINEAR: + case D3D12_FILTER_COMPARISON_MIN_LINEAR_MAG_MIP_POINT: + case D3D12_FILTER_COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR: + case D3D12_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT: + case D3D12_FILTER_COMPARISON_MIN_MAG_MIP_LINEAR: + case D3D12_FILTER_COMPARISON_MIN_MAG_ANISOTROPIC_MIP_POINT: + case D3D12_FILTER_COMPARISON_ANISOTROPIC: + return DXBCBytecode::SamplerMode::SAMPLER_MODE_COMPARISON; + break; + default: break; + } + return DXBCBytecode::SamplerMode::SAMPLER_MODE_DEFAULT; +} + static bool IsShaderParameterVisible(DXBC::ShaderType shaderType, D3D12_SHADER_VISIBILITY shaderVisibility) { @@ -984,4 +1058,84 @@ ShaderVariable D3D12APIWrapper::GetRenderTargetSampleInfo(const DXBC::ShaderType return D3D12ShaderDebug::GetRenderTargetSampleInfo(m_Device, shaderType, opString); } +ResourceReferenceInfo D3D12APIWrapper::GetResourceReferenceInfo(const DXDebug::BindingSlot &slot) +{ + const HeapDescriptorType heapType = slot.heapType; + RDCASSERT(heapType != HeapDescriptorType::NoHeap); + const uint32_t descriptorIndex = slot.descriptorIndex; + D3D12Descriptor desc = D3D12ShaderDebug::FindDescriptor(m_Device, heapType, descriptorIndex); + + D3D12ResourceManager *rm = m_Device->GetResourceManager(); + + ResourceReferenceInfo resRefInfo; + resRefInfo.binding.heapType = heapType; + resRefInfo.binding.descriptorIndex = descriptorIndex; + + switch(desc.GetType()) + { + case D3D12DescriptorType::CBV: + { + resRefInfo.resClass = DXIL::ResourceClass::CBuffer; + resRefInfo.category = DescriptorCategory::ConstantBlock; + resRefInfo.type = VarType::ConstantBlock; + } + case D3D12DescriptorType::SRV: + { + ResourceId srvId = desc.GetResResourceId(); + ID3D12Resource *pResource = rm->GetCurrentAs(srvId); + if(pResource) + { + resRefInfo.resClass = DXIL::ResourceClass::SRV; + resRefInfo.category = DescriptorCategory::ReadOnlyResource; + resRefInfo.type = VarType::ReadOnlyResource; + D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = desc.GetSRV(); + if(srvDesc.ViewDimension == D3D12_SRV_DIMENSION_UNKNOWN) + srvDesc = MakeSRVDesc(pResource->GetDesc()); + + GlobalState::ViewFmt viewFmt; + if(srvDesc.Format != DXGI_FORMAT_UNKNOWN) + { + resRefInfo.srvData.dim = + (DXDebug::ResourceDimension)ConvertSRVResourceDimensionToResourceDimension( + srvDesc.ViewDimension); + + DXILDebug::FillViewFmtFromResourceFormat(srvDesc.Format, viewFmt); + resRefInfo.srvData.compType = + (DXDebug::ResourceRetType)ConvertCompTypeToResourceRetType(viewFmt.compType); + + D3D12_RESOURCE_DESC resDesc = pResource->GetDesc(); + resRefInfo.srvData.sampleCount = resDesc.SampleDesc.Count; + } + } + else + { + RDCERR("Unknown SRV resource at Descriptor Index %s", descriptorIndex); + return ResourceReferenceInfo(); + } + break; + } + case D3D12DescriptorType::UAV: + { + resRefInfo.resClass = DXIL::ResourceClass::UAV; + resRefInfo.category = DescriptorCategory::ReadWriteResource; + resRefInfo.type = VarType::ReadWriteResource; + break; + } + case D3D12DescriptorType::Sampler: + { + resRefInfo.resClass = DXIL::ResourceClass::Sampler; + resRefInfo.category = DescriptorCategory::Sampler; + resRefInfo.type = VarType::Sampler; + D3D12_SAMPLER_DESC2 samplerDesc = desc.GetSampler(); + // Don't think SAMPLER_MODE_MONO is supported in D3D12 (set for filter mode D3D10_FILTER_TEXT_1BIT) + resRefInfo.samplerData.samplerMode = + (DXDebug::SamplerMode)ConvertSamplerFilterToSamplerMode(samplerDesc.Filter); + break; + } + default: + RDCERR("Unhandled Descriptor Type %s", ToStr(desc.GetType()).c_str()); + return ResourceReferenceInfo(); + } + return resRefInfo; +} }; diff --git a/renderdoc/driver/d3d12/d3d12_dxil_debug.h b/renderdoc/driver/d3d12/d3d12_dxil_debug.h index 22a1fdb83..a02ad8237 100644 --- a/renderdoc/driver/d3d12/d3d12_dxil_debug.h +++ b/renderdoc/driver/d3d12/d3d12_dxil_debug.h @@ -60,6 +60,7 @@ public: ShaderVariable GetSampleInfo(DXIL::ResourceClass resClass, const DXDebug::BindingSlot &slot, const DXBC::ShaderType shaderType, const char *opString); ShaderVariable GetRenderTargetSampleInfo(const DXBC::ShaderType shaderType, const char *opString); + ResourceReferenceInfo GetResourceReferenceInfo(const DXDebug::BindingSlot &slot); private: WrappedID3D12Device *m_Device; diff --git a/renderdoc/driver/shaders/dxil/dxil_debug.h b/renderdoc/driver/shaders/dxil/dxil_debug.h index 766411583..959e2668b 100644 --- a/renderdoc/driver/shaders/dxil/dxil_debug.h +++ b/renderdoc/driver/shaders/dxil/dxil_debug.h @@ -161,6 +161,7 @@ public: const DXBC::ShaderType shaderType, const char *opString) = 0; virtual ShaderVariable GetRenderTargetSampleInfo(const DXBC::ShaderType shaderType, const char *opString) = 0; + virtual ResourceReferenceInfo GetResourceReferenceInfo(const DXDebug::BindingSlot &slot) = 0; }; struct MemoryTracking