diff --git a/docs/envvars.rst b/docs/envvars.rst index 47c6f935989..6415bbe99d6 100644 --- a/docs/envvars.rst +++ b/docs/envvars.rst @@ -1504,6 +1504,8 @@ RADV driver environment variables Use bvh4 encoding on GPUs that support bvh8 encoding. ``validatevas`` Enable tracking of VA ranges for radv_build_is_valid_va. + ``vm`` + add a gap between all VA allocations to check for page faults .. envvar:: RADV_FORCE_VRS diff --git a/src/amd/vulkan/radv_debug.h b/src/amd/vulkan/radv_debug.h index bf235e4d076..787c5c0e2c9 100644 --- a/src/amd/vulkan/radv_debug.h +++ b/src/amd/vulkan/radv_debug.h @@ -73,6 +73,7 @@ enum { RADV_DEBUG_DUMP_BO_HISTORY = 1ull << 58, RADV_DEBUG_NO_BO_LIST = 1ull << 59, RADV_DEBUG_DUMP_IBS = 1ull << 60, + RADV_DEBUG_VM = 1ull << 61, RADV_DEBUG_DUMP_SHADERS = RADV_DEBUG_DUMP_VS | RADV_DEBUG_DUMP_TCS | RADV_DEBUG_DUMP_TES | RADV_DEBUG_DUMP_GS | RADV_DEBUG_DUMP_PS | RADV_DEBUG_DUMP_TASK | RADV_DEBUG_DUMP_MESH | RADV_DEBUG_DUMP_CS | RADV_DEBUG_DUMP_NIR | RADV_DEBUG_DUMP_ASM | RADV_DEBUG_DUMP_BACKEND_IR, diff --git a/src/amd/vulkan/radv_instance.c b/src/amd/vulkan/radv_instance.c index 9c34f5121b6..806aeeb1c55 100644 --- a/src/amd/vulkan/radv_instance.c +++ b/src/amd/vulkan/radv_instance.c @@ -89,6 +89,7 @@ static const struct debug_control radv_debug_options[] = { {"bo_history", RADV_DEBUG_DUMP_BO_HISTORY}, {"nobolist", RADV_DEBUG_NO_BO_LIST}, {"dumpibs", RADV_DEBUG_DUMP_IBS}, + {"vm", RADV_DEBUG_VM}, {NULL, 0}, }; diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c index cdd2961557f..9e39f328fc7 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c @@ -508,8 +508,10 @@ radv_amdgpu_winsys_virtual_bo_create(struct radeon_winsys *_ws, uint64_t size, u const uint64_t va_flags = AMDGPU_VA_RANGE_HIGH | (flags & RADEON_FLAG_32BIT ? AMDGPU_VA_RANGE_32_BIT : 0) | (flags & RADEON_FLAG_REPLAYABLE ? AMDGPU_VA_RANGE_REPLAYABLE : 0); - r = ac_drm_va_range_alloc(ws->dev, amdgpu_gpu_va_range_general, size, virt_alignment, replay_address, &va, - &va_handle, va_flags); + const uint64_t va_gap_size = ws->debug_vm ? MAX2(4 * virt_alignment, 64 * 1024) : 0; + + r = ac_drm_va_range_alloc(ws->dev, amdgpu_gpu_va_range_general, size + va_gap_size, virt_alignment, replay_address, + &va, &va_handle, va_flags); if (r) { result = replay_address ? VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS : VK_ERROR_OUT_OF_DEVICE_MEMORY; goto error_va_alloc; @@ -593,8 +595,10 @@ radv_amdgpu_winsys_bo_create(struct radeon_winsys *_ws, uint64_t size, unsigned const uint64_t va_flags = AMDGPU_VA_RANGE_HIGH | (flags & RADEON_FLAG_32BIT ? AMDGPU_VA_RANGE_32_BIT : 0) | (flags & RADEON_FLAG_REPLAYABLE ? AMDGPU_VA_RANGE_REPLAYABLE : 0); - r = ac_drm_va_range_alloc(ws->dev, amdgpu_gpu_va_range_general, size, virt_alignment, replay_address, &va, - &va_handle, va_flags); + uint64_t va_gap_size = ws->debug_vm ? MAX2(4 * virt_alignment, 64 * 1024) : 0; + + r = ac_drm_va_range_alloc(ws->dev, amdgpu_gpu_va_range_general, size + va_gap_size, virt_alignment, replay_address, + &va, &va_handle, va_flags); if (r) { result = replay_address ? VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS : VK_ERROR_OUT_OF_DEVICE_MEMORY; goto error_va_alloc; diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c index b67671bbef2..438b4341220 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c @@ -242,7 +242,8 @@ radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, uint64_t perftest_flags, /* Check that options don't differ from the existing winsys. */ if (((debug_flags & RADV_DEBUG_ALL_BOS) && !ws->debug_all_bos) || ((debug_flags & RADV_DEBUG_HANG) && !ws->debug_log_bos) || - ((debug_flags & RADV_DEBUG_NO_IB_CHAINING) && ws->chain_ib) || (perftest_flags != ws->perftest)) { + ((debug_flags & RADV_DEBUG_NO_IB_CHAINING) && ws->chain_ib) || + ((debug_flags & RADV_DEBUG_VM) && !ws->debug_vm) || (perftest_flags != ws->perftest)) { fprintf(stderr, "radv/amdgpu: Found options that differ from the existing winsys.\n"); return VK_ERROR_INITIALIZATION_FAILED; } @@ -328,6 +329,7 @@ radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, uint64_t perftest_flags, ws->perftest = perftest_flags; ws->zero_all_vram_allocs = debug_flags & RADV_DEBUG_ZERO_VRAM; + ws->debug_vm = debug_flags & RADV_DEBUG_VM; u_rwlock_init(&ws->global_bo_list.lock); list_inithead(&ws->log_bo_list); u_rwlock_init(&ws->log_bo_list_lock); diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h index cce30ca7f93..f8b823b73ac 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h @@ -35,6 +35,7 @@ struct radv_amdgpu_winsys { FILE *bo_history_logfile; bool chain_ib; bool zero_all_vram_allocs; + bool debug_vm; uint64_t perftest; alignas(8) uint64_t allocated_vram;