diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c index 1c3b466a910..b246e52d1ce 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c @@ -140,6 +140,21 @@ radv_amdgpu_winsys_bo_virtual_bind(struct radeon_winsys *_ws, struct radeon_wins return VK_ERROR_OUT_OF_DEVICE_MEMORY; } + /* Do not add the BO to the virtual BO list if it's already in the global list to avoid dangling + * BO references because it might have been destroyed without being previously unbound. Resetting + * it to NULL clears the old BO ranges if present. + * + * This is going to be clarified in the Vulkan spec: + * https://gitlab.khronos.org/vulkan/vulkan/-/issues/3125 + * + * The issue still exists for non-global BO but it will be addressed later, once we are 100% it's + * RADV fault (mostly because the solution looks more complicated). + */ + if (bo && bo->base.use_global_list) { + bo = NULL; + bo_offset = 0; + } + /* We have at most 2 new ranges (1 by the bind, and another one by splitting a range that * contains the newly bound range). */ if (parent->range_capacity - parent->range_count < 2) {