From 71ab0c508c0f8b65bd8f89303d290e9d8acfa51a Mon Sep 17 00:00:00 2001 From: Benson Joeris Date: Thu, 30 May 2019 15:10:39 -0400 Subject: [PATCH] Vulkan: Switch commands to use new image subresource tracking Change-Id: Ic87e341239842e4b40aa06c751540e227b643083 --- renderdoc/driver/vulkan/vk_resources.cpp | 9 +- .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 21 ++-- .../driver/vulkan/wrappers/vk_draw_funcs.cpp | 96 +++++++++++++------ 3 files changed, 83 insertions(+), 43 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_resources.cpp b/renderdoc/driver/vulkan/vk_resources.cpp index 9a30c98ff..74e1fc260 100644 --- a/renderdoc/driver/vulkan/vk_resources.cpp +++ b/renderdoc/driver/vulkan/vk_resources.cpp @@ -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) diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 2a2fe05f5..6f9274791 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -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 > frameRefs; + std::vector > imgViewFrameRefs; std::vector > bufViewFrameRefs; std::vector > 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); diff --git a/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp index 87f1f4fc0..3ee415df6 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp @@ -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); + } } }