From ceb062b6583bcee679cdca0ba7ed74feca636ce0 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 7 May 2025 14:50:12 +0100 Subject: [PATCH] Add a DescriptorType to GetDescriptors query * This will be optional in many cases but for some situations might be required when type information is not implicitly available in the descriptor store. Generally it should always be available unless the descriptor store is being viewed 'blank' purely from its contents with no other context. --- qrenderdoc/Windows/DescriptorViewer.cpp | 11 ++- .../D3D11PipelineStateViewer.cpp | 2 + .../D3D12PipelineStateViewer.cpp | 7 +- .../PipelineState/GLPipelineStateViewer.cpp | 2 + qrenderdoc/Windows/ShaderViewer.cpp | 9 ++- qrenderdoc/Windows/TextureViewer.cpp | 7 +- renderdoc/api/replay/common_pipestate.h | 7 +- renderdoc/api/replay/control_types.h | 11 ++- renderdoc/api/replay/shader_types.h | 27 +++---- renderdoc/driver/d3d12/d3d12_dxil_debug.cpp | 44 +++++++---- renderdoc/driver/d3d12/d3d12_dxil_debug.h | 3 +- renderdoc/driver/shaders/dxil/dxil_debug.cpp | 74 ++++++++++++++++--- renderdoc/driver/shaders/dxil/dxil_debug.h | 6 +- renderdoc/driver/vulkan/vk_shaderdebug.cpp | 7 +- renderdoc/replay/renderdoc_serialise.inl | 3 +- renderdoc/replay/replay_controller.cpp | 7 +- 16 files changed, 156 insertions(+), 71 deletions(-) diff --git a/qrenderdoc/Windows/DescriptorViewer.cpp b/qrenderdoc/Windows/DescriptorViewer.cpp index 38114b756..34accea7a 100644 --- a/qrenderdoc/Windows/DescriptorViewer.cpp +++ b/qrenderdoc/Windows/DescriptorViewer.cpp @@ -1475,6 +1475,8 @@ void DescriptorViewer::ViewD3D12State() ranges[0].count = resourceDesc->descriptorCount; ranges[0].descriptorSize = resourceDesc->descriptorByteSize; ranges[0].offset = resourceDesc->firstDescriptorOffset; + // we are interpreting typeless descriptors, assume D3D12 can interpret it + ranges[0].type = DescriptorType::Unknown; descriptors = r->GetDescriptors(resourceDesc->resourceId, ranges); } } @@ -1487,6 +1489,8 @@ void DescriptorViewer::ViewD3D12State() ranges[0].count = samplerDesc->descriptorCount; ranges[0].descriptorSize = samplerDesc->descriptorByteSize; ranges[0].offset = samplerDesc->firstDescriptorOffset; + // we are interpreting typeless descriptors, assume D3D12 can interpret it + ranges[0].type = DescriptorType::Unknown; samplerDescriptors = r->GetSamplerDescriptors(samplerDesc->resourceId, ranges); } } @@ -1525,6 +1529,8 @@ void DescriptorViewer::OnEventChanged(uint32_t eventId) ranges[0].count = m_DescriptorStore.descriptorCount; ranges[0].descriptorSize = descSize; ranges[0].offset = m_DescriptorStore.firstDescriptorOffset; + // assume this descriptor store knows its type information and can interpret typeless descriptors + ranges[0].type = DescriptorType::Unknown; rdcarray descriptors = r->GetDescriptors(m_DescriptorStore.resourceId, ranges); rdcarray locations = @@ -1547,7 +1553,9 @@ void DescriptorViewer::OnEventChanged(uint32_t eventId) idx++; // combine contiguous ranges - if(!ranges.empty() && ranges.back().offset + ranges.back().count * descSize == i * descSize) + if(!ranges.empty() && + ranges.back().offset + ranges.back().count * descSize == i * descSize && + ranges.back().type == descriptors[i].type) { ranges.back().count++; } @@ -1557,6 +1565,7 @@ void DescriptorViewer::OnEventChanged(uint32_t eventId) range.offset = m_DescriptorStore.firstDescriptorOffset + uint32_t(i * descSize); range.descriptorSize = descSize; range.count = 1; + range.type = descriptors[i].type; ranges.push_back(range); } } diff --git a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp index 31127575f..e8a83be75 100644 --- a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp @@ -498,6 +498,8 @@ void D3D11PipelineStateViewer::OnEventChanged(uint32_t eventId) range.offset = 0; range.descriptorSize = state->descriptorByteSize; range.count = state->descriptorCount; + // D3D11 doesn't need the descriptor type, it has internal type information + range.type = DescriptorType::Unknown; rdcarray ranges = {range}; diff --git a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp index adb682be9..d6da988db 100644 --- a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp @@ -528,15 +528,14 @@ void D3D12PipelineStateViewer::OnEventChanged(uint32_t eventId) // if the last range is contiguous with this access, append this access as a new range to query if(!ranges.empty() && ranges.back().descriptorSize == acc.byteSize && - ranges.back().offset + ranges.back().descriptorSize == acc.byteOffset) + ranges.back().offset + ranges.back().descriptorSize == acc.byteOffset && + ranges.back().type == acc.type) { ranges.back().count++; continue; } - DescriptorRange range; - range.offset = acc.byteOffset; - range.descriptorSize = acc.byteSize; + DescriptorRange range = acc; ranges.push_back(range); } diff --git a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp index f9555fbe6..391cfdb0d 100644 --- a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp @@ -485,6 +485,8 @@ void GLPipelineStateViewer::OnEventChanged(uint32_t eventId) range.offset = 0; range.descriptorSize = state->descriptorByteSize; range.count = state->descriptorCount; + // GL doesn't need the descriptor type, it has internal type information + range.type = DescriptorType::Unknown; rdcarray ranges = {range}; diff --git a/qrenderdoc/Windows/ShaderViewer.cpp b/qrenderdoc/Windows/ShaderViewer.cpp index 1a2e580bf..267aef6bc 100644 --- a/qrenderdoc/Windows/ShaderViewer.cpp +++ b/qrenderdoc/Windows/ShaderViewer.cpp @@ -170,7 +170,7 @@ struct AccessedResourceTag { } AccessedResourceTag(ShaderDirectAccess acc, VarType t) - : resRef(acc), type(t), step(0), category(acc.category) + : resRef(acc), type(t), step(0), category(CategoryForDescriptorType(acc.type)) { } AccessedResourceTag(ShaderVariable var) : step(0), type(var.type) @@ -181,7 +181,7 @@ struct AccessedResourceTag { resRef.directAccess = true; resRef.access = var.GetDirectAccess(); - category = resRef.access.category; + category = CategoryForDescriptorType(resRef.access.type); } else { @@ -2979,6 +2979,7 @@ QString ShaderViewer::stringRep(const ShaderVariable &var, uint32_t row) ranges[0].count = 1; ranges[0].descriptorSize = access.byteSize; ranges[0].offset = access.byteOffset; + ranges[0].type = access.type; rdcarray locations = r->GetDescriptorLocations(access.descriptorStore, ranges); @@ -5249,7 +5250,7 @@ RDTreeWidgetItem *ShaderViewer::makeAccessedResourceNode(const ShaderVariable &v } else { - category = acc.category; + category = CategoryForDescriptorType(acc.type); bindIdx = m_ReadOnlyResources.indexOf(acc); } if(category != DescriptorCategory::ReadOnlyResource) @@ -5269,7 +5270,7 @@ RDTreeWidgetItem *ShaderViewer::makeAccessedResourceNode(const ShaderVariable &v } else { - category = acc.category; + category = CategoryForDescriptorType(acc.type); bindIdx = m_ReadWriteResources.indexOf(acc); } if(category != DescriptorCategory::ReadWriteResource) diff --git a/qrenderdoc/Windows/TextureViewer.cpp b/qrenderdoc/Windows/TextureViewer.cpp index 10fdde1d6..de35e9e96 100644 --- a/qrenderdoc/Windows/TextureViewer.cpp +++ b/qrenderdoc/Windows/TextureViewer.cpp @@ -3294,15 +3294,14 @@ void TextureViewer::OnEventChanged(uint32_t eventId) // if the last range is contiguous with this access, append this access as a new range to query if(!ranges.empty() && ranges.back().descriptorSize == update.access.byteSize && - ranges.back().offset + ranges.back().descriptorSize == update.access.byteOffset) + ranges.back().offset + ranges.back().descriptorSize == update.access.byteOffset && + ranges.back().type == update.access.type) { ranges.back().count++; continue; } - DescriptorRange range; - range.offset = update.access.byteOffset; - range.descriptorSize = update.access.byteSize; + DescriptorRange range = update.access; ranges.push_back(range); } diff --git a/renderdoc/api/replay/common_pipestate.h b/renderdoc/api/replay/common_pipestate.h index 95a8fd45e..dbe066477 100644 --- a/renderdoc/api/replay/common_pipestate.h +++ b/renderdoc/api/replay/common_pipestate.h @@ -653,8 +653,8 @@ struct DescriptorAccess } bool operator==(const ShaderDirectAccess &o) const { - return CategoryForDescriptorType(type) == o.category && descriptorStore == o.descriptorStore && - byteOffset == o.byteOffset && byteSize == o.byteSize; + return type == o.type && descriptorStore == o.descriptorStore && byteOffset == o.byteOffset && + byteSize == o.byteSize; } bool operator==(const DescriptorAccess &o) const { @@ -746,8 +746,7 @@ inline ShaderBindIndex::ShaderBindIndex(const DescriptorAccess &access) } inline ShaderDirectAccess::ShaderDirectAccess(const DescriptorAccess &access) - : ShaderDirectAccess(CategoryForDescriptorType(access.type), access.descriptorStore, - access.byteOffset, access.byteSize) + : ShaderDirectAccess(access.type, access.descriptorStore, access.byteOffset, access.byteSize) { } diff --git a/renderdoc/api/replay/control_types.h b/renderdoc/api/replay/control_types.h index 2e46cdc67..04641de9b 100644 --- a/renderdoc/api/replay/control_types.h +++ b/renderdoc/api/replay/control_types.h @@ -643,6 +643,7 @@ struct DescriptorRange { offset = access.byteOffset; descriptorSize = access.byteSize; + type = access.type; } DOCUMENT("The offset in the descriptor storage where the descriptor range starts."); @@ -651,11 +652,17 @@ struct DescriptorRange uint32_t descriptorSize = 1; DOCUMENT("The number of descriptors in this range."); uint32_t count = 1; + DOCUMENT(R"(The type of descriptor in the descriptor range. + +:type: DescriptorType +)"); + DescriptorType type = DescriptorType::Unknown; DOCUMENT(""); bool operator==(const DescriptorRange &o) const { - return offset == o.offset && descriptorSize == o.descriptorSize && count == o.count; + return offset == o.offset && descriptorSize == o.descriptorSize && count == o.count && + type == o.type; } bool operator<(const DescriptorRange &o) const { @@ -665,6 +672,8 @@ struct DescriptorRange return descriptorSize < o.descriptorSize; if(!(count == o.count)) return count < o.count; + if(!(type == o.type)) + return type < o.type; return false; } }; diff --git a/renderdoc/api/replay/shader_types.h b/renderdoc/api/replay/shader_types.h index ada23ad97..66dc7a05a 100644 --- a/renderdoc/api/replay/shader_types.h +++ b/renderdoc/api/replay/shader_types.h @@ -136,7 +136,7 @@ struct ShaderDirectAccess DOCUMENT(""); ShaderDirectAccess() { - category = DescriptorCategory::Unknown; + type = DescriptorType::Unknown; descriptorStore = ResourceId(); byteOffset = 0; byteSize = 0; @@ -144,20 +144,17 @@ struct ShaderDirectAccess ShaderDirectAccess(const ShaderDirectAccess &) = default; ShaderDirectAccess &operator=(const ShaderDirectAccess &) = default; - ShaderDirectAccess(DescriptorCategory category, ResourceId descriptorStore, uint32_t byteOffset, + ShaderDirectAccess(DescriptorType type, ResourceId descriptorStore, uint32_t byteOffset, uint32_t byteSize) - : category(category), - descriptorStore(descriptorStore), - byteOffset(byteOffset), - byteSize(byteSize) + : type(type), descriptorStore(descriptorStore), byteOffset(byteOffset), byteSize(byteSize) { } ShaderDirectAccess(const DescriptorAccess &access); bool operator<(const ShaderDirectAccess &o) const { - if(category != o.category) - return category < o.category; + if(type != o.type) + return type < o.type; if(descriptorStore != o.descriptorStore) return descriptorStore < o.descriptorStore; if(byteOffset != o.byteOffset) @@ -166,15 +163,15 @@ struct ShaderDirectAccess } bool operator==(const ShaderDirectAccess &o) const { - return category == o.category && descriptorStore == o.descriptorStore && - byteOffset == o.byteOffset && byteSize == o.byteSize; + return type == o.type && descriptorStore == o.descriptorStore && byteOffset == o.byteOffset && + byteSize == o.byteSize; } - DOCUMENT(R"(The category of the resource being accessed. + DOCUMENT(R"(The type of the resource being accessed. -:type: DescriptorCategory +:type: DescriptorType )"); - DescriptorCategory category; + DescriptorType type; DOCUMENT(R"(The backing storage of the descriptor. @@ -509,7 +506,7 @@ The :class:`ShaderDirectAccess` uniquely refers to a resource descriptor. )"); inline void SetDirectAccess(const ShaderDirectAccess &access) { - value.u32v[0] = (uint32_t)access.category; + value.u32v[0] = (uint32_t)access.type; value.u32v[1] = access.byteOffset; value.u32v[2] = access.byteSize; // This marks the variable as ShaderDirectAccess and not ShaderBindIndex @@ -532,7 +529,7 @@ The :class:`ShaderDirectAccess` uniquely refers to a resource descriptor. { ResourceId descriptorStore; memcpy(&descriptorStore, &value.u64v[2], sizeof(descriptorStore)); - return ShaderDirectAccess((DescriptorCategory)value.u64v[0], descriptorStore, value.u32v[1], + return ShaderDirectAccess((DescriptorType)value.u64v[0], descriptorStore, value.u32v[1], value.u32v[2]); } diff --git a/renderdoc/driver/d3d12/d3d12_dxil_debug.cpp b/renderdoc/driver/d3d12/d3d12_dxil_debug.cpp index 6f7e20780..01ab1d78a 100644 --- a/renderdoc/driver/d3d12/d3d12_dxil_debug.cpp +++ b/renderdoc/driver/d3d12/d3d12_dxil_debug.cpp @@ -1109,19 +1109,18 @@ ResourceReferenceInfo D3D12APIWrapper::GetResourceReferenceInfo(const DXDebug::B case D3D12DescriptorType::CBV: { resRefInfo.resClass = DXIL::ResourceClass::CBuffer; - resRefInfo.category = DescriptorCategory::ConstantBlock; - resRefInfo.type = VarType::ConstantBlock; + resRefInfo.descType = DescriptorType::ConstantBuffer; + resRefInfo.varType = VarType::ConstantBlock; } case D3D12DescriptorType::SRV: { + D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = desc.GetSRV(); 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(); + resRefInfo.varType = VarType::ReadOnlyResource; if(srvDesc.ViewDimension == D3D12_SRV_DIMENSION_UNKNOWN) srvDesc = MakeSRVDesc(pResource->GetDesc()); @@ -1145,20 +1144,37 @@ ResourceReferenceInfo D3D12APIWrapper::GetResourceReferenceInfo(const DXDebug::B RDCERR("Unknown SRV resource at Descriptor Index %u", descriptorIndex); return ResourceReferenceInfo(); } + + if(srvDesc.ViewDimension == D3D12_SRV_DIMENSION_RAYTRACING_ACCELERATION_STRUCTURE) + resRefInfo.descType = DescriptorType::AccelerationStructure; + else if(srvDesc.ViewDimension == D3D12_SRV_DIMENSION_BUFFER && + (srvDesc.Buffer.StructureByteStride > 0 || srvDesc.Format == DXGI_FORMAT_UNKNOWN)) + resRefInfo.descType = DescriptorType::Buffer; + else if(srvDesc.ViewDimension == D3D12_SRV_DIMENSION_BUFFER) + resRefInfo.descType = DescriptorType::TypedBuffer; + else + resRefInfo.descType = DescriptorType::Image; + break; } case D3D12DescriptorType::UAV: { + D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = desc.GetUAV(); resRefInfo.resClass = DXIL::ResourceClass::UAV; - resRefInfo.category = DescriptorCategory::ReadWriteResource; - resRefInfo.type = VarType::ReadWriteResource; + resRefInfo.varType = VarType::ReadWriteResource; + if(uavDesc.ViewDimension == D3D12_UAV_DIMENSION_BUFFER) + resRefInfo.descType = uavDesc.Format != DXGI_FORMAT_UNKNOWN + ? DescriptorType::ReadWriteTypedBuffer + : DescriptorType::ReadWriteBuffer; + else + resRefInfo.descType = DescriptorType::ReadWriteImage; break; } case D3D12DescriptorType::Sampler: { resRefInfo.resClass = DXIL::ResourceClass::Sampler; - resRefInfo.category = DescriptorCategory::Sampler; - resRefInfo.type = VarType::Sampler; + resRefInfo.descType = DescriptorType::Sampler; + resRefInfo.varType = 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 = @@ -1172,7 +1188,7 @@ ResourceReferenceInfo D3D12APIWrapper::GetResourceReferenceInfo(const DXDebug::B return resRefInfo; } -ShaderDirectAccess D3D12APIWrapper::GetShaderDirectAccess(DescriptorCategory category, +ShaderDirectAccess D3D12APIWrapper::GetShaderDirectAccess(DescriptorType type, const DXDebug::BindingSlot &slot) { const HeapDescriptorType heapType = slot.heapType; @@ -1196,8 +1212,8 @@ ShaderDirectAccess D3D12APIWrapper::GetShaderDirectAccess(DescriptorCategory cat { if(heapType == HeapDescriptorType::Sampler) { - RDCASSERTEQUAL(category, DescriptorCategory::Sampler); - return ShaderDirectAccess(category, rm->GetOriginalID(heapId), byteOffset, byteSize); + RDCASSERTEQUAL(CategoryForDescriptorType(type), DescriptorCategory::Sampler); + return ShaderDirectAccess(type, rm->GetOriginalID(heapId), byteOffset, byteSize); } } else @@ -1205,8 +1221,8 @@ ShaderDirectAccess D3D12APIWrapper::GetShaderDirectAccess(DescriptorCategory cat RDCASSERT(heapDesc.Type == D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); if(heapType == HeapDescriptorType::CBV_SRV_UAV) { - RDCASSERTNOTEQUAL(category, DescriptorCategory::Sampler); - return ShaderDirectAccess(category, rm->GetOriginalID(heapId), byteOffset, byteSize); + RDCASSERTNOTEQUAL(CategoryForDescriptorType(type), DescriptorCategory::Sampler); + return ShaderDirectAccess(type, rm->GetOriginalID(heapId), byteOffset, byteSize); } } } diff --git a/renderdoc/driver/d3d12/d3d12_dxil_debug.h b/renderdoc/driver/d3d12/d3d12_dxil_debug.h index ec51f7463..280eb8e0a 100644 --- a/renderdoc/driver/d3d12/d3d12_dxil_debug.h +++ b/renderdoc/driver/d3d12/d3d12_dxil_debug.h @@ -61,8 +61,7 @@ public: const DXBC::ShaderType shaderType, const char *opString); ShaderVariable GetRenderTargetSampleInfo(const DXBC::ShaderType shaderType, const char *opString); ResourceReferenceInfo GetResourceReferenceInfo(const DXDebug::BindingSlot &slot); - ShaderDirectAccess GetShaderDirectAccess(DescriptorCategory category, - const DXDebug::BindingSlot &slot); + ShaderDirectAccess GetShaderDirectAccess(DescriptorType type, const DXDebug::BindingSlot &slot); private: void FetchSRV(const D3D12Descriptor *resDescriptor, const BindingSlot &slot); diff --git a/renderdoc/driver/shaders/dxil/dxil_debug.cpp b/renderdoc/driver/shaders/dxil/dxil_debug.cpp index f2ff16c2b..a95bed5f9 100644 --- a/renderdoc/driver/shaders/dxil/dxil_debug.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_debug.cpp @@ -1604,28 +1604,82 @@ void ResourceReferenceInfo::Create(const DXIL::ResourceReference *resRef, uint32 srvData.sampleCount = resRef->resourceBase.srvData.sampleCount; srvData.compType = (DXDebug::ResourceRetType)ConvertComponentTypeToResourceRetType( resRef->resourceBase.srvData.compType); - type = VarType::ReadOnlyResource; - category = DescriptorCategory::ReadOnlyResource; + varType = VarType::ReadOnlyResource; + + switch(resRef->resourceBase.srvData.shape) + { + default: + RDCERR("Unexpected resource shape"); + descType = DescriptorType::Unknown; + break; + case ResourceKind::Texture1D: + case ResourceKind::Texture2D: + case ResourceKind::Texture2DMS: + case ResourceKind::Texture3D: + case ResourceKind::TextureCube: + case ResourceKind::Texture1DArray: + case ResourceKind::Texture2DArray: + case ResourceKind::Texture2DMSArray: + case ResourceKind::TextureCubeArray: + case ResourceKind::FeedbackTexture2D: + case ResourceKind::FeedbackTexture2DArray: descType = DescriptorType::Image; break; + case ResourceKind::TypedBuffer: + case ResourceKind::TBuffer: descType = DescriptorType::TypedBuffer; break; + case ResourceKind::RawBuffer: + case ResourceKind::StructuredBuffer: + case ResourceKind::StructuredBufferWithCounter: descType = DescriptorType::Buffer; break; + case ResourceKind::RTAccelerationStructure: + descType = DescriptorType::AccelerationStructure; + break; + } break; } case DXIL::ResourceClass::UAV: { - type = VarType::ReadWriteResource; - category = DescriptorCategory::ReadWriteResource; + varType = VarType::ReadWriteResource; + + switch(resRef->resourceBase.uavData.shape) + { + default: + RDCERR("Unexpected resource shape"); + descType = DescriptorType::Unknown; + break; + case ResourceKind::Texture1D: + case ResourceKind::Texture2D: + case ResourceKind::Texture2DMS: + case ResourceKind::Texture3D: + case ResourceKind::TextureCube: + case ResourceKind::Texture1DArray: + case ResourceKind::Texture2DArray: + case ResourceKind::Texture2DMSArray: + case ResourceKind::TextureCubeArray: + case ResourceKind::FeedbackTexture2D: + case ResourceKind::FeedbackTexture2DArray: descType = DescriptorType::ReadWriteImage; break; + case ResourceKind::TypedBuffer: + case ResourceKind::TBuffer: descType = DescriptorType::ReadWriteTypedBuffer; break; + case ResourceKind::RawBuffer: + case ResourceKind::StructuredBuffer: + case ResourceKind::StructuredBufferWithCounter: + descType = DescriptorType::ReadWriteBuffer; + break; + case ResourceKind::RTAccelerationStructure: + descType = DescriptorType::AccelerationStructure; + break; + } break; } case DXIL::ResourceClass::CBuffer: { - type = VarType::ConstantBlock; - category = DescriptorCategory::ConstantBlock; + varType = VarType::ConstantBlock; + descType = DescriptorType::ConstantBuffer; break; } case DXIL::ResourceClass::Sampler: { samplerData.samplerMode = ConvertSamplerKindToSamplerMode(resRef->resourceBase.samplerData.samplerType); - type = VarType::Sampler; - category = DescriptorCategory::Sampler; + varType = VarType::Sampler; + descType = DescriptorType::Sampler; break; } default: RDCERR("Unexpected resource class %s", ToStr(resClass).c_str()); break; @@ -2420,11 +2474,11 @@ bool ThreadState::ExecuteInstruction(DebugAPIWrapper *apiWrapper, RDCASSERT(m_DirectHeapAccessBindings.count(resultId) == 0); m_DirectHeapAccessBindings[resultId] = resRefInfo; - ShaderDirectAccess access = apiWrapper->GetShaderDirectAccess(resRefInfo.category, slot); + ShaderDirectAccess access = apiWrapper->GetShaderDirectAccess(resRefInfo.descType, slot); // Default to unannotated handle ClearAnnotatedHandle(result); rdcstr resName = m_Program.GetHandleAlias(result.name); - result.type = resRefInfo.type; + result.type = resRefInfo.varType; result.name = resName; result.SetDirectAccess(access); break; diff --git a/renderdoc/driver/shaders/dxil/dxil_debug.h b/renderdoc/driver/shaders/dxil/dxil_debug.h index 891895e60..645e7d2ec 100644 --- a/renderdoc/driver/shaders/dxil/dxil_debug.h +++ b/renderdoc/driver/shaders/dxil/dxil_debug.h @@ -138,8 +138,8 @@ struct ResourceReferenceInfo DXIL::ResourceClass resClass; BindingSlot binding; - DescriptorCategory category; - VarType type; + DescriptorType descType; + VarType varType; struct SRVData { @@ -197,7 +197,7 @@ public: virtual ShaderVariable GetRenderTargetSampleInfo(const DXBC::ShaderType shaderType, const char *opString) = 0; virtual ResourceReferenceInfo GetResourceReferenceInfo(const DXDebug::BindingSlot &slot) = 0; - virtual ShaderDirectAccess GetShaderDirectAccess(DescriptorCategory category, + virtual ShaderDirectAccess GetShaderDirectAccess(DescriptorType type, const DXDebug::BindingSlot &slot) = 0; }; diff --git a/renderdoc/driver/vulkan/vk_shaderdebug.cpp b/renderdoc/driver/vulkan/vk_shaderdebug.cpp index 2bf062f5d..15516e773 100644 --- a/renderdoc/driver/vulkan/vk_shaderdebug.cpp +++ b/renderdoc/driver/vulkan/vk_shaderdebug.cpp @@ -171,15 +171,14 @@ public: // if the last range is contiguous with this access, append this access as a new range to query if(!ranges.empty() && ranges.back().descriptorSize == acc.byteSize && - ranges.back().offset + ranges.back().descriptorSize == acc.byteOffset) + ranges.back().offset + ranges.back().descriptorSize == acc.byteOffset && + ranges.back().type == acc.type) { ranges.back().count++; continue; } - DescriptorRange range; - range.offset = acc.byteOffset; - range.descriptorSize = acc.byteSize; + DescriptorRange range = acc; ranges.push_back(range); } diff --git a/renderdoc/replay/renderdoc_serialise.inl b/renderdoc/replay/renderdoc_serialise.inl index 7ae4b4a4f..0af983e76 100644 --- a/renderdoc/replay/renderdoc_serialise.inl +++ b/renderdoc/replay/renderdoc_serialise.inl @@ -1059,8 +1059,9 @@ void DoSerialise(SerialiserType &ser, DescriptorRange &el) SERIALISE_MEMBER(offset); SERIALISE_MEMBER(descriptorSize); SERIALISE_MEMBER(count); + SERIALISE_MEMBER(type); - SIZE_CHECK(12); + SIZE_CHECK(16); } template diff --git a/renderdoc/replay/replay_controller.cpp b/renderdoc/replay/replay_controller.cpp index 5a1f27fe7..648e5800a 100644 --- a/renderdoc/replay/replay_controller.cpp +++ b/renderdoc/replay/replay_controller.cpp @@ -2327,15 +2327,14 @@ void ReplayController::FetchPipelineState(uint32_t eventId) // if the last range is contiguous with this access, append this access as a new range to query if(!ranges.empty() && ranges.back().descriptorSize == acc.byteSize && - ranges.back().offset + ranges.back().descriptorSize == acc.byteOffset) + ranges.back().offset + ranges.back().descriptorSize == acc.byteOffset && + ranges.back().type == acc.type) { ranges.back().count++; continue; } - DescriptorRange range; - range.offset = acc.byteOffset; - range.descriptorSize = acc.byteSize; + DescriptorRange range = acc; ranges.push_back(range); }