mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-23 06:56:40 +00:00
Vulkan: Switch commands to use new image subresource tracking
Change-Id: Ic87e341239842e4b40aa06c751540e227b643083
This commit is contained in:
committed by
Baldur Karlsson
parent
accbca579c
commit
71ab0c508c
@@ -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 ®ion = 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 ®ion = 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 ®ion = 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 ®ion = 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user