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:
+
+
diff --git a/src/util/driconf.h b/src/util/driconf.h
index 220804d8eaa..7b8c553dd59 100644
--- a/src/util/driconf.h
+++ b/src/util/driconf.h
@@ -759,6 +759,10 @@
DRI_CONF_OPT_B(radv_rt_wave64, def, \
"Force wave64 in RT shaders")
+#define DRI_CONF_RADV_WAIT_FOR_VM_MAP_UPDATES(def) \
+ DRI_CONF_OPT_B(radv_wait_for_vm_map_updates, def, \
+ "Wait for VM MAP updates at allocation time to mitigate use-before-alloc")
+
/**
* Overrides for forcing re-compilation of pipelines when RADV_BUILD_ID_OVERRIDE is enabled.
* These need to be bumped every time a compiler bugfix is backported (up to 8 shader