Eliminated MarkDirtyWithWriteReference

because it is interfering with the reference
tracking for skipping cleared or don't care
renderpasses
This commit is contained in:
thisisjimmyfb
2020-06-01 11:58:56 -07:00
committed by Baldur Karlsson
parent 58a6d7eb76
commit 52967ad291
5 changed files with 37 additions and 22 deletions
+8
View File
@@ -853,6 +853,14 @@ void VulkanResourceManager::MarkMemoryFrameReferenced(ResourceId mem, VkDeviceSi
SCOPED_LOCK(m_Lock);
FrameRefType maxRef = MarkMemoryReferenced(m_MemFrameRefs, mem, offset, size, refType);
if(maxRef == eFrameRef_CompleteWrite)
{
// check and make sure this is really a CompleteWrite
VkResourceRecord *record = GetResourceRecord(mem);
// if we are not writing the entire memory, degrade it to a partial write
if(offset != 0 || size != record->Length)
maxRef = eFrameRef_PartialWrite;
}
MarkResourceFrameReferenced(mem, maxRef, ComposeFrameRefsDisjoint);
}
-6
View File
@@ -455,12 +455,6 @@ public:
bool IsResourceTrackedForPersistency(WrappedVkRes *const &res);
void MarkDirtyWithWriteReference(ResourceId id)
{
MarkResourceFrameReferenced(id, eFrameRef_ReadBeforeWrite);
MarkDirtyResource(id);
}
private:
bool ResourceTypeRelease(WrappedVkRes *res);
+3 -1
View File
@@ -3523,7 +3523,9 @@ bool FramebufferInfo::AttachmentFullyReferenced(size_t attachmentIndex, const Re
}
// if view doesn't reference the entire image
if(att->viewRange.baseArrayLayer != 0 ||
att->viewRange.layerCount() != (uint32_t)att->resInfo->imageInfo.layerCount)
att->viewRange.layerCount() != (uint32_t)att->resInfo->imageInfo.layerCount ||
att->viewRange.baseMipLevel != 0 ||
att->viewRange.levelCount() != (uint32_t)att->resInfo->imageInfo.levelCount)
{
return false;
}
@@ -910,7 +910,7 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount,
it != record->bakedCommands->cmdInfo->dirtied.end(); ++it)
{
if(GetResourceManager()->HasCurrentResource(*it))
GetResourceManager()->MarkDirtyWithWriteReference(*it);
GetResourceManager()->MarkDirtyResource(*it);
}
// with EXT_descriptor_indexing a binding might have been updated after
@@ -931,7 +931,7 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount,
refit->second.second == eFrameRef_ReadBeforeWrite)
{
if(GetResourceManager()->HasCurrentResource(refit->first))
GetResourceManager()->MarkDirtyWithWriteReference(refit->first);
GetResourceManager()->MarkDirtyResource(refit->first);
}
}
}
@@ -1119,7 +1119,7 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount,
state.mapFlushed = false;
}
GetResourceManager()->MarkDirtyWithWriteReference(record->GetResourceID());
GetResourceManager()->MarkDirtyResource(record->GetResourceID());
}
else
{
@@ -704,7 +704,10 @@ void WrappedVulkan::vkUnmapMemory(VkDevice device, VkDeviceMemory mem)
capframe = IsActiveCapturing(m_State);
if(!capframe)
GetResourceManager()->MarkDirtyWithWriteReference(id);
{
GetResourceManager()->MarkResourceFrameReferenced(id, eFrameRef_PartialWrite);
GetResourceManager()->MarkDirtyResource(id);
}
}
SCOPED_LOCK(state.mrLock);
@@ -861,8 +864,9 @@ VkResult WrappedVulkan::vkFlushMappedMemoryRanges(VkDevice device, uint32_t memR
}
ResourceId memid = GetResID(pMemRanges[i].memory);
VkResourceRecord *record = GetRecord(pMemRanges[i].memory);
MemMapState *state = GetRecord(pMemRanges[i].memory)->memMapState;
MemMapState *state = record->memMapState;
state->mapFlushed = true;
if(state->mappedPtr == NULL)
@@ -880,12 +884,16 @@ VkResult WrappedVulkan::vkFlushMappedMemoryRanges(VkDevice device, uint32_t memR
if(size == VK_WHOLE_SIZE)
size = state->mapOffset + state->mapSize - offs;
GetResourceManager()->MarkMemoryFrameReferenced(GetResID(pMemRanges[i].memory), offs, size,
eFrameRef_CompleteWrite);
GetResourceManager()->MarkMemoryFrameReferenced(memid, offs, size, eFrameRef_CompleteWrite);
}
else
{
GetResourceManager()->MarkDirtyWithWriteReference(memid);
FrameRefType refType = eFrameRef_PartialWrite;
if(pMemRanges[i].offset == 0 && pMemRanges[i].size >= record->Length)
refType = eFrameRef_CompleteWrite;
GetResourceManager()->MarkResourceFrameReferenced(memid, refType);
GetResourceManager()->MarkDirtyResource(memid);
}
}
}
@@ -989,13 +997,15 @@ VkResult WrappedVulkan::vkBindBufferMemory(VkDevice device, VkBuffer buffer, VkD
chunk = scope.Get();
}
ResourceId id = GetResID(memory);
// memory object bindings are immutable and must happen before creation or use,
// so this can always go into the record, even if a resource is created and bound
// to memory mid-frame
record->AddChunk(chunk);
record->AddParent(GetRecord(memory));
record->baseResource = GetResID(memory);
record->baseResource = id;
record->memOffset = memoryOffset;
// if the buffer was force-referenced, do the same with the memory
@@ -1005,11 +1015,11 @@ VkResult WrappedVulkan::vkBindBufferMemory(VkDevice device, VkBuffer buffer, VkD
// read-before-write referenced
GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(),
eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkMemoryFrameReferenced(GetResID(memory), memoryOffset,
record->memSize, eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkMemoryFrameReferenced(id, memoryOffset, record->memSize,
eFrameRef_ReadBeforeWrite);
// the memory is immediately dirty because we have no way of tracking writes to it
GetResourceManager()->MarkDirtyWithWriteReference(GetResID(memory));
GetResourceManager()->MarkDirtyResource(id);
}
}
@@ -1314,7 +1324,7 @@ VkResult WrappedVulkan::vkCreateBuffer(VkDevice device, const VkBufferCreateInfo
// buffers are always bound opaquely and in arbitrary divisions, sparse residency
// only means not all the buffer needs to be bound, which is not that interesting for
// our purposes. We just need to make sure sparse buffers are dirty.
GetResourceManager()->MarkDirtyWithWriteReference(id);
GetResourceManager()->MarkDirtyResource(id);
}
if(isSparse || isExternal)
@@ -1793,7 +1803,8 @@ VkResult WrappedVulkan::vkCreateImage(VkDevice device, const VkImageCreateInfo *
// not be valid to map from/into if the image isn't in GENERAL layout).
if(isSparse || isExternal || isLinear)
{
GetResourceManager()->MarkDirtyWithWriteReference(id);
GetResourceManager()->MarkResourceFrameReferenced(id, eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkDirtyResource(id);
// for external images, try creating a non-external version and take the worst case of
// memory requirements, in case the non-external one (as we will replay it) needs more
@@ -2129,7 +2140,7 @@ VkResult WrappedVulkan::vkBindBufferMemory2(VkDevice device, uint32_t bindInfoCo
eFrameRef_ReadBeforeWrite);
// the memory is immediately dirty because we have no way of tracking writes to it
GetResourceManager()->MarkDirtyWithWriteReference(GetResID(pBindInfos[i].memory));
GetResourceManager()->MarkDirtyResource(GetResID(pBindInfos[i].memory));
}
}
}