From 7cc54fea20d5b153c8bdbdbe84785fc9b1ebc97e Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 13 Aug 2020 17:53:10 +0100 Subject: [PATCH] Pass resource record into AddBindRefs when available * This avoids a redundant call to GetResourceRecord when the caller already has it directly available. --- renderdoc/driver/vulkan/vk_common.cpp | 54 ++++++++++++------- renderdoc/driver/vulkan/vk_common.h | 2 + .../vulkan/wrappers/vk_descriptor_funcs.cpp | 9 +++- 3 files changed, 44 insertions(+), 21 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index 291a67094..50078c50e 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -1105,41 +1105,55 @@ void DescriptorSetSlot::RemoveBindRefs(std::set &ids, VulkanResource imageInfo.sampler = ResourceId(); } -void DescriptorSetSlot::AddBindRefs(std::set &ids, VulkanResourceManager *rm, - VkResourceRecord *record, FrameRefType ref) +void DescriptorSetSlot::AddBindRefs(std::set &ids, VkResourceRecord *bufView, + VkResourceRecord *imgView, VkResourceRecord *buffer, + VkResourceRecord *descSetRecord, FrameRefType ref) { - SCOPED_LOCK(record->descInfo->refLock); + SCOPED_LOCK(descSetRecord->descInfo->refLock); - if(texelBufferView != ResourceId()) + if(bufView) { - VkResourceRecord *bufView = rm->GetResourceRecord(texelBufferView); - record->AddBindFrameRef(ids, bufView->GetResourceID(), eFrameRef_Read, - bufView->resInfo && bufView->resInfo->IsSparse()); + descSetRecord->AddBindFrameRef(ids, bufView->GetResourceID(), eFrameRef_Read, + bufView->resInfo && bufView->resInfo->IsSparse()); if(bufView->baseResource != ResourceId()) - record->AddBindFrameRef(ids, bufView->baseResource, eFrameRef_Read); + descSetRecord->AddBindFrameRef(ids, bufView->baseResource, eFrameRef_Read); if(bufView->baseResourceMem != ResourceId()) - record->AddMemFrameRef(ids, bufView->baseResourceMem, bufView->memOffset, bufView->memSize, - ref); + descSetRecord->AddMemFrameRef(ids, bufView->baseResourceMem, bufView->memOffset, + bufView->memSize, ref); } - if(imageInfo.imageView != ResourceId()) + if(imgView) { - VkResourceRecord *view = rm->GetResourceRecord(imageInfo.imageView); - record->AddImgFrameRef(ids, view, ref); + descSetRecord->AddImgFrameRef(ids, imgView, ref); } if(imageInfo.sampler != ResourceId()) { - record->AddBindFrameRef(ids, imageInfo.sampler, eFrameRef_Read); + descSetRecord->AddBindFrameRef(ids, imageInfo.sampler, eFrameRef_Read); } - if(bufferInfo.buffer != ResourceId()) + if(buffer) { - VkResourceRecord *buf = rm->GetResourceRecord(bufferInfo.buffer); - record->AddBindFrameRef(ids, bufferInfo.buffer, eFrameRef_Read, - buf->resInfo && buf->resInfo->IsSparse()); - if(buf->baseResource != ResourceId()) - record->AddMemFrameRef(ids, buf->baseResource, buf->memOffset, buf->memSize, ref); + descSetRecord->AddBindFrameRef(ids, bufferInfo.buffer, eFrameRef_Read, + buffer->resInfo && buffer->resInfo->IsSparse()); + if(buffer->baseResource != ResourceId()) + descSetRecord->AddMemFrameRef(ids, buffer->baseResource, buffer->memOffset, buffer->memSize, + ref); } } +void DescriptorSetSlot::AddBindRefs(std::set &ids, VulkanResourceManager *rm, + VkResourceRecord *descSetRecord, FrameRefType ref) +{ + VkResourceRecord *bufView = NULL, *imgView = NULL, *buffer = NULL; + + if(texelBufferView != ResourceId()) + bufView = rm->GetResourceRecord(texelBufferView); + if(imageInfo.imageView != ResourceId()) + imgView = rm->GetResourceRecord(imageInfo.imageView); + if(bufferInfo.buffer != ResourceId()) + buffer = rm->GetResourceRecord(bufferInfo.buffer); + + AddBindRefs(ids, bufView, imgView, buffer, descSetRecord, ref); +} + void DescriptorSetData::UpdateBackgroundRefCache(VulkanResourceManager *resourceManager, const std::set &ids) { diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index fee517e7b..09b3ea2bb 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -433,6 +433,8 @@ struct DescriptorSetSlot void RemoveBindRefs(std::set &ids, VulkanResourceManager *rm, VkResourceRecord *record); void AddBindRefs(std::set &ids, VulkanResourceManager *rm, VkResourceRecord *record, FrameRefType ref); + void AddBindRefs(std::set &ids, VkResourceRecord *bufView, VkResourceRecord *imgView, + VkResourceRecord *buffer, VkResourceRecord *descSetRecord, FrameRefType ref); // VkDescriptorBufferInfo DescriptorSetSlotBufferInfo bufferInfo; diff --git a/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp index dda80e71e..ccd86b9db 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp @@ -1122,10 +1122,13 @@ void WrappedVulkan::vkUpdateDescriptorSets(VkDevice device, uint32_t writeCount, bind.RemoveBindRefs(ids, GetResourceManager(), record); + VkResourceRecord *bufView = NULL, *imgView = NULL, *buffer = NULL; + if(descWrite.descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER || descWrite.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER) { bind.texelBufferView = GetResID(descWrite.pTexelBufferView[d]); + bufView = GetRecord(descWrite.pTexelBufferView[d]); } else if(descWrite.descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER || descWrite.descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER || @@ -1146,6 +1149,9 @@ void WrappedVulkan::vkUpdateDescriptorSets(VkDevice device, uint32_t writeCount, imageView = false; bind.imageInfo.SetFrom(descWrite.pImageInfo[d], sampler, imageView); + + if(imageView) + imgView = GetRecord(descWrite.pImageInfo[d].imageView); } else if(descWrite.descriptorType == VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT) { @@ -1161,9 +1167,10 @@ void WrappedVulkan::vkUpdateDescriptorSets(VkDevice device, uint32_t writeCount, else { bind.bufferInfo.SetFrom(descWrite.pBufferInfo[d]); + buffer = GetRecord(descWrite.pBufferInfo[d].buffer); } - bind.AddBindRefs(ids, GetResourceManager(), record, ref); + bind.AddBindRefs(ids, bufView, imgView, buffer, record, ref); } record->descInfo->UpdateBackgroundRefCache(GetResourceManager(), ids);