About Social Code
aboutsummaryrefslogtreecommitdiff
path: root/src/amd/vulkan/radv_physical_device.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/amd/vulkan/radv_physical_device.c')
-rw-r--r--src/amd/vulkan/radv_physical_device.c111
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)