Mark memory as dirty when bound to sparse resources

This commit is contained in:
baldurk
2022-09-15 14:49:42 +01:00
parent d61f10d27c
commit 58b96be4f2
3 changed files with 19 additions and 7 deletions
+8 -2
View File
@@ -4178,7 +4178,8 @@ void VkResourceRecord::MarkBufferViewFrameReferenced(VkResourceRecord *bufView,
refType);
}
void ResourceInfo::Update(uint32_t numBindings, const VkSparseImageMemoryBind *pBindings)
void ResourceInfo::Update(uint32_t numBindings, const VkSparseImageMemoryBind *pBindings,
std::set<ResourceId> &memories)
{
// update texel mappings
for(uint32_t i = 0; i < numBindings; i++)
@@ -4194,10 +4195,13 @@ void ResourceInfo::Update(uint32_t numBindings, const VkSparseImageMemoryBind *p
sub, {(uint32_t)bind.offset.x, (uint32_t)bind.offset.y, (uint32_t)bind.offset.z},
{bind.extent.width, bind.extent.height, bind.extent.depth}, GetResID(bind.memory),
bind.memoryOffset, false);
memories.insert(GetResID(bind.memory));
}
}
void ResourceInfo::Update(uint32_t numBindings, const VkSparseMemoryBind *pBindings)
void ResourceInfo::Update(uint32_t numBindings, const VkSparseMemoryBind *pBindings,
std::set<ResourceId> &memories)
{
// update mip tail mappings
const bool isBuffer = (imageInfo.extent.width == 0);
@@ -4206,6 +4210,8 @@ void ResourceInfo::Update(uint32_t numBindings, const VkSparseMemoryBind *pBindi
{
const VkSparseMemoryBind &bind = pBindings[i];
memories.insert(GetResID(bind.memory));
// don't need to figure out which aspect we're in if we only have one table
if(isBuffer || altSparseAspects.empty())
{
+4 -2
View File
@@ -1004,8 +1004,10 @@ struct ResourceInfo
ImageInfo imageInfo;
bool IsSparse() const { return sparseTable.getPageByteSize() > 0; }
void Update(uint32_t numBindings, const VkSparseMemoryBind *pBindings);
void Update(uint32_t numBindings, const VkSparseImageMemoryBind *pBindings);
void Update(uint32_t numBindings, const VkSparseMemoryBind *pBindings,
std::set<ResourceId> &memories);
void Update(uint32_t numBindings, const VkSparseImageMemoryBind *pBindings,
std::set<ResourceId> &memories);
};
struct MemRefs
@@ -1875,26 +1875,30 @@ VkResult WrappedVulkan::vkQueueBindSparse(VkQueue queue, uint32_t bindInfoCount,
// update our internal page tables
if(IsCaptureMode(m_State))
{
std::set<ResourceId> memories;
for(uint32_t i = 0; i < bindInfoCount; i++)
{
for(uint32_t buf = 0; buf < pBindInfo[i].bufferBindCount; buf++)
{
const VkSparseBufferMemoryBindInfo &bind = pBindInfo[i].pBufferBinds[buf];
GetRecord(bind.buffer)->resInfo->Update(bind.bindCount, bind.pBinds);
GetRecord(bind.buffer)->resInfo->Update(bind.bindCount, bind.pBinds, memories);
}
for(uint32_t op = 0; op < pBindInfo[i].imageOpaqueBindCount; op++)
{
const VkSparseImageOpaqueMemoryBindInfo &bind = pBindInfo[i].pImageOpaqueBinds[op];
GetRecord(bind.image)->resInfo->Update(bind.bindCount, bind.pBinds);
GetRecord(bind.image)->resInfo->Update(bind.bindCount, bind.pBinds, memories);
}
for(uint32_t op = 0; op < pBindInfo[i].imageBindCount; op++)
{
const VkSparseImageMemoryBindInfo &bind = pBindInfo[i].pImageBinds[op];
GetRecord(bind.image)->resInfo->Update(bind.bindCount, bind.pBinds);
GetRecord(bind.image)->resInfo->Update(bind.bindCount, bind.pBinds, memories);
}
}
for(ResourceId id : memories)
GetResourceManager()->MarkDirtyResource(id);
}
return ret;