Pass resource record into AddBindRefs when available

* This avoids a redundant call to GetResourceRecord when the caller already has
  it directly available.
This commit is contained in:
baldurk
2020-08-13 17:53:10 +01:00
parent 88c6dc27e4
commit 7cc54fea20
3 changed files with 44 additions and 21 deletions
+34 -20
View File
@@ -1105,41 +1105,55 @@ void DescriptorSetSlot::RemoveBindRefs(std::set<ResourceId> &ids, VulkanResource
imageInfo.sampler = ResourceId();
}
void DescriptorSetSlot::AddBindRefs(std::set<ResourceId> &ids, VulkanResourceManager *rm,
VkResourceRecord *record, FrameRefType ref)
void DescriptorSetSlot::AddBindRefs(std::set<ResourceId> &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<ResourceId> &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<ResourceId> &ids)
{
+2
View File
@@ -433,6 +433,8 @@ struct DescriptorSetSlot
void RemoveBindRefs(std::set<ResourceId> &ids, VulkanResourceManager *rm, VkResourceRecord *record);
void AddBindRefs(std::set<ResourceId> &ids, VulkanResourceManager *rm, VkResourceRecord *record,
FrameRefType ref);
void AddBindRefs(std::set<ResourceId> &ids, VkResourceRecord *bufView, VkResourceRecord *imgView,
VkResourceRecord *buffer, VkResourceRecord *descSetRecord, FrameRefType ref);
// VkDescriptorBufferInfo
DescriptorSetSlotBufferInfo bufferInfo;
@@ -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);