From d11c92d440c9778531582d387fe78a6b96cafe7d Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 6 Jan 2021 10:55:38 +0000 Subject: [PATCH] Fix crash with imageless framebuffers --- renderdoc/driver/vulkan/vk_resources.cpp | 7 ++++--- renderdoc/driver/vulkan/vk_resources.h | 3 ++- renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp | 6 ++++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_resources.cpp b/renderdoc/driver/vulkan/vk_resources.cpp index 67fdc0f0d..c5c626cae 100644 --- a/renderdoc/driver/vulkan/vk_resources.cpp +++ b/renderdoc/driver/vulkan/vk_resources.cpp @@ -3564,9 +3564,10 @@ FramebufferInfo::~FramebufferInfo() delete[] imageAttachments; } -bool FramebufferInfo::AttachmentFullyReferenced(size_t attachmentIndex, const RenderPassInfo *rpi) +bool FramebufferInfo::AttachmentFullyReferenced(size_t attachmentIndex, VkResourceRecord *att, + VkImageSubresourceRange viewRange, + const RenderPassInfo *rpi) { - VkResourceRecord *att = imageAttachments[attachmentIndex].record; // if framebuffer doesn't reference the entire image if(att->resInfo->imageInfo.extent.width != width || att->resInfo->imageInfo.extent.height != height) { @@ -3586,7 +3587,7 @@ bool FramebufferInfo::AttachmentFullyReferenced(size_t attachmentIndex, const Re uint32_t renderpass_viewmask = rpi->multiviewViewMaskTable[attachmentIndex]; return (int)Bits::CountOnes(renderpass_viewmask) == att->resInfo->imageInfo.layerCount; } - return imageAttachments[attachmentIndex].barrier.subresourceRange.layerCount == layers; + return viewRange.layerCount == layers; } int ImgRefs::GetAspectCount() const diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 87bf4b4ff..048acb536 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -1161,7 +1161,8 @@ struct FramebufferInfo FramebufferInfo(const VkFramebufferCreateInfo &ci); ~FramebufferInfo(); - bool AttachmentFullyReferenced(size_t attachmentIndex, const RenderPassInfo *rpi); + bool AttachmentFullyReferenced(size_t attachmentIndex, VkResourceRecord *attachment, + VkImageSubresourceRange viewRange, const RenderPassInfo *rpi); AttachmentInfo *imageAttachments; diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index b6f4ce188..f6575fe06 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -1624,7 +1624,8 @@ void WrappedVulkan::vkCmdBeginRenderPass(VkCommandBuffer commandBuffer, if(att == NULL) break; - bool framebuffer_reference_entire_attachment = fbInfo->AttachmentFullyReferenced(i, rpInfo); + bool framebuffer_reference_entire_attachment = + fbInfo->AttachmentFullyReferenced(i, att, att->viewRange, rpInfo); FrameRefType refType = eFrameRef_ReadBeforeWrite; @@ -2232,7 +2233,8 @@ void WrappedVulkan::vkCmdBeginRenderPass2(VkCommandBuffer commandBuffer, if(att == NULL) break; - bool framebuffer_reference_entire_attachment = fbInfo->AttachmentFullyReferenced(i, rpInfo); + bool framebuffer_reference_entire_attachment = + fbInfo->AttachmentFullyReferenced(i, att, att->viewRange, rpInfo); FrameRefType refType = eFrameRef_ReadBeforeWrite;