From cb4e0c414093170e5edf31591d60db3f02ac857b Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Fri, 31 Oct 2025 10:35:40 +0100 Subject: [PATCH] radv: add a workaround for illegal depth/stencil descriptors with No Man's Sky Using descriptors with both depth and stencil aspects is illegal in Vulkan and this hangs the GPU. Use NULL descriptors to mitigate the issue. Note that AMDVLK also ignores them. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/13325 Cc: mesa-stable Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/layers/radv_no_mans_sky.c | 35 ++++++++++++++++++++++++ src/amd/vulkan/meson.build | 2 ++ src/amd/vulkan/radv_device.c | 2 ++ src/util/00-radv-defaults.conf | 4 +++ 4 files changed, 43 insertions(+) create mode 100644 src/amd/vulkan/layers/radv_no_mans_sky.c diff --git a/src/amd/vulkan/layers/radv_no_mans_sky.c b/src/amd/vulkan/layers/radv_no_mans_sky.c new file mode 100644 index 00000000000..024afeacad8 --- /dev/null +++ b/src/amd/vulkan/layers/radv_no_mans_sky.c @@ -0,0 +1,35 @@ +/* + * Copyright © 2025 Valve Corporation + * + * SPDX-License-Identifier: MIT + */ + +#include "radv_device.h" +#include "radv_entrypoints.h" +#include "radv_image_view.h" + +VKAPI_ATTR VkResult VKAPI_CALL +no_mans_sky_CreateImageView(VkDevice _device, const VkImageViewCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkImageView *pView) +{ + VK_FROM_HANDLE(radv_device, device, _device); + VkResult result; + + result = device->layer_dispatch.app.CreateImageView(_device, pCreateInfo, pAllocator, pView); + if (result != VK_SUCCESS) + return result; + + VK_FROM_HANDLE(radv_image_view, iview, *pView); + + if ((iview->vk.aspects == (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) && + (iview->vk.usage & + (VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT))) { + /* No Man's Sky creates descriptors with depth/stencil aspects (only when Intel XESS is + * enabled apparently). and this is illegal in Vulkan. Ignore them by using NULL descriptors + * to workaroud GPU hangs. + */ + memset(&iview->descriptor, 0, sizeof(iview->descriptor)); + } + + return result; +} diff --git a/src/amd/vulkan/meson.build b/src/amd/vulkan/meson.build index fa8a8be1140..78b19aaa7a3 100644 --- a/src/amd/vulkan/meson.build +++ b/src/amd/vulkan/meson.build @@ -21,6 +21,7 @@ radv_entrypoints_gen_command += [ '--device-prefix', 'metro_exodus', '--device-prefix', 'rage2', '--device-prefix', 'quantic_dream', + '--device-prefix', 'no_mans_sky', # Command buffer annotation layer entrypoints '--device-prefix', 'annotate', @@ -40,6 +41,7 @@ libradv_files = files( 'layers/radv_metro_exodus.c', 'layers/radv_rage2.c', 'layers/radv_quantic_dream.c', + 'layers/radv_no_mans_sky.c', 'layers/radv_rmv_layer.c', 'layers/radv_rra_layer.c', 'layers/radv_sqtt_layer.c', diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 2d6408b0593..a97bcb490d8 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -792,6 +792,8 @@ init_dispatch_tables(struct radv_device *device, struct radv_physical_device *pd add_entrypoints(&b, &rage2_device_entrypoints, RADV_APP_DISPATCH_TABLE); } else if (!strcmp(instance->drirc.debug.app_layer, "quanticdream")) { add_entrypoints(&b, &quantic_dream_device_entrypoints, RADV_APP_DISPATCH_TABLE); + } else if (!strcmp(instance->drirc.debug.app_layer, "no_mans_sky")) { + add_entrypoints(&b, &no_mans_sky_device_entrypoints, RADV_APP_DISPATCH_TABLE); } if (instance->vk.trace_mode & RADV_TRACE_MODE_RGP) diff --git a/src/util/00-radv-defaults.conf b/src/util/00-radv-defaults.conf index cc74cf7d8a7..2f2667c2c50 100644 --- a/src/util/00-radv-defaults.conf +++ b/src/util/00-radv-defaults.conf @@ -305,5 +305,9 @@ Application bugs worked around in this file: + + +