1 /*
2 * Copyright © 2016 Red Hat
3 * SPDX-License-Identifier: MIT
4 *
5 * based on intel anv code:
6 * Copyright © 2015 Intel Corporation
7 */
8
9 #include "tu_wsi.h"
10
11 #include "vk_util.h"
12 #include "wsi_common_drm.h"
13 #include "drm-uapi/drm_fourcc.h"
14
15 #include "tu_device.h"
16
17 static VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
tu_wsi_proc_addr(VkPhysicalDevice physicalDevice,const char * pName)18 tu_wsi_proc_addr(VkPhysicalDevice physicalDevice, const char *pName)
19 {
20 VK_FROM_HANDLE(tu_physical_device, pdevice, physicalDevice);
21 return vk_instance_get_proc_addr_unchecked(&pdevice->instance->vk, pName);
22 }
23
24 static bool
tu_wsi_can_present_on_device(VkPhysicalDevice physicalDevice,int fd)25 tu_wsi_can_present_on_device(VkPhysicalDevice physicalDevice, int fd)
26 {
27 #ifdef HAVE_LIBDRM
28 VK_FROM_HANDLE(tu_physical_device, pdevice, physicalDevice);
29 return wsi_common_drm_devices_equal(fd, pdevice->local_fd);
30 #else
31 return true;
32 #endif
33 }
34
35 VkResult
tu_wsi_init(struct tu_physical_device * physical_device)36 tu_wsi_init(struct tu_physical_device *physical_device)
37 {
38 VkResult result;
39
40 const struct wsi_device_options options = { .sw_device = false };
41 result = wsi_device_init(&physical_device->wsi_device,
42 tu_physical_device_to_handle(physical_device),
43 tu_wsi_proc_addr,
44 &physical_device->instance->vk.alloc,
45 physical_device->master_fd,
46 &physical_device->instance->dri_options,
47 &options);
48 if (result != VK_SUCCESS)
49 return result;
50
51 physical_device->wsi_device.supports_modifiers = true;
52 physical_device->wsi_device.can_present_on_device =
53 tu_wsi_can_present_on_device;
54
55 physical_device->vk.wsi_device = &physical_device->wsi_device;
56
57 return VK_SUCCESS;
58 }
59
60 void
tu_wsi_finish(struct tu_physical_device * physical_device)61 tu_wsi_finish(struct tu_physical_device *physical_device)
62 {
63 physical_device->vk.wsi_device = NULL;
64 wsi_device_finish(&physical_device->wsi_device,
65 &physical_device->instance->vk.alloc);
66 }
67