From 107077fde2f64acc88064a722a3a9d3e35c64613 Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 30 Aug 2021 14:34:28 +0100 Subject: [PATCH] Patch image view usage to match framebuffer usage * This is all a result of us adding extra usage to images - for imageless framebuffers the usage needs to match so we need to patch the framebuffer usage at create time. Then if image views are used that have specified usage subset we need to patch that too. --- renderdoc/driver/vulkan/vk_core.h | 2 + .../vulkan/wrappers/vk_resource_funcs.cpp | 62 +++++++++++++++++-- 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 9e282f749..43d3183aa 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -850,6 +850,8 @@ private: void PatchAttachment(VkFramebufferAttachmentImageInfo *att, VkFormat imgFormat, VkSampleCountFlagBits samples); + void PatchImageViewUsage(VkImageViewUsageCreateInfo *usage, VkFormat imgFormat, + VkSampleCountFlagBits samples); VkIndirectPatchData FetchIndirectData(VkIndirectPatchType type, VkCommandBuffer commandBuffer, VkBuffer dataBuffer, VkDeviceSize dataOffset, uint32_t count, diff --git a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp index ffc4ba8d8..d6665541c 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp @@ -2475,6 +2475,30 @@ VkResult WrappedVulkan::vkCreateImage(VkDevice device, const VkImageCreateInfo * return ret; } +void WrappedVulkan::PatchImageViewUsage(VkImageViewUsageCreateInfo *usage, VkFormat imgFormat, + VkSampleCountFlagBits samples) +{ + // this matches the mutations we do to images, so see vkCreateImage + usage->usage |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT; + usage->usage |= VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; + usage->usage &= ~VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT; + + if(samples != VK_SAMPLE_COUNT_1_BIT) + { + usage->usage |= VK_IMAGE_USAGE_SAMPLED_BIT; + + if(!IsDepthOrStencilFormat(imgFormat)) + { + if(GetDebugManager() && GetShaderCache()->IsArray2MSSupported()) + usage->usage |= VK_IMAGE_USAGE_STORAGE_BIT; + } + else + { + usage->usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; + } + } +} + // Image view functions template @@ -2494,9 +2518,20 @@ bool WrappedVulkan::Serialise_vkCreateImageView(SerialiserType &ser, VkDevice de { VkImageView view = VK_NULL_HANDLE; - VkImageViewCreateInfo unwrappedInfo = CreateInfo; - unwrappedInfo.image = Unwrap(unwrappedInfo.image); - VkResult ret = ObjDisp(device)->CreateImageView(Unwrap(device), &unwrappedInfo, NULL, &view); + byte *tempMem = GetTempMemory(GetNextPatchSize(&CreateInfo)); + VkImageViewCreateInfo *unwrappedInfo = UnwrapStructAndChain(m_State, tempMem, &CreateInfo); + + VkImageViewUsageCreateInfo *usageInfo = (VkImageViewUsageCreateInfo *)FindNextStruct( + unwrappedInfo, VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO); + + if(usageInfo) + { + VkSampleCountFlagBits samples = m_CreationInfo.m_Image[GetResID(CreateInfo.image)].samples; + + PatchImageViewUsage(usageInfo, CreateInfo.format, samples); + } + + VkResult ret = ObjDisp(device)->CreateImageView(Unwrap(device), unwrappedInfo, NULL, &view); APIProps.YUVTextures |= IsYUVFormat(CreateInfo.format); @@ -2540,11 +2575,26 @@ bool WrappedVulkan::Serialise_vkCreateImageView(SerialiserType &ser, VkDevice de VkResult WrappedVulkan::vkCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkImageView *pView) { - VkImageViewCreateInfo unwrappedInfo = *pCreateInfo; - unwrappedInfo.image = Unwrap(unwrappedInfo.image); + byte *tempMem = GetTempMemory(GetNextPatchSize(pCreateInfo)); + VkImageViewCreateInfo *unwrappedInfo = UnwrapStructAndChain(m_State, tempMem, pCreateInfo); + + VkImageViewUsageCreateInfo *usageInfo = (VkImageViewUsageCreateInfo *)FindNextStruct( + unwrappedInfo, VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO); + + if(usageInfo) + { + VkSampleCountFlagBits samples; + if(IsCaptureMode(m_State)) + samples = (VkSampleCountFlagBits)GetRecord(pCreateInfo->image)->resInfo->imageInfo.sampleCount; + else + samples = m_CreationInfo.m_Image[GetResID(pCreateInfo->image)].samples; + + PatchImageViewUsage(usageInfo, pCreateInfo->format, samples); + } + VkResult ret; SERIALISE_TIME_CALL( - ret = ObjDisp(device)->CreateImageView(Unwrap(device), &unwrappedInfo, pAllocator, pView)); + ret = ObjDisp(device)->CreateImageView(Unwrap(device), unwrappedInfo, pAllocator, pView)); if(ret == VK_SUCCESS) {