Vulkan: Switch commands to use new image subresource tracking

Change-Id: Ic87e341239842e4b40aa06c751540e227b643083
This commit is contained in:
Benson Joeris
2019-06-18 15:54:23 +01:00
committed by Baldur Karlsson
parent accbca579c
commit 71ab0c508c
3 changed files with 83 additions and 43 deletions
+6 -3
View File
@@ -3136,9 +3136,6 @@ void VkResourceRecord::MarkBufferImageCopyFrameReferenced(VkResourceRecord *buf,
FrameRefType bufRefType,
FrameRefType imgRefType)
{
MarkResourceFrameReferenced(img->GetResourceID(), imgRefType);
MarkResourceFrameReferenced(img->baseResource, imgRefType);
if(IsDirtyFrameRef(imgRefType))
cmdInfo->dirtied.insert(img->GetResourceID());
@@ -3151,6 +3148,12 @@ void VkResourceRecord::MarkBufferImageCopyFrameReferenced(VkResourceRecord *buf,
{
const VkBufferImageCopy &region = regions[ri];
ImageRange range(region.imageSubresource);
range.offset = region.imageOffset;
range.extent = region.imageExtent;
MarkImageFrameReferenced(img, range, imgRefType);
VkFormat regionFormat = imgFormat;
uint32_t plane = 0;
switch(region.imageSubresource.aspectMask)
@@ -1249,12 +1249,7 @@ void WrappedVulkan::vkCmdBeginRenderPass(VkCommandBuffer commandBuffer,
if(att == NULL)
break;
record->MarkResourceFrameReferenced(att->baseResource, eFrameRef_ReadBeforeWrite);
if(att->baseResourceMem != ResourceId())
record->MarkResourceFrameReferenced(att->baseResourceMem, eFrameRef_Read);
if(att->resInfo)
record->cmdInfo->sparse.insert(att->resInfo);
record->cmdInfo->dirtied.insert(att->baseResource);
record->MarkImageViewFrameReferenced(att, ImageRange(), eFrameRef_ReadBeforeWrite);
}
record->cmdInfo->framebuffer = fb;
@@ -3834,11 +3829,8 @@ void WrappedVulkan::vkCmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer,
// as they might not even point to a valid object
if(write.descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER)
{
record->MarkResourceFrameReferenced(GetResID(write.pImageInfo[d].imageView),
eFrameRef_Read);
if(GetRecord(write.pImageInfo[d].imageView)->baseResource != ResourceId())
record->MarkResourceFrameReferenced(
GetRecord(write.pImageInfo[d].imageView)->baseResource, ref);
VkResourceRecord *view = GetRecord(write.pImageInfo[d].imageView);
record->MarkImageViewFrameReferenced(view, ImageRange(), ref);
}
if(write.descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER ||
@@ -3989,6 +3981,7 @@ void WrappedVulkan::vkCmdPushDescriptorSetWithTemplateKHR(
// since it's relatively expensive to walk the memory, we gather frame references at the same time
// as unwrapping
std::vector<rdcpair<ResourceId, FrameRefType> > frameRefs;
std::vector<rdcpair<VkImageView, FrameRefType> > imgViewFrameRefs;
std::vector<rdcpair<VkBufferView, FrameRefType> > bufViewFrameRefs;
std::vector<rdcpair<VkDescriptorBufferInfo, FrameRefType> > bufFrameRefs;
@@ -4049,6 +4042,7 @@ void WrappedVulkan::vkCmdPushDescriptorSetWithTemplateKHR(
frameRefs.push_back(make_rdcpair(GetResID(info->imageView), eFrameRef_Read));
if(GetRecord(info->imageView)->baseResource != ResourceId())
frameRefs.push_back(make_rdcpair(GetRecord(info->imageView)->baseResource, ref));
imgViewFrameRefs.push_back(make_rdcpair(info->imageView, ref));
info->imageView = Unwrap(info->imageView);
}
}
@@ -4088,6 +4082,11 @@ void WrappedVulkan::vkCmdPushDescriptorSetWithTemplateKHR(
record->MarkResourceFrameReferenced(GetResID(descriptorUpdateTemplate), eFrameRef_Read);
for(size_t i = 0; i < frameRefs.size(); i++)
record->MarkResourceFrameReferenced(frameRefs[i].first, frameRefs[i].second);
for(size_t i = 0; i < imgViewFrameRefs.size(); i++)
{
VkResourceRecord *view = GetRecord(imgViewFrameRefs[i].first);
record->MarkImageViewFrameReferenced(view, ImageRange(), imgViewFrameRefs[i].second);
}
for(size_t i = 0; i < bufViewFrameRefs.size(); i++)
record->MarkBufferViewFrameReferenced(GetRecord(bufViewFrameRefs[i].first),
bufViewFrameRefs[i].second);
@@ -1411,15 +1411,32 @@ void WrappedVulkan::vkCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcIma
record->AddChunk(scope.Get());
record->MarkResourceFrameReferenced(GetResID(srcImage), eFrameRef_Read);
record->MarkResourceFrameReferenced(GetRecord(srcImage)->baseResource, eFrameRef_Read);
record->MarkResourceFrameReferenced(GetResID(destImage), eFrameRef_PartialWrite);
record->MarkResourceFrameReferenced(GetRecord(destImage)->baseResource, eFrameRef_Read);
record->cmdInfo->dirtied.insert(GetResID(destImage));
if(GetRecord(srcImage)->resInfo)
record->cmdInfo->sparse.insert(GetRecord(srcImage)->resInfo);
if(GetRecord(destImage)->resInfo)
record->cmdInfo->sparse.insert(GetRecord(destImage)->resInfo);
for(uint32_t i = 0; i < regionCount; i++)
{
const VkImageBlit &region = pRegions[i];
ImageRange srcRange(region.srcSubresource);
srcRange.offset = {std::min(region.srcOffsets[0].x, region.srcOffsets[1].x),
std::min(region.srcOffsets[0].y, region.srcOffsets[1].y),
std::min(region.srcOffsets[0].z, region.srcOffsets[1].z)};
srcRange.extent = {
(uint32_t)(std::max(region.srcOffsets[0].x, region.srcOffsets[1].x) - srcRange.offset.x),
(uint32_t)(std::max(region.srcOffsets[0].y, region.srcOffsets[1].y) - srcRange.offset.y),
(uint32_t)(std::max(region.srcOffsets[0].z, region.srcOffsets[1].z) - srcRange.offset.z)};
ImageRange dstRange(region.dstSubresource);
dstRange.offset = {std::min(region.dstOffsets[0].x, region.dstOffsets[1].x),
std::min(region.dstOffsets[0].y, region.dstOffsets[1].y),
std::min(region.dstOffsets[0].z, region.dstOffsets[1].z)};
dstRange.extent = {
(uint32_t)(std::max(region.dstOffsets[0].x, region.dstOffsets[1].x) - dstRange.offset.x),
(uint32_t)(std::max(region.dstOffsets[0].y, region.dstOffsets[1].y) - dstRange.offset.y),
(uint32_t)(std::max(region.dstOffsets[0].z, region.dstOffsets[1].z) - dstRange.offset.z)};
record->MarkImageFrameReferenced(GetRecord(srcImage), srcRange, eFrameRef_Read);
record->MarkImageFrameReferenced(GetRecord(destImage), dstRange, eFrameRef_CompleteWrite);
}
}
}
@@ -1535,15 +1552,21 @@ void WrappedVulkan::vkCmdResolveImage(VkCommandBuffer commandBuffer, VkImage src
record->AddChunk(scope.Get());
record->MarkResourceFrameReferenced(GetResID(srcImage), eFrameRef_Read);
record->MarkResourceFrameReferenced(GetRecord(srcImage)->baseResource, eFrameRef_Read);
record->MarkResourceFrameReferenced(GetResID(destImage), eFrameRef_PartialWrite);
record->MarkResourceFrameReferenced(GetRecord(destImage)->baseResource, eFrameRef_Read);
record->cmdInfo->dirtied.insert(GetResID(destImage));
if(GetRecord(srcImage)->resInfo)
record->cmdInfo->sparse.insert(GetRecord(srcImage)->resInfo);
if(GetRecord(destImage)->resInfo)
record->cmdInfo->sparse.insert(GetRecord(destImage)->resInfo);
for(uint32_t i = 0; i < regionCount; i++)
{
const VkImageResolve &region = pRegions[i];
ImageRange srcRange(region.srcSubresource);
srcRange.offset = region.srcOffset;
srcRange.extent = region.extent;
ImageRange dstRange(region.dstSubresource);
dstRange.offset = region.dstOffset;
dstRange.extent = region.extent;
record->MarkImageFrameReferenced(GetRecord(srcImage), srcRange, eFrameRef_Read);
record->MarkImageFrameReferenced(GetRecord(destImage), dstRange, eFrameRef_CompleteWrite);
}
}
}
@@ -1657,15 +1680,21 @@ void WrappedVulkan::vkCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcIma
destImageLayout, regionCount, pRegions);
record->AddChunk(scope.Get());
record->MarkResourceFrameReferenced(GetResID(srcImage), eFrameRef_Read);
record->MarkResourceFrameReferenced(GetRecord(srcImage)->baseResource, eFrameRef_Read);
record->MarkResourceFrameReferenced(GetResID(destImage), eFrameRef_PartialWrite);
record->MarkResourceFrameReferenced(GetRecord(destImage)->baseResource, eFrameRef_Read);
record->cmdInfo->dirtied.insert(GetResID(destImage));
if(GetRecord(srcImage)->resInfo)
record->cmdInfo->sparse.insert(GetRecord(srcImage)->resInfo);
if(GetRecord(destImage)->resInfo)
record->cmdInfo->sparse.insert(GetRecord(destImage)->resInfo);
for(uint32_t i = 0; i < regionCount; i++)
{
const VkImageCopy &region = pRegions[i];
ImageRange srcRange(region.srcSubresource);
srcRange.offset = region.srcOffset;
srcRange.extent = region.extent;
ImageRange dstRange(region.dstSubresource);
dstRange.offset = region.dstOffset;
dstRange.extent = region.extent;
record->MarkImageFrameReferenced(GetRecord(srcImage), srcRange, eFrameRef_Read);
record->MarkImageFrameReferenced(GetRecord(destImage), dstRange, eFrameRef_CompleteWrite);
}
}
}
@@ -1771,7 +1800,7 @@ void WrappedVulkan::vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuff
record->AddChunk(scope.Get());
record->MarkBufferImageCopyFrameReferenced(GetRecord(srcBuffer), GetRecord(destImage),
regionCount, pRegions, eFrameRef_Read,
eFrameRef_PartialWrite);
eFrameRef_CompleteWrite);
}
}
@@ -2096,12 +2125,16 @@ void WrappedVulkan::vkCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage
pRanges);
record->AddChunk(scope.Get());
record->MarkResourceFrameReferenced(GetResID(image), eFrameRef_PartialWrite);
record->MarkResourceFrameReferenced(GetRecord(image)->baseResource, eFrameRef_Read);
record->cmdInfo->dirtied.insert(GetResID(image));
VkResourceRecord *imageRecord = GetRecord(image);
if(imageRecord->resInfo && imageRecord->resInfo->IsSparse())
record->cmdInfo->sparse.insert(imageRecord->resInfo);
for(uint32_t i = 0; i < rangeCount; i++)
{
record->MarkImageFrameReferenced(imageRecord, pRanges[i], eFrameRef_CompleteWrite);
}
}
}
@@ -2211,6 +2244,11 @@ void WrappedVulkan::vkCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, V
VkResourceRecord *imageRecord = GetRecord(image);
if(imageRecord->resInfo && imageRecord->resInfo->IsSparse())
record->cmdInfo->sparse.insert(imageRecord->resInfo);
for(uint32_t i = 0; i < rangeCount; i++)
{
record->MarkImageFrameReferenced(imageRecord, pRanges[i], eFrameRef_CompleteWrite);
}
}
}