Vulkan: Add image subresource tracking for descriptor set records

Change-Id: Ic336b5e65435743729e85ed231ad114f556b3811
This commit is contained in:
Benson Joeris
2019-05-30 15:10:32 -04:00
committed by Baldur Karlsson
parent 666e6730df
commit accbca579c
4 changed files with 38 additions and 6 deletions
+2 -5
View File
@@ -933,11 +933,8 @@ void DescriptorSetBindingElement::AddBindRefs(VkResourceRecord *record, FrameRef
}
if(imageInfo.imageView != VK_NULL_HANDLE)
{
record->AddBindFrameRef(GetResID(imageInfo.imageView), eFrameRef_Read,
GetRecord(imageInfo.imageView)->resInfo != NULL);
record->AddBindFrameRef(GetRecord(imageInfo.imageView)->baseResource, ref);
if(GetRecord(imageInfo.imageView)->baseResourceMem != ResourceId())
record->AddBindFrameRef(GetRecord(imageInfo.imageView)->baseResourceMem, eFrameRef_Read);
VkResourceRecord *view = GetRecord(imageInfo.imageView);
record->AddImgFrameRef(view, ref);
}
if(imageInfo.sampler != VK_NULL_HANDLE)
{
+1 -1
View File
@@ -1346,4 +1346,4 @@ DECLARE_REFLECTION_ENUM(VkVertexInputRate);
// win32 only enums
#if ENABLED(RDOC_WIN32)
DECLARE_REFLECTION_ENUM(VkFullScreenExclusiveEXT);
#endif
#endif
+34
View File
@@ -1016,6 +1016,7 @@ struct DescriptorSetData
static const uint32_t SPARSE_REF_BIT = 0x80000000;
std::map<ResourceId, rdcpair<uint32_t, FrameRefType> > bindFrameRefs;
std::map<ResourceId, MemRefs> bindMemRefs;
std::map<ResourceId, ImgRefs> bindImgRefs;
};
struct PipelineLayoutData
@@ -1410,6 +1411,39 @@ public:
}
}
void AddImgFrameRef(VkResourceRecord *view, FrameRefType refType)
{
AddBindFrameRef(view->GetResourceID(), eFrameRef_Read,
view->resInfo && view->resInfo->IsSparse());
if(view->baseResourceMem != ResourceId())
AddBindFrameRef(view->baseResourceMem, eFrameRef_Read, false);
rdcpair<uint32_t, FrameRefType> &p = descInfo->bindFrameRefs[view->baseResource];
if((p.first & ~DescriptorSetData::SPARSE_REF_BIT) == 0)
{
descInfo->bindImgRefs.erase(view->baseResource);
p.first = 1;
p.second = eFrameRef_None;
}
else
{
p.first++;
}
ImageRange imgRange;
imgRange.aspectMask = view->viewRange.aspectMask;
imgRange.baseMipLevel = view->viewRange.baseMipLevel;
imgRange.levelCount = view->viewRange.levelCount;
imgRange.baseArrayLayer = view->viewRange.baseArrayLayer;
imgRange.layerCount = view->viewRange.layerCount;
imgRange.viewType = view->viewRange.viewType();
FrameRefType maxRef = MarkImageReferenced(descInfo->bindImgRefs, view->baseResource,
view->resInfo->imageInfo, imgRange, refType);
p.second = std::max(p.second, maxRef);
}
void AddMemFrameRef(ResourceId mem, VkDeviceSize offset, VkDeviceSize size, FrameRefType refType)
{
if(mem == ResourceId())
@@ -864,6 +864,7 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount,
GetResourceManager()->MarkSparseMapReferenced(sparserecord->resInfo);
}
}
GetResourceManager()->MergeReferencedImages(setrecord->descInfo->bindImgRefs);
GetResourceManager()->MergeReferencedMemory(setrecord->descInfo->bindMemRefs);
}