From 98ff358a3a16de9e4638cfa97d72373d94bcffc1 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 21 Apr 2025 18:49:22 +0200 Subject: [PATCH] Workaround AMD driver crash by disabling rayquery for all AMD cards --- src/common/rendering/vulkan/pipelines/vk_renderpass.cpp | 7 +++++-- src/common/rendering/vulkan/vk_renderdevice.cpp | 9 +++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp b/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp index 02ffe8d11..4d45e72fd 100644 --- a/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp +++ b/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp @@ -377,8 +377,11 @@ VkRenderPassSetup::VkRenderPassSetup(VulkanRenderDevice* fb, const VkRenderPassK UsePipelineLibrary = device->SupportsExtension(VK_EXT_GRAPHICS_PIPELINE_LIBRARY_EXTENSION_NAME) // Is this supported? && device->EnabledFeatures.GraphicsPipelineLibrary.graphicsPipelineLibrary; // Well yes, but actually no. + if (!gl_ubershaders) + UsePipelineLibrary = false; + // Precompile material fragment shaders: - if (gl_ubershaders) + if (UsePipelineLibrary) { VkPipelineKey fkey; fkey.IsGeneralized = true; @@ -479,7 +482,7 @@ VulkanRenderPass *VkRenderPassSetup::GetRenderPass(int clearTargets) VulkanPipeline *VkRenderPassSetup::GetPipeline(const VkPipelineKey &key, UniformStructHolder &Uniforms) { - if (gl_ubershaders) + if (UsePipelineLibrary) { auto data = GetSpecializedPipeline(key); if (!data) diff --git a/src/common/rendering/vulkan/vk_renderdevice.cpp b/src/common/rendering/vulkan/vk_renderdevice.cpp index e6b8f9eb0..19cee6273 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.cpp +++ b/src/common/rendering/vulkan/vk_renderdevice.cpp @@ -114,7 +114,7 @@ CCMD(vk_membudget) if (membudgets[i].budget != 0) { Printf("#%d%s - %d MB used out of %d MB estimated budget (%d%%)\n", - i, memheapnames[i].GetChars(), + (int)i, memheapnames[i].GetChars(), (int)(membudgets[i].usage / (1024 * 1024)), (int)(membudgets[i].budget / (1024 * 1024)), (int)(membudgets[i].usage * 100 / membudgets[i].budget)); @@ -122,7 +122,7 @@ CCMD(vk_membudget) else { Printf("#%d %s - %d MB used\n", - i, memheapnames[i].GetChars(), + (int)i, memheapnames[i].GetChars(), (int)(membudgets[i].usage / (1024 * 1024))); } } @@ -187,6 +187,11 @@ VulkanRenderDevice::VulkanRenderDevice(void *hMonitor, bool fullscreen, std::sha mUseRayQuery = vk_rayquery && mDevice->SupportsExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME) && mDevice->PhysicalDevice.Features.RayQuery.rayQuery; + // Creating pipelines with rayquery currently crashes the AMD driver + // To do: try turn this on once in a while to see if they fixed it as we don't want to permanently gimp AMD card performance + if (mDevice->PhysicalDevice.Properties.Properties.vendorID == 0x1002) + mUseRayQuery = false; + mShaderCache = std::make_unique(this); }