From e13f0e882a4269e6ff6adb3e5f714ae45e591bf8 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 3 Jan 2019 17:25:36 +0000 Subject: [PATCH] version-detect AMD unreliable image memory requirements needing padding * From driver 2.0.33 (18.5.2) onwards, the image memory requirements don't vary randomly so don't need any padding. * It should only be applied also for the AMD binary driver. --- renderdoc/driver/vulkan/vk_common.cpp | 4 ++++ renderdoc/driver/vulkan/vk_common.h | 6 ++++++ renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp | 5 +++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index 668865a5c..896ddf8ac 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -738,6 +738,10 @@ VkDriverInfo::VkDriverInfo(const VkPhysicalDeviceProperties &physProps) if(Major() < 1) texelFetchBrokenDriver = true; + + // driver 18.5.2 which is vulkan version >= 2.0.33 contains the fix + if(physProps.driverVersion < VK_MAKE_VERSION(2, 0, 33)) + unreliableImgMemReqs = true; } #endif diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index a67c994d1..9fb8bd0d0 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -192,6 +192,11 @@ public: // A workaround for a couple of bugs, removing texelFetch use from shaders. // It means broken functionality but at least no instant crashes bool TexelFetchBrokenDriver() { return texelFetchBrokenDriver; } + // Older AMD driver versions could sometimes cause image memory requirements to vary randomly + // between identical images. This means the memory required at capture could be less than at + // replay. To counteract this, on drivers with this issue we pad out the memory requirements + // enough to account for the change + bool UnreliableImageMemoryRequirements() { return unreliableImgMemReqs; } // another workaround, on some AMD driver versions creating an MSAA image with STORAGE_BIT // causes graphical corruption trying to sample from it. We workaround it by preventing the // MSAA <-> Array pipelines from creating, which removes the STORAGE_BIT and skips the copies. @@ -207,6 +212,7 @@ private: uint32_t m_Major, m_Minor, m_Patch; bool texelFetchBrokenDriver = false; + bool unreliableImgMemReqs = false; bool amdStorageMSAABrokenDriver = false; bool qualcommLeakingUBOOffsets = false; }; diff --git a/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp index bea473382..72c355c7b 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp @@ -284,7 +284,7 @@ void WrappedVulkan::vkGetImageMemoryRequirements(VkDevice device, VkImage image, // allow for this. The variability isn't quite clear, but for now we assume aligning size to // alignment * 4 should be sufficient (adding on a fixed padding won't help the problem as it // won't remove the variability, nor will adding then aligning for the same reason). - if(GetDriverVersion().Vendor() == GPUVendor::AMD && pMemoryRequirements->size > 0) + if(GetDriverInfo().UnreliableImageMemoryRequirements() && pMemoryRequirements->size > 0) { VkMemoryRequirements &memreq = *pMemoryRequirements; @@ -376,7 +376,8 @@ void WrappedVulkan::vkGetImageMemoryRequirements2(VkDevice device, // allow for this. The variability isn't quite clear, but for now we assume aligning size to // alignment * 4 should be sufficient (adding on a fixed padding won't help the problem as it // won't remove the variability, nor will adding then aligning for the same reason). - if(GetDriverVersion().Vendor() == GPUVendor::AMD && pMemoryRequirements->memoryRequirements.size > 0) + if(GetDriverInfo().UnreliableImageMemoryRequirements() && + pMemoryRequirements->memoryRequirements.size > 0) { VkMemoryRequirements &memreq = pMemoryRequirements->memoryRequirements;