From 666e6730df1976baf68a9412ea60c9bccf490bb2 Mon Sep 17 00:00:00 2001 From: Benson Joeris Date: Thu, 30 May 2019 15:10:24 -0400 Subject: [PATCH] Vulkan: Add image view tracking for command buffer records Change-Id: I60718d7d7dbadd0e1ed1c8072d87f2de49282f08 --- renderdoc/driver/vulkan/vk_resources.cpp | 34 +++++++++++++++++++ renderdoc/driver/vulkan/vk_resources.h | 24 +++++++++++++ .../vulkan/wrappers/vk_resource_funcs.cpp | 1 + 3 files changed, 59 insertions(+) diff --git a/renderdoc/driver/vulkan/vk_resources.cpp b/renderdoc/driver/vulkan/vk_resources.cpp index 69403825a..9a30c98ff 100644 --- a/renderdoc/driver/vulkan/vk_resources.cpp +++ b/renderdoc/driver/vulkan/vk_resources.cpp @@ -3070,6 +3070,40 @@ void VkResourceRecord::MarkImageFrameReferenced(VkResourceRecord *img, const Ima id, maxRef, [](FrameRefType x, FrameRefType y) -> FrameRefType { return std::max(x, y); }); } +void VkResourceRecord::MarkImageViewFrameReferenced(VkResourceRecord *view, const ImageRange &range, + FrameRefType refType) +{ + ResourceId img = view->baseResource; + ResourceId mem = view->baseResourceMem; + + // mark image view as read + MarkResourceFrameReferenced(view->GetResourceID(), eFrameRef_Read); + + // mark memory backing image as read + MarkResourceFrameReferenced(mem, eFrameRef_Read); + + if(refType != eFrameRef_Read && refType != eFrameRef_None) + cmdInfo->dirtied.insert(img); + + ImageRange imgRange; + imgRange.aspectMask = view->viewRange.aspectMask; + imgRange.baseMipLevel = view->viewRange.baseMipLevel + range.baseMipLevel; + imgRange.levelCount = range.levelCount; + imgRange.baseArrayLayer = view->viewRange.baseArrayLayer + range.baseArrayLayer; + imgRange.layerCount = range.layerCount; + imgRange.offset = range.offset; + imgRange.extent = range.extent; + imgRange.viewType = view->viewRange.viewType(); + + FrameRefType maxRef = + MarkImageReferenced(cmdInfo->imgFrameRefs, img, view->resInfo->imageInfo, imgRange, refType); + + // maintain the reference type of the image itself as the maximum reference type of any + // subresource + MarkResourceFrameReferenced( + img, maxRef, [](FrameRefType x, FrameRefType y) -> FrameRefType { return std::max(x, y); }); +} + void VkResourceRecord::MarkMemoryFrameReferenced(ResourceId mem, VkDeviceSize offset, VkDeviceSize size, FrameRefType refType) { diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 5691dbc09..644718771 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -1483,6 +1483,8 @@ public: void MarkMemoryFrameReferenced(ResourceId mem, VkDeviceSize offset, VkDeviceSize size, FrameRefType refType); void MarkImageFrameReferenced(VkResourceRecord *img, const ImageRange &range, FrameRefType refType); + void MarkImageViewFrameReferenced(VkResourceRecord *view, const ImageRange &range, + FrameRefType refType); void MarkBufferFrameReferenced(VkResourceRecord *buf, VkDeviceSize offset, VkDeviceSize size, FrameRefType refType); void MarkBufferImageCopyFrameReferenced(VkResourceRecord *buf, VkResourceRecord *img, @@ -1526,6 +1528,7 @@ public: levelCount = 1; baseArrayLayer = 0; layerCount = 1; + packedViewType = 7; } ViewRange &operator=(const VkImageSubresourceRange &range) @@ -1568,6 +1571,27 @@ public: return ret; } + inline VkImageViewType viewType() const + { + if(packedViewType <= VK_IMAGE_VIEW_TYPE_END_RANGE) + return (VkImageViewType)packedViewType; + else + return VK_IMAGE_VIEW_TYPE_MAX_ENUM; + } + + inline void setViewType(VkImageViewType t) + { + if(t <= VK_IMAGE_VIEW_TYPE_END_RANGE) + packedViewType = t; + else + packedViewType = 7; + } + + // View type (VkImageViewType). + // Values <= 6, fits in 3 bits; 7 encodes an unknown/uninitialized view type. + // Stored as uint32_t instead of VkImageViewType to prevent signed extension. + uint32_t packedViewType : 3; + // only need 4 bits for the aspects uint32_t aspectMask : 4; diff --git a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp index a43c8ff76..d082ec664 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp @@ -1879,6 +1879,7 @@ VkResult WrappedVulkan::vkCreateImageView(VkDevice device, const VkImageViewCrea record->baseResourceMem = imageRecord->baseResource; record->resInfo = imageRecord->resInfo; record->viewRange = pCreateInfo->subresourceRange; + record->viewRange.setViewType(pCreateInfo->viewType); } else {