diff options
Diffstat (limited to 'src/amd/vulkan/radv_physical_device.c')
| -rw-r--r-- | src/amd/vulkan/radv_physical_device.c | 111 |
1 files changed, 65 insertions, 46 deletions
diff --git a/src/amd/vulkan/radv_physical_device.c b/src/amd/vulkan/radv_physical_device.c index cb5416e2e3c..bed03974903 100644 --- a/src/amd/vulkan/radv_physical_device.c +++ b/src/amd/vulkan/radv_physical_device.c @@ -9,6 +9,9 @@ */ #include <fcntl.h> +#include "util/os_misc.h" +#include "vulkan/vulkan_core.h" +#include "vk_sync_dummy.h" #ifdef MAJOR_IN_SYSMACROS #include <sys/sysmacros.h> @@ -17,6 +20,7 @@ #include "vk_log.h" #include "vk_shader_module.h" +#include "common/ac_null_device.h" #include "util/disk_cache.h" #include "util/hex.h" #include "util/u_debug.h" @@ -37,7 +41,6 @@ typedef void *drmDevicePtr; #include "util/os_drm.h" #include "winsys/amdgpu/radv_amdgpu_winsys_public.h" #endif -#include "winsys/null/radv_null_winsys_public.h" #include "git_sha1.h" #if AMD_LLVM_AVAILABLE @@ -2206,6 +2209,23 @@ radv_is_gpu_supported(const struct radeon_info *info) return true; } +static const struct vk_sync_type *const dummy_types[2] = { + &vk_sync_dummy_type, + NULL, +}; + +static VkResult +radv_create_null_device(struct radv_instance *instance, struct radv_physical_device *pdev) +{ + const char *family = os_get_option("RADV_FORCE_FAMILY"); + + if (!ac_null_device_create(&pdev->info, family)) + return vk_errorf(instance, VK_ERROR_INITIALIZATION_FAILED, "Unknown family: %s\n", family); + + pdev->vk.supported_sync_types = dummy_types; + return VK_SUCCESS; +} + static VkResult radv_physical_device_try_create(struct radv_instance *instance, drmDevicePtr drm_device, struct radv_physical_device **pdev_out) @@ -2280,67 +2300,64 @@ radv_physical_device_try_create(struct radv_instance *instance, drmDevicePtr drm } #ifdef _WIN32 - pdev->ws = radv_null_winsys_create(); - if (!pdev->ws) - result = VK_ERROR_OUT_OF_HOST_MEMORY; + result = radv_create_null_device(instance, pdev); + if (result != VK_SUCCESS) + goto fail_base; #else if (drm_device) { bool reserve_vmid = instance->vk.trace_mode & RADV_TRACE_MODE_RGP; result = radv_amdgpu_winsys_create(fd, instance->debug_flags, instance->perftest_flags, reserve_vmid, is_virtio, &pdev->ws); - } else { - pdev->ws = radv_null_winsys_create(); - if (!pdev->ws) - result = VK_ERROR_OUT_OF_HOST_MEMORY; - } -#endif - if (result != VK_SUCCESS) { - result = vk_errorf(instance, result, "failed to initialize winsys"); - goto fail_base; - } - - pdev->vk.supported_sync_types = pdev->ws->get_sync_types(pdev->ws); + if (result != VK_SUCCESS) { + result = vk_errorf(instance, result, "failed to initialize winsys"); + goto fail_base; + } -#ifndef _WIN32 - if (drm_device && instance->vk.enabled_extensions.KHR_display) { - master_fd = open(drm_device->nodes[DRM_NODE_PRIMARY], O_RDWR | O_CLOEXEC); - if (master_fd >= 0) { - uint32_t accel_working = 0; - struct drm_amdgpu_info request = {.return_pointer = (uintptr_t)&accel_working, - .return_size = sizeof(accel_working), - .query = AMDGPU_INFO_ACCEL_WORKING}; - - if (drm_ioctl_write(master_fd, DRM_AMDGPU_INFO, &request, sizeof(struct drm_amdgpu_info)) < 0 || - !accel_working) { - close(master_fd); - master_fd = -1; + pdev->vk.supported_sync_types = pdev->ws->get_sync_types(pdev->ws); + pdev->ws->query_info(pdev->ws, &pdev->info); + + if (instance->vk.enabled_extensions.KHR_display) { + master_fd = open(drm_device->nodes[DRM_NODE_PRIMARY], O_RDWR | O_CLOEXEC); + if (master_fd >= 0) { + uint32_t accel_working = 0; + struct drm_amdgpu_info request = {.return_pointer = (uintptr_t)&accel_working, + .return_size = sizeof(accel_working), + .query = AMDGPU_INFO_ACCEL_WORKING}; + + if (drm_ioctl_write(master_fd, DRM_AMDGPU_INFO, &request, sizeof(struct drm_amdgpu_info)) < 0 || + !accel_working) { + close(master_fd); + master_fd = -1; + } } } - } -#endif - - pdev->master_fd = master_fd; - pdev->local_fd = fd; - pdev->ws->query_info(pdev->ws, &pdev->info); - pdev->info.family_overridden = drm_device == NULL; - /* Allow all devices on a virtual winsys, otherwise do a basic support check. */ - if (!radv_is_gpu_supported(&pdev->info) && drm_device) { - if (instance->debug_flags & RADV_DEBUG_STARTUP) - fprintf(stderr, "radv: info: device '%s' is not supported by RADV.\n", pdev->info.name); - result = VK_ERROR_INCOMPATIBLE_DRIVER; - goto fail_wsi; - } + /* Allow all devices on a virtual winsys, otherwise do a basic support check. */ + if (!radv_is_gpu_supported(&pdev->info)) { + if (instance->debug_flags & RADV_DEBUG_STARTUP) + fprintf(stderr, "radv: info: device '%s' is not supported by RADV.\n", pdev->info.name); + result = VK_ERROR_INCOMPATIBLE_DRIVER; + goto fail_wsi; + } - if (drm_device) { pdev->addrlib = ac_addrlib_create(&pdev->info, &pdev->info.max_alignment); if (!pdev->addrlib) { result = VK_ERROR_INITIALIZATION_FAILED; goto fail_wsi; } + + } else { + /* Create NULL device if no DRM device was provided. */ + result = radv_create_null_device(instance, pdev); + if (result != VK_SUCCESS) + goto fail_base; } +#endif + + pdev->master_fd = master_fd; + pdev->local_fd = fd; pdev->use_llvm = instance->debug_flags & RADV_DEBUG_LLVM; #if !AMD_LLVM_AVAILABLE @@ -2542,7 +2559,8 @@ fail_perfcounters: fail_wsi: if (pdev->addrlib) ac_addrlib_destroy(pdev->addrlib); - pdev->ws->destroy(pdev->ws); + if (pdev->ws) + pdev->ws->destroy(pdev->ws); fail_base: vk_physical_device_finish(&pdev->vk); fail_alloc: @@ -2605,7 +2623,8 @@ radv_physical_device_destroy(struct vk_physical_device *vk_device) ac_destroy_perfcounters(&pdev->ac_perfcounters); if (pdev->addrlib) ac_addrlib_destroy(pdev->addrlib); - pdev->ws->destroy(pdev->ws); + if (pdev->ws) + pdev->ws->destroy(pdev->ws); disk_cache_destroy(pdev->vk.disk_cache); disk_cache_destroy(pdev->disk_cache_meta); if (pdev->local_fd != -1) |