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
17static VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
18tu_wsi_proc_addr(VkPhysicalDevice physicalDevice, const char *pName)
19{
20   TU_FROM_HANDLE(tu_physical_device, pdevice, physicalDevice);
21   return vk_instance_get_proc_addr_unchecked(&pdevice->instance->vk, pName);
22}
23
24static bool
25tu_wsi_can_present_on_device(VkPhysicalDevice physicalDevice, int fd)
26{
27   TU_FROM_HANDLE(tu_physical_device, pdevice, physicalDevice);
28
29   return wsi_common_drm_devices_equal(fd, pdevice->local_fd);
30}
31
32VkResult
33tu_wsi_init(struct tu_physical_device *physical_device)
34{
35   VkResult result;
36
37   result = wsi_device_init(&physical_device->wsi_device,
38                            tu_physical_device_to_handle(physical_device),
39                            tu_wsi_proc_addr,
40                            &physical_device->instance->vk.alloc,
41                            physical_device->master_fd,
42                            &physical_device->instance->dri_options,
43                            false);
44   if (result != VK_SUCCESS)
45      return result;
46
47   physical_device->wsi_device.supports_modifiers = true;
48   physical_device->wsi_device.can_present_on_device =
49      tu_wsi_can_present_on_device;
50
51   physical_device->vk.wsi_device = &physical_device->wsi_device;
52
53   return VK_SUCCESS;
54}
55
56void
57tu_wsi_finish(struct tu_physical_device *physical_device)
58{
59   physical_device->vk.wsi_device = NULL;
60   wsi_device_finish(&physical_device->wsi_device,
61                     &physical_device->instance->vk.alloc);
62}
63