From a9534bcc690140016c8eb3e8cb04d5a9f6c63e6b Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 17 Jul 2026 16:50:08 +0100 Subject: [PATCH] Use resource class as part of key for caching resource info --- renderdoc/driver/d3d12/d3d12_dxil_debug.cpp | 7 ++++--- renderdoc/driver/d3d12/d3d12_dxil_debug.h | 10 +++++++--- renderdoc/driver/shaders/dxil/dxil_debug.cpp | 2 +- renderdoc/driver/shaders/dxil/dxil_debug.h | 3 ++- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_dxil_debug.cpp b/renderdoc/driver/d3d12/d3d12_dxil_debug.cpp index 26149c40e..6d8146be7 100644 --- a/renderdoc/driver/d3d12/d3d12_dxil_debug.cpp +++ b/renderdoc/driver/d3d12/d3d12_dxil_debug.cpp @@ -1947,10 +1947,11 @@ bool D3D12APIWrapper::QueuedOpsHasSpace() const } // Called from any thread -bool D3D12APIWrapper::IsResourceInfoCached(const DXDebug::BindingSlot &slot, uint32_t mipLevel) +bool D3D12APIWrapper::IsResourceInfoCached(DXIL::ResourceClass resClass, + const DXDebug::BindingSlot &slot, uint32_t mipLevel) { SCOPED_READLOCK(m_ResourceInfosLock); - ResourceInfoMiplevel resInfoMip = {slot, mipLevel}; + ResourceInfoMiplevel resInfoMip = {resClass, slot, mipLevel}; return m_ResourceInfos.find(resInfoMip) != m_ResourceInfos.end(); } @@ -1959,7 +1960,7 @@ bool D3D12APIWrapper::IsResourceInfoCached(const DXDebug::BindingSlot &slot, uin ShaderVariable D3D12APIWrapper::GetResourceInfo(DXIL::ResourceClass resClass, const DXDebug::BindingSlot &slot, uint32_t mipLevel) { - ResourceInfoMiplevel resInfoMip = {slot, mipLevel}; + ResourceInfoMiplevel resInfoMip = {resClass, slot, mipLevel}; { SCOPED_READLOCK(m_ResourceInfosLock); auto it = m_ResourceInfos.find(resInfoMip); diff --git a/renderdoc/driver/d3d12/d3d12_dxil_debug.h b/renderdoc/driver/d3d12/d3d12_dxil_debug.h index 9cae66f45..965b3928e 100644 --- a/renderdoc/driver/d3d12/d3d12_dxil_debug.h +++ b/renderdoc/driver/d3d12/d3d12_dxil_debug.h @@ -80,7 +80,8 @@ public: bool IsCBVCached(const DXDebug::BindingSlot &slot) const override; bool IsSRVCached(const DXDebug::BindingSlot &slot) const override; bool IsUAVCached(const DXDebug::BindingSlot &slot) const override; - bool IsResourceInfoCached(const DXDebug::BindingSlot &slot, uint32_t mipLevel) override; + bool IsResourceInfoCached(DXIL::ResourceClass resClass, const DXDebug::BindingSlot &slot, + uint32_t mipLevel) override; bool IsSampleInfoCached(const DXDebug::BindingSlot &slot) override; bool IsRenderTargetSampleInfoCached() override; bool IsResourceReferenceInfoCached(const DXDebug::BindingSlot &slot) override; @@ -166,19 +167,22 @@ private: struct ResourceInfoMiplevel { + DXIL::ResourceClass resClass; BindingSlot slot; uint32_t mipLevel; bool operator<(const ResourceInfoMiplevel &o) const { - if(mipLevel == o.mipLevel) + if(resClass != o.resClass) + return resClass < o.resClass; + if(!(slot == o.slot)) return slot < o.slot; return mipLevel < o.mipLevel; } bool operator==(const ResourceInfoMiplevel &o) const { - return slot == o.slot && mipLevel == o.mipLevel; + return resClass == o.resClass && slot == o.slot && mipLevel == o.mipLevel; } }; diff --git a/renderdoc/driver/shaders/dxil/dxil_debug.cpp b/renderdoc/driver/shaders/dxil/dxil_debug.cpp index fef6e1d1e..838e10d48 100644 --- a/renderdoc/driver/shaders/dxil/dxil_debug.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_debug.cpp @@ -10600,7 +10600,7 @@ DeviceOpResult Debugger::GetResourceInfo(DXIL::ResourceClass resClass, const DXDebug::BindingSlot &slot, uint32_t mipLevel, ShaderVariable &result) const { - if(!IsDeviceThread() && !m_ApiWrapper->IsResourceInfoCached(slot, mipLevel)) + if(!IsDeviceThread() && !m_ApiWrapper->IsResourceInfoCached(resClass, slot, mipLevel)) return DeviceOpResult::NeedsDevice; result = m_ApiWrapper->GetResourceInfo(resClass, slot, mipLevel); diff --git a/renderdoc/driver/shaders/dxil/dxil_debug.h b/renderdoc/driver/shaders/dxil/dxil_debug.h index fb8b56671..c1504a385 100644 --- a/renderdoc/driver/shaders/dxil/dxil_debug.h +++ b/renderdoc/driver/shaders/dxil/dxil_debug.h @@ -343,7 +343,8 @@ public: virtual bool IsCBVCached(const DXDebug::BindingSlot &slot) const = 0; virtual bool IsSRVCached(const DXDebug::BindingSlot &slot) const = 0; virtual bool IsUAVCached(const DXDebug::BindingSlot &slot) const = 0; - virtual bool IsResourceInfoCached(const DXDebug::BindingSlot &slot, uint32_t mipLevel) = 0; + virtual bool IsResourceInfoCached(DXIL::ResourceClass resClass, const DXDebug::BindingSlot &slot, + uint32_t mipLevel) = 0; virtual bool IsSampleInfoCached(const DXDebug::BindingSlot &slot) = 0; virtual bool IsRenderTargetSampleInfoCached() = 0; virtual bool IsResourceReferenceInfoCached(const DXDebug::BindingSlot &slot) = 0;