1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2015 Intel Corporation
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker *
11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker * Software.
14*61046927SAndroid Build Coastguard Worker *
15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker */
23*61046927SAndroid Build Coastguard Worker
24*61046927SAndroid Build Coastguard Worker #include "anv_private.h"
25*61046927SAndroid Build Coastguard Worker #include "anv_measure.h"
26*61046927SAndroid Build Coastguard Worker #include "wsi_common.h"
27*61046927SAndroid Build Coastguard Worker #include "vk_fence.h"
28*61046927SAndroid Build Coastguard Worker #include "vk_queue.h"
29*61046927SAndroid Build Coastguard Worker #include "vk_semaphore.h"
30*61046927SAndroid Build Coastguard Worker #include "vk_util.h"
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Worker #include "common/intel_debug_identifier.h"
33*61046927SAndroid Build Coastguard Worker
34*61046927SAndroid Build Coastguard Worker static PFN_vkVoidFunction
anv_wsi_proc_addr(VkPhysicalDevice physicalDevice,const char * pName)35*61046927SAndroid Build Coastguard Worker anv_wsi_proc_addr(VkPhysicalDevice physicalDevice, const char *pName)
36*61046927SAndroid Build Coastguard Worker {
37*61046927SAndroid Build Coastguard Worker ANV_FROM_HANDLE(anv_physical_device, pdevice, physicalDevice);
38*61046927SAndroid Build Coastguard Worker return vk_instance_get_proc_addr_unchecked(&pdevice->instance->vk, pName);
39*61046927SAndroid Build Coastguard Worker }
40*61046927SAndroid Build Coastguard Worker
41*61046927SAndroid Build Coastguard Worker static VkQueue
anv_wsi_get_prime_blit_queue(VkDevice _device)42*61046927SAndroid Build Coastguard Worker anv_wsi_get_prime_blit_queue(VkDevice _device)
43*61046927SAndroid Build Coastguard Worker {
44*61046927SAndroid Build Coastguard Worker ANV_FROM_HANDLE(anv_device, device, _device);
45*61046927SAndroid Build Coastguard Worker
46*61046927SAndroid Build Coastguard Worker vk_foreach_queue(_queue, &device->vk) {
47*61046927SAndroid Build Coastguard Worker struct anv_queue *queue = (struct anv_queue *)_queue;
48*61046927SAndroid Build Coastguard Worker if (queue->family->queueFlags & (VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT))
49*61046927SAndroid Build Coastguard Worker return vk_queue_to_handle(_queue);
50*61046927SAndroid Build Coastguard Worker }
51*61046927SAndroid Build Coastguard Worker return NULL;
52*61046927SAndroid Build Coastguard Worker }
53*61046927SAndroid Build Coastguard Worker
54*61046927SAndroid Build Coastguard Worker VkResult
anv_init_wsi(struct anv_physical_device * physical_device)55*61046927SAndroid Build Coastguard Worker anv_init_wsi(struct anv_physical_device *physical_device)
56*61046927SAndroid Build Coastguard Worker {
57*61046927SAndroid Build Coastguard Worker VkResult result;
58*61046927SAndroid Build Coastguard Worker
59*61046927SAndroid Build Coastguard Worker result = wsi_device_init(&physical_device->wsi_device,
60*61046927SAndroid Build Coastguard Worker anv_physical_device_to_handle(physical_device),
61*61046927SAndroid Build Coastguard Worker anv_wsi_proc_addr,
62*61046927SAndroid Build Coastguard Worker &physical_device->instance->vk.alloc,
63*61046927SAndroid Build Coastguard Worker physical_device->master_fd,
64*61046927SAndroid Build Coastguard Worker &physical_device->instance->dri_options,
65*61046927SAndroid Build Coastguard Worker &(struct wsi_device_options){.sw_device = false});
66*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
67*61046927SAndroid Build Coastguard Worker return result;
68*61046927SAndroid Build Coastguard Worker
69*61046927SAndroid Build Coastguard Worker physical_device->wsi_device.supports_modifiers = true;
70*61046927SAndroid Build Coastguard Worker physical_device->wsi_device.get_blit_queue = anv_wsi_get_prime_blit_queue;
71*61046927SAndroid Build Coastguard Worker if (physical_device->info.kmd_type == INTEL_KMD_TYPE_I915) {
72*61046927SAndroid Build Coastguard Worker physical_device->wsi_device.signal_semaphore_with_memory = true;
73*61046927SAndroid Build Coastguard Worker physical_device->wsi_device.signal_fence_with_memory = true;
74*61046927SAndroid Build Coastguard Worker }
75*61046927SAndroid Build Coastguard Worker
76*61046927SAndroid Build Coastguard Worker physical_device->vk.wsi_device = &physical_device->wsi_device;
77*61046927SAndroid Build Coastguard Worker
78*61046927SAndroid Build Coastguard Worker wsi_device_setup_syncobj_fd(&physical_device->wsi_device,
79*61046927SAndroid Build Coastguard Worker physical_device->local_fd);
80*61046927SAndroid Build Coastguard Worker
81*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
82*61046927SAndroid Build Coastguard Worker }
83*61046927SAndroid Build Coastguard Worker
84*61046927SAndroid Build Coastguard Worker void
anv_finish_wsi(struct anv_physical_device * physical_device)85*61046927SAndroid Build Coastguard Worker anv_finish_wsi(struct anv_physical_device *physical_device)
86*61046927SAndroid Build Coastguard Worker {
87*61046927SAndroid Build Coastguard Worker physical_device->vk.wsi_device = NULL;
88*61046927SAndroid Build Coastguard Worker wsi_device_finish(&physical_device->wsi_device,
89*61046927SAndroid Build Coastguard Worker &physical_device->instance->vk.alloc);
90*61046927SAndroid Build Coastguard Worker }
91*61046927SAndroid Build Coastguard Worker
anv_AcquireNextImage2KHR(VkDevice _device,const VkAcquireNextImageInfoKHR * pAcquireInfo,uint32_t * pImageIndex)92*61046927SAndroid Build Coastguard Worker VkResult anv_AcquireNextImage2KHR(
93*61046927SAndroid Build Coastguard Worker VkDevice _device,
94*61046927SAndroid Build Coastguard Worker const VkAcquireNextImageInfoKHR *pAcquireInfo,
95*61046927SAndroid Build Coastguard Worker uint32_t *pImageIndex)
96*61046927SAndroid Build Coastguard Worker {
97*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(anv_device, device, _device);
98*61046927SAndroid Build Coastguard Worker
99*61046927SAndroid Build Coastguard Worker VkResult result =
100*61046927SAndroid Build Coastguard Worker wsi_common_acquire_next_image2(&device->physical->wsi_device,
101*61046927SAndroid Build Coastguard Worker _device, pAcquireInfo, pImageIndex);
102*61046927SAndroid Build Coastguard Worker if (result == VK_SUCCESS)
103*61046927SAndroid Build Coastguard Worker anv_measure_acquire(device);
104*61046927SAndroid Build Coastguard Worker
105*61046927SAndroid Build Coastguard Worker return result;
106*61046927SAndroid Build Coastguard Worker }
107*61046927SAndroid Build Coastguard Worker
anv_QueuePresentKHR(VkQueue _queue,const VkPresentInfoKHR * pPresentInfo)108*61046927SAndroid Build Coastguard Worker VkResult anv_QueuePresentKHR(
109*61046927SAndroid Build Coastguard Worker VkQueue _queue,
110*61046927SAndroid Build Coastguard Worker const VkPresentInfoKHR* pPresentInfo)
111*61046927SAndroid Build Coastguard Worker {
112*61046927SAndroid Build Coastguard Worker ANV_FROM_HANDLE(anv_queue, queue, _queue);
113*61046927SAndroid Build Coastguard Worker struct anv_device *device = queue->device;
114*61046927SAndroid Build Coastguard Worker VkResult result;
115*61046927SAndroid Build Coastguard Worker
116*61046927SAndroid Build Coastguard Worker if (device->debug_frame_desc) {
117*61046927SAndroid Build Coastguard Worker device->debug_frame_desc->frame_id++;
118*61046927SAndroid Build Coastguard Worker }
119*61046927SAndroid Build Coastguard Worker
120*61046927SAndroid Build Coastguard Worker if (u_trace_should_process(&device->ds.trace_context))
121*61046927SAndroid Build Coastguard Worker anv_queue_trace(queue, NULL, true /* frame */, false /* begin */);
122*61046927SAndroid Build Coastguard Worker
123*61046927SAndroid Build Coastguard Worker result = vk_queue_wait_before_present(&queue->vk, pPresentInfo);
124*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
125*61046927SAndroid Build Coastguard Worker return result;
126*61046927SAndroid Build Coastguard Worker
127*61046927SAndroid Build Coastguard Worker result = wsi_common_queue_present(&device->physical->wsi_device,
128*61046927SAndroid Build Coastguard Worker anv_device_to_handle(queue->device),
129*61046927SAndroid Build Coastguard Worker _queue, 0,
130*61046927SAndroid Build Coastguard Worker pPresentInfo);
131*61046927SAndroid Build Coastguard Worker
132*61046927SAndroid Build Coastguard Worker if (u_trace_should_process(&device->ds.trace_context))
133*61046927SAndroid Build Coastguard Worker anv_queue_trace(queue, NULL, true /* frame */, true /* begin */);
134*61046927SAndroid Build Coastguard Worker
135*61046927SAndroid Build Coastguard Worker return result;
136*61046927SAndroid Build Coastguard Worker }
137