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