From 2009815d616f8d201e724e0c87f06cd7de8e8bec Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 23 Oct 2025 18:06:22 +0200 Subject: [PATCH] radv: add radv_wait_for_vm_map_updates drirc and enable for Forza Horizon 5 Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/13321 Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_device_memory.c | 4 ++++ src/amd/vulkan/radv_instance.c | 2 ++ src/amd/vulkan/radv_instance.h | 1 + src/util/00-radv-defaults.conf | 3 +++ src/util/driconf.h | 4 ++++ 5 files changed, 14 insertions(+) diff --git a/src/amd/vulkan/radv_device_memory.c b/src/amd/vulkan/radv_device_memory.c index c31dba5bd65..0822dd23c8a 100644 --- a/src/amd/vulkan/radv_device_memory.c +++ b/src/amd/vulkan/radv_device_memory.c @@ -240,6 +240,10 @@ radv_alloc_memory(struct radv_device *device, const VkMemoryAllocateInfo *pAlloc radv_device_should_clear_vram(device)) flags |= RADEON_FLAG_ZERO_VRAM; + /* Only apply the workaround for BOs created by the application, not by the driver. */ + if (instance->drirc.debug.wait_for_vm_map_updates) + flags |= RADEON_FLAG_VM_UPDATE_WAIT; + /* On GFX12, DCC is transparent to the userspace driver and PTE.DCC is * set per buffer allocation. Only VRAM can have DCC. When the kernel * moves a buffer from VRAM->GTT it decompresses. When the kernel moves diff --git a/src/amd/vulkan/radv_instance.c b/src/amd/vulkan/radv_instance.c index 66595b3e92c..41541d8c5a8 100644 --- a/src/amd/vulkan/radv_instance.c +++ b/src/amd/vulkan/radv_instance.c @@ -200,6 +200,7 @@ static const driOptionDescription radv_dri_options[] = { DRI_CONF_RADV_EMULATE_RT(false) DRI_CONF_RADV_ENABLE_FLOAT16_GFX8(false) DRI_CONF_RADV_COOPERATIVE_MATRIX2_NV(false) + DRI_CONF_RADV_WAIT_FOR_VM_MAP_UPDATES(false) DRI_CONF_SECTION_END }; // clang-format on @@ -235,6 +236,7 @@ radv_init_dri_debug_options(struct radv_instance *instance) drirc->debug.split_fma = driQueryOptionb(&drirc->options, "radv_split_fma"); drirc->debug.ssbo_non_uniform = driQueryOptionb(&drirc->options, "radv_ssbo_non_uniform"); drirc->debug.tex_non_uniform = driQueryOptionb(&drirc->options, "radv_tex_non_uniform"); + drirc->debug.wait_for_vm_map_updates = driQueryOptionb(&drirc->options, "radv_wait_for_vm_map_updates"); drirc->debug.zero_vram = driQueryOptionb(&drirc->options, "radv_zero_vram"); drirc->debug.app_layer = driQueryOptionstr(&drirc->options, "radv_app_layer"); diff --git a/src/amd/vulkan/radv_instance.h b/src/amd/vulkan/radv_instance.h index 9d63eff61b0..702b7b9d79d 100644 --- a/src/amd/vulkan/radv_instance.h +++ b/src/amd/vulkan/radv_instance.h @@ -57,6 +57,7 @@ struct radv_drirc { bool ssbo_non_uniform; bool tex_non_uniform; bool zero_vram; + bool wait_for_vm_map_updates; char *app_layer; int override_uniform_offset_alignment; } debug; diff --git a/src/util/00-radv-defaults.conf b/src/util/00-radv-defaults.conf index 56fb675fe52..cc74cf7d8a7 100644 --- a/src/util/00-radv-defaults.conf +++ b/src/util/00-radv-defaults.conf @@ -236,6 +236,9 @@ Application bugs worked around in this file: