diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 19b9becdd27..055bbced9a2 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -589,7 +589,7 @@ radv_physical_device_try_create(struct radv_instance *instance, drmDevicePtr drm device->ws = radv_null_winsys_create(); #else if (drm_device) { - device->ws = radv_amdgpu_winsys_create(fd, instance->debug_flags, instance->perftest_flags); + device->ws = radv_amdgpu_winsys_create(fd, instance->debug_flags, instance->perftest_flags, false); } else { device->ws = radv_null_winsys_create(); } diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c index 11cf51a0c86..beb237b21b1 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c @@ -170,6 +170,9 @@ radv_amdgpu_winsys_destroy(struct radeon_winsys *rws) u_rwlock_destroy(&ws->global_bo_list.lock); free(ws->global_bo_list.bos); + if (ws->reserve_vmid) + amdgpu_vm_unreserve_vmid(ws->dev, 0); + pthread_mutex_destroy(&ws->syncobj_lock); u_rwlock_destroy(&ws->log_bo_list_lock); ac_addrlib_destroy(ws->addrlib); @@ -178,7 +181,7 @@ radv_amdgpu_winsys_destroy(struct radeon_winsys *rws) } struct radeon_winsys * -radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, uint64_t perftest_flags) +radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, uint64_t perftest_flags, bool reserve_vmid) { uint32_t drm_major, drm_minor, r; amdgpu_device_handle dev; @@ -223,6 +226,13 @@ radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, uint64_t perftest_flags) if (debug_flags & RADV_DEBUG_NO_IBS) ws->use_ib_bos = false; + ws->reserve_vmid = reserve_vmid; + if (ws->reserve_vmid) { + r = amdgpu_vm_reserve_vmid(dev, 0); + if (r) + goto vmid_fail; + } + ws->perftest = perftest_flags; ws->zero_all_vram_allocs = debug_flags & RADV_DEBUG_ZERO_VRAM; u_rwlock_init(&ws->global_bo_list.lock); @@ -243,6 +253,8 @@ radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, uint64_t perftest_flags) return &ws->base; +vmid_fail: + ac_addrlib_destroy(ws->addrlib); winsys_fail: free(ws); fail: diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h index 0739f246d1d..06ca90564f0 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h @@ -47,6 +47,7 @@ struct radv_amdgpu_winsys { bool debug_log_bos; bool use_ib_bos; bool zero_all_vram_allocs; + bool reserve_vmid; uint64_t perftest; uint64_t allocated_vram; diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys_public.h b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys_public.h index 84fe347ec3e..47c18f373c2 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys_public.h +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys_public.h @@ -30,7 +30,8 @@ #define RADV_AMDGPU_WINSYS_PUBLIC_H struct radeon_winsys *radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, - uint64_t perftest_flags); + uint64_t perftest_flags, + bool reserve_vmid); struct radeon_winsys *radv_dummy_winsys_create(void);