diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 118b783a9..990710ed6 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -7102,21 +7102,23 @@ void WrappedVulkan::AddUsage(VulkanActionTreeNode &actionNode, rdcarrayreadOnlyResources) { - AddUsageForBind(actionNode, debugMessages, res.fixedBindSetOrSpace, res.fixedBindNumber, - ResourceUsage(uint32_t(ResourceUsage::VS_Resource) + shad)); + AddUsageForDescriptorSetBind(actionNode, debugMessages, res.fixedBindSetOrSpace, + res.fixedBindNumber, + ResourceUsage(uint32_t(ResourceUsage::VS_Resource) + shad)); } for(const ShaderResource &res : sh.refl->readWriteResources) { - AddUsageForBind(actionNode, debugMessages, res.fixedBindSetOrSpace, res.fixedBindNumber, - ResourceUsage(uint32_t(ResourceUsage::VS_RWResource) + shad)); + AddUsageForDescriptorSetBind(actionNode, debugMessages, res.fixedBindSetOrSpace, + res.fixedBindNumber, + ResourceUsage(uint32_t(ResourceUsage::VS_RWResource) + shad)); } } @@ -7127,9 +7129,9 @@ void WrappedVulkan::AddUsage(VulkanActionTreeNode &actionNode, rdcarray &debugMessages, uint32_t bindset, - uint32_t bind, ResourceUsage usage) +void WrappedVulkan::AddUsageForDescriptorSetBind(VulkanActionTreeNode &actionNode, + rdcarray &debugMessages, + uint32_t bindset, uint32_t bind, ResourceUsage usage) { static bool hugeRangeWarned = false; uint32_t eid = actionNode.action.eventId; @@ -7148,8 +7150,12 @@ void WrappedVulkan::AddUsageForBind(VulkanActionTreeNode &actionNode, msg.source = MessageSource::IncorrectAPIUse; msg.severity = MessageSeverity::High; - if(bindset >= descSets.size() || descSets[bindset].descSet == ResourceId()) + if(bindset >= descSets.size() || !descSets[bindset].IsBound()) { + // can't generate usage for descriptor buffers + if(!state.descBufs.empty()) + return; + msg.description = StringFormat::Fmt("Shader referenced a descriptor set %i that was not bound", bindset); debugMessages.push_back(msg); @@ -7210,51 +7216,58 @@ void WrappedVulkan::AddUsageForBind(VulkanActionTreeNode &actionNode, if(!descset.data.binds[bind]) return; - DescriptorSetSlot &slot = descset.data.binds[bind][a]; - - // handled as part of the framebuffer attachments - if(slot.type == DescriptorSlotType::InputAttachment) - return; - - // ignore unwritten descriptors - if(slot.type == DescriptorSlotType::Unwritten) - return; - - // we don't mark samplers with usage - if(slot.type == DescriptorSlotType::Sampler) - return; - - ResourceId id; - - switch(slot.type) - { - case DescriptorSlotType::CombinedImageSampler: - case DescriptorSlotType::SampledImage: - case DescriptorSlotType::StorageImage: - if(slot.resource != ResourceId()) - id = c.m_ImageView[slot.resource].image; - break; - case DescriptorSlotType::UniformTexelBuffer: - case DescriptorSlotType::StorageTexelBuffer: - if(slot.resource != ResourceId()) - id = c.m_BufferView[slot.resource].buffer; - break; - case DescriptorSlotType::UniformBuffer: - case DescriptorSlotType::UniformBufferDynamic: - case DescriptorSlotType::StorageBuffer: - case DescriptorSlotType::StorageBufferDynamic: - case DescriptorSlotType::AccelerationStructure: - if(slot.resource != ResourceId()) - id = slot.resource; - break; - default: RDCERR("Unexpected type %d", slot.type); break; - } - - if(id != ResourceId()) - actionNode.resourceUsage.push_back(make_rdcpair(id, EventUsage(eid, usage))); + AddUsageForDescriptor(actionNode, descset.data.binds[bind][a], usage); } } +void WrappedVulkan::AddUsageForDescriptor(VulkanActionTreeNode &actionNode, + const DescriptorSetSlot &slot, ResourceUsage usage) +{ + VulkanCreationInfo &c = m_CreationInfo; + uint32_t eid = actionNode.action.eventId; + + // handled as part of the framebuffer attachments + if(slot.type == DescriptorSlotType::InputAttachment) + return; + + // ignore unwritten descriptors + if(slot.type == DescriptorSlotType::Unwritten) + return; + + // we don't mark samplers with usage + if(slot.type == DescriptorSlotType::Sampler) + return; + + ResourceId id; + + switch(slot.type) + { + case DescriptorSlotType::CombinedImageSampler: + case DescriptorSlotType::SampledImage: + case DescriptorSlotType::StorageImage: + if(slot.resource != ResourceId()) + id = c.m_ImageView[slot.resource].image; + break; + case DescriptorSlotType::UniformTexelBuffer: + case DescriptorSlotType::StorageTexelBuffer: + if(slot.resource != ResourceId()) + id = c.m_BufferView[slot.resource].buffer; + break; + case DescriptorSlotType::UniformBuffer: + case DescriptorSlotType::UniformBufferDynamic: + case DescriptorSlotType::StorageBuffer: + case DescriptorSlotType::StorageBufferDynamic: + case DescriptorSlotType::AccelerationStructure: + if(slot.resource != ResourceId()) + id = slot.resource; + break; + default: RDCERR("Unexpected type %d", slot.type); break; + } + + if(id != ResourceId()) + actionNode.resourceUsage.push_back(make_rdcpair(id, EventUsage(eid, usage))); +} + void WrappedVulkan::AddFramebufferUsage(VulkanActionTreeNode &actionNode, const VulkanRenderState &renderState) { diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index a45280557..b800a3c48 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -1231,8 +1231,11 @@ private: void AddEvent(); void AddUsage(VulkanActionTreeNode &actionNode, rdcarray &debugMessages); - void AddUsageForBind(VulkanActionTreeNode &actionNode, rdcarray &debugMessages, - uint32_t bindset, uint32_t bind, ResourceUsage usage); + void AddUsageForDescriptorSetBind(VulkanActionTreeNode &actionNode, + rdcarray &debugMessages, uint32_t bindset, + uint32_t bind, ResourceUsage usage); + void AddUsageForDescriptor(VulkanActionTreeNode &actionNode, const DescriptorSetSlot &slot, + ResourceUsage usage); void AddFramebufferUsage(VulkanActionTreeNode &actionNode, const VulkanRenderState &renderState); void AddFramebufferUsageAllChildren(VulkanActionTreeNode &actionNode, diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 9b38bc421..c898361b3 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -8756,6 +8756,10 @@ bool WrappedVulkan::Serialise_vkCmdBindDescriptorBuffersEXT( } else { + // track while reading, as while we can't track resource usage for descriptor buffers we want + // to know we're using them + m_BakedCmdBufferInfo[m_LastCmdBufferID].state.descBufs.resize(bufferCount); + ObjDisp(commandBuffer) ->CmdBindDescriptorBuffersEXT(Unwrap(commandBuffer), bufferCount, unwrappedInfos.data()); } @@ -8860,6 +8864,15 @@ bool WrappedVulkan::Serialise_vkCmdSetDescriptorBufferOffsetsEXT( } else { + // track while reading, as while we can't track resource usage for descriptor buffers we want + // to know we're using them + for(VkPipelineBindPoint bindPoint : + {VK_PIPELINE_BIND_POINT_GRAPHICS, VK_PIPELINE_BIND_POINT_COMPUTE, + VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR}) + { + m_BakedCmdBufferInfo[m_LastCmdBufferID].state.GetPipeline(bindPoint).descSets.clear(); + } + ObjDisp(commandBuffer) ->CmdSetDescriptorBufferOffsetsEXT(Unwrap(commandBuffer), pipelineBindPoint, Unwrap(layout), firstSet, setCount, pBufferIndices, pOffsets);