mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-07-30 19:31:07 +00:00
Mark memory as dirty when bound to sparse resources
This commit is contained in:
@@ -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())
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user