From edbedd44844857e0745591dc04730c70ddebdc1d Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 3 Feb 2020 21:10:26 +0000 Subject: [PATCH] Try to handle no shared memory types between external & normal resources * This cannot be replayed, as the memory type selected will be invalid on replay for the buffer. However this lets us at least capture and if the buffer is destroyed or not used in the capture, the capture would succeed, so it's at least no worse. --- .../vulkan/wrappers/vk_resource_funcs.cpp | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp index 0fa830e66..8662733ac 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp @@ -1318,7 +1318,16 @@ VkResult WrappedVulkan::vkCreateBuffer(VkDevice device, const VkBufferCreateInfo record->resInfo->memreqs.size = RDCMAX(record->resInfo->memreqs.size, mrq.size); record->resInfo->memreqs.alignment = RDCMAX(record->resInfo->memreqs.size, mrq.alignment); - record->resInfo->memreqs.memoryTypeBits &= mrq.memoryTypeBits; + if((resInfo.memreqs.memoryTypeBits & mrq.memoryTypeBits) == 0) + { + RDCWARN( + "External buffer shares no memory types with non-external buffer. This buffer " + "will not be replayable."); + } + else + { + record->resInfo->memreqs.memoryTypeBits &= mrq.memoryTypeBits; + } } } else @@ -1782,7 +1791,17 @@ VkResult WrappedVulkan::vkCreateImage(VkDevice device, const VkImageCreateInfo * resInfo.memreqs.size = RDCMAX(resInfo.memreqs.size, mrq.size); resInfo.memreqs.alignment = RDCMAX(resInfo.memreqs.size, mrq.alignment); - resInfo.memreqs.memoryTypeBits &= mrq.memoryTypeBits; + + if((resInfo.memreqs.memoryTypeBits & mrq.memoryTypeBits) == 0) + { + RDCWARN( + "External image shares no memory types with non-external image. This image " + "will not be replayable."); + } + else + { + resInfo.memreqs.memoryTypeBits &= mrq.memoryTypeBits; + } } } else