1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2022 Imagination Technologies Ltd.
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * based on intel anv code:
5*61046927SAndroid Build Coastguard Worker * Copyright © 2015 Intel Corporation
6*61046927SAndroid Build Coastguard Worker *
7*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a copy
8*61046927SAndroid Build Coastguard Worker * of this software and associated documentation files (the "Software"), to deal
9*61046927SAndroid Build Coastguard Worker * in the Software without restriction, including without limitation the rights
10*61046927SAndroid Build Coastguard Worker * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11*61046927SAndroid Build Coastguard Worker * copies of the Software, and to permit persons to whom the Software is
12*61046927SAndroid Build Coastguard Worker * furnished to do so, subject to the following conditions:
13*61046927SAndroid Build Coastguard Worker *
14*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
15*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
16*61046927SAndroid Build Coastguard Worker * Software.
17*61046927SAndroid Build Coastguard Worker *
18*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21*61046927SAndroid Build Coastguard Worker * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23*61046927SAndroid Build Coastguard Worker * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24*61046927SAndroid Build Coastguard Worker * SOFTWARE.
25*61046927SAndroid Build Coastguard Worker */
26*61046927SAndroid Build Coastguard Worker
27*61046927SAndroid Build Coastguard Worker #include <stdint.h>
28*61046927SAndroid Build Coastguard Worker #include <stddef.h>
29*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
30*61046927SAndroid Build Coastguard Worker #include <vulkan/vulkan.h>
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Worker #include "pvr_private.h"
33*61046927SAndroid Build Coastguard Worker #include "util/u_atomic.h"
34*61046927SAndroid Build Coastguard Worker #include "vk_object.h"
35*61046927SAndroid Build Coastguard Worker #include "wsi_common.h"
36*61046927SAndroid Build Coastguard Worker
pvr_wsi_proc_addr(VkPhysicalDevice physicalDevice,const char * pName)37*61046927SAndroid Build Coastguard Worker static PFN_vkVoidFunction pvr_wsi_proc_addr(VkPhysicalDevice physicalDevice,
38*61046927SAndroid Build Coastguard Worker const char *pName)
39*61046927SAndroid Build Coastguard Worker {
40*61046927SAndroid Build Coastguard Worker PVR_FROM_HANDLE(pvr_physical_device, pdevice, physicalDevice);
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker return vk_instance_get_proc_addr_unchecked(&pdevice->instance->vk, pName);
43*61046927SAndroid Build Coastguard Worker }
44*61046927SAndroid Build Coastguard Worker
pvr_wsi_init(struct pvr_physical_device * pdevice)45*61046927SAndroid Build Coastguard Worker VkResult pvr_wsi_init(struct pvr_physical_device *pdevice)
46*61046927SAndroid Build Coastguard Worker {
47*61046927SAndroid Build Coastguard Worker VkResult result;
48*61046927SAndroid Build Coastguard Worker
49*61046927SAndroid Build Coastguard Worker result = wsi_device_init(&pdevice->wsi_device,
50*61046927SAndroid Build Coastguard Worker pvr_physical_device_to_handle(pdevice),
51*61046927SAndroid Build Coastguard Worker pvr_wsi_proc_addr,
52*61046927SAndroid Build Coastguard Worker &pdevice->vk.instance->alloc,
53*61046927SAndroid Build Coastguard Worker pdevice->ws->display_fd,
54*61046927SAndroid Build Coastguard Worker NULL,
55*61046927SAndroid Build Coastguard Worker &(struct wsi_device_options){ .sw_device = false });
56*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
57*61046927SAndroid Build Coastguard Worker return result;
58*61046927SAndroid Build Coastguard Worker
59*61046927SAndroid Build Coastguard Worker pdevice->wsi_device.supports_modifiers = true;
60*61046927SAndroid Build Coastguard Worker pdevice->vk.wsi_device = &pdevice->wsi_device;
61*61046927SAndroid Build Coastguard Worker
62*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
63*61046927SAndroid Build Coastguard Worker }
64*61046927SAndroid Build Coastguard Worker
pvr_wsi_finish(struct pvr_physical_device * pdevice)65*61046927SAndroid Build Coastguard Worker void pvr_wsi_finish(struct pvr_physical_device *pdevice)
66*61046927SAndroid Build Coastguard Worker {
67*61046927SAndroid Build Coastguard Worker pdevice->vk.wsi_device = NULL;
68*61046927SAndroid Build Coastguard Worker wsi_device_finish(&pdevice->wsi_device, &pdevice->vk.instance->alloc);
69*61046927SAndroid Build Coastguard Worker }
70*61046927SAndroid Build Coastguard Worker
pvr_QueuePresentKHR(VkQueue _queue,const VkPresentInfoKHR * pPresentInfo)71*61046927SAndroid Build Coastguard Worker VkResult pvr_QueuePresentKHR(VkQueue _queue,
72*61046927SAndroid Build Coastguard Worker const VkPresentInfoKHR *pPresentInfo)
73*61046927SAndroid Build Coastguard Worker {
74*61046927SAndroid Build Coastguard Worker PVR_FROM_HANDLE(pvr_queue, queue, _queue);
75*61046927SAndroid Build Coastguard Worker VkResult result;
76*61046927SAndroid Build Coastguard Worker
77*61046927SAndroid Build Coastguard Worker result = wsi_common_queue_present(&queue->device->pdevice->wsi_device,
78*61046927SAndroid Build Coastguard Worker pvr_device_to_handle(queue->device),
79*61046927SAndroid Build Coastguard Worker _queue,
80*61046927SAndroid Build Coastguard Worker 0,
81*61046927SAndroid Build Coastguard Worker pPresentInfo);
82*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
83*61046927SAndroid Build Coastguard Worker return result;
84*61046927SAndroid Build Coastguard Worker
85*61046927SAndroid Build Coastguard Worker p_atomic_inc(&queue->device->global_queue_present_count);
86*61046927SAndroid Build Coastguard Worker
87*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
88*61046927SAndroid Build Coastguard Worker }
89