1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright 2019 Google LLC
3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker *
5*61046927SAndroid Build Coastguard Worker * based in part on anv and radv which are:
6*61046927SAndroid Build Coastguard Worker * Copyright © 2015 Intel Corporation
7*61046927SAndroid Build Coastguard Worker * Copyright © 2016 Red Hat.
8*61046927SAndroid Build Coastguard Worker * Copyright © 2016 Bas Nieuwenhuizen
9*61046927SAndroid Build Coastguard Worker */
10*61046927SAndroid Build Coastguard Worker
11*61046927SAndroid Build Coastguard Worker #include "vn_wsi.h"
12*61046927SAndroid Build Coastguard Worker
13*61046927SAndroid Build Coastguard Worker #include "vk_enum_to_str.h"
14*61046927SAndroid Build Coastguard Worker #include "wsi_common_entrypoints.h"
15*61046927SAndroid Build Coastguard Worker
16*61046927SAndroid Build Coastguard Worker #include "vn_device.h"
17*61046927SAndroid Build Coastguard Worker #include "vn_image.h"
18*61046927SAndroid Build Coastguard Worker #include "vn_instance.h"
19*61046927SAndroid Build Coastguard Worker #include "vn_physical_device.h"
20*61046927SAndroid Build Coastguard Worker #include "vn_queue.h"
21*61046927SAndroid Build Coastguard Worker
22*61046927SAndroid Build Coastguard Worker /* The common WSI support makes some assumptions about the driver.
23*61046927SAndroid Build Coastguard Worker *
24*61046927SAndroid Build Coastguard Worker * In wsi_device_init, it assumes VK_EXT_pci_bus_info is available. In
25*61046927SAndroid Build Coastguard Worker * wsi_create_native_image and wsi_create_prime_image, it assumes
26*61046927SAndroid Build Coastguard Worker * VK_KHR_external_memory_fd and VK_EXT_external_memory_dma_buf are enabled.
27*61046927SAndroid Build Coastguard Worker *
28*61046927SAndroid Build Coastguard Worker * In wsi_create_native_image, if wsi_device::supports_modifiers is set and
29*61046927SAndroid Build Coastguard Worker * the window system supports modifiers, it assumes
30*61046927SAndroid Build Coastguard Worker * VK_EXT_image_drm_format_modifier is enabled. Otherwise, it assumes that
31*61046927SAndroid Build Coastguard Worker * wsi_image_create_info can be chained to VkImageCreateInfo and
32*61046927SAndroid Build Coastguard Worker * vkGetImageSubresourceLayout can be called even the tiling is
33*61046927SAndroid Build Coastguard Worker * VK_IMAGE_TILING_OPTIMAL.
34*61046927SAndroid Build Coastguard Worker *
35*61046927SAndroid Build Coastguard Worker * Together, it knows how to share dma-bufs, with explicit or implicit
36*61046927SAndroid Build Coastguard Worker * modifiers, to the window system.
37*61046927SAndroid Build Coastguard Worker *
38*61046927SAndroid Build Coastguard Worker * For venus, we use explicit modifiers when the renderer and the window
39*61046927SAndroid Build Coastguard Worker * system support them. Otherwise, we have to fall back to
40*61046927SAndroid Build Coastguard Worker * VK_IMAGE_TILING_LINEAR (or trigger the prime blit path). But the fallback
41*61046927SAndroid Build Coastguard Worker * can be problematic when the memory is scanned out directly and special
42*61046927SAndroid Build Coastguard Worker * requirements (e.g., alignments) must be met.
43*61046927SAndroid Build Coastguard Worker *
44*61046927SAndroid Build Coastguard Worker * The common WSI support makes other assumptions about the driver to support
45*61046927SAndroid Build Coastguard Worker * implicit fencing. In wsi_create_native_image and wsi_create_prime_image,
46*61046927SAndroid Build Coastguard Worker * it assumes wsi_memory_allocate_info can be chained to VkMemoryAllocateInfo.
47*61046927SAndroid Build Coastguard Worker * In wsi_common_queue_present, it assumes wsi_memory_signal_submit_info can
48*61046927SAndroid Build Coastguard Worker * be chained to VkSubmitInfo. Finally, in wsi_common_acquire_next_image2, it
49*61046927SAndroid Build Coastguard Worker * calls wsi_device::signal_semaphore_for_memory, and
50*61046927SAndroid Build Coastguard Worker * wsi_device::signal_fence_for_memory if the driver provides them.
51*61046927SAndroid Build Coastguard Worker *
52*61046927SAndroid Build Coastguard Worker * Some drivers use wsi_memory_allocate_info to set up implicit fencing.
53*61046927SAndroid Build Coastguard Worker * Others use wsi_memory_signal_submit_info to set up implicit IN-fences and
54*61046927SAndroid Build Coastguard Worker * use wsi_device::signal_*_for_memory to set up implicit OUT-fences.
55*61046927SAndroid Build Coastguard Worker *
56*61046927SAndroid Build Coastguard Worker * For venus, implicit fencing is broken (and there is no explicit fencing
57*61046927SAndroid Build Coastguard Worker * support yet). The kernel driver assumes everything is in the same fence
58*61046927SAndroid Build Coastguard Worker * context and no synchronization is needed. It should be fixed for
59*61046927SAndroid Build Coastguard Worker * correctness, but it is still not ideal. venus requires explicit fencing
60*61046927SAndroid Build Coastguard Worker * (and renderer-side synchronization) to work well.
61*61046927SAndroid Build Coastguard Worker */
62*61046927SAndroid Build Coastguard Worker
63*61046927SAndroid Build Coastguard Worker /* cast a WSI object to a pointer for logging */
64*61046927SAndroid Build Coastguard Worker #define VN_WSI_PTR(obj) ((const void *)(uintptr_t)(obj))
65*61046927SAndroid Build Coastguard Worker
66*61046927SAndroid Build Coastguard Worker static PFN_vkVoidFunction
vn_wsi_proc_addr(VkPhysicalDevice physicalDevice,const char * pName)67*61046927SAndroid Build Coastguard Worker vn_wsi_proc_addr(VkPhysicalDevice physicalDevice, const char *pName)
68*61046927SAndroid Build Coastguard Worker {
69*61046927SAndroid Build Coastguard Worker struct vn_physical_device *physical_dev =
70*61046927SAndroid Build Coastguard Worker vn_physical_device_from_handle(physicalDevice);
71*61046927SAndroid Build Coastguard Worker return vk_instance_get_proc_addr_unchecked(
72*61046927SAndroid Build Coastguard Worker &physical_dev->instance->base.base, pName);
73*61046927SAndroid Build Coastguard Worker }
74*61046927SAndroid Build Coastguard Worker
75*61046927SAndroid Build Coastguard Worker VkResult
vn_wsi_init(struct vn_physical_device * physical_dev)76*61046927SAndroid Build Coastguard Worker vn_wsi_init(struct vn_physical_device *physical_dev)
77*61046927SAndroid Build Coastguard Worker {
78*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *alloc =
79*61046927SAndroid Build Coastguard Worker &physical_dev->instance->base.base.alloc;
80*61046927SAndroid Build Coastguard Worker VkResult result = wsi_device_init(
81*61046927SAndroid Build Coastguard Worker &physical_dev->wsi_device, vn_physical_device_to_handle(physical_dev),
82*61046927SAndroid Build Coastguard Worker vn_wsi_proc_addr, alloc, -1, &physical_dev->instance->dri_options,
83*61046927SAndroid Build Coastguard Worker &(struct wsi_device_options){
84*61046927SAndroid Build Coastguard Worker .sw_device = false,
85*61046927SAndroid Build Coastguard Worker .extra_xwayland_image = true,
86*61046927SAndroid Build Coastguard Worker });
87*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
88*61046927SAndroid Build Coastguard Worker return result;
89*61046927SAndroid Build Coastguard Worker
90*61046927SAndroid Build Coastguard Worker physical_dev->wsi_device.supports_modifiers = true;
91*61046927SAndroid Build Coastguard Worker physical_dev->base.base.wsi_device = &physical_dev->wsi_device;
92*61046927SAndroid Build Coastguard Worker
93*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
94*61046927SAndroid Build Coastguard Worker }
95*61046927SAndroid Build Coastguard Worker
96*61046927SAndroid Build Coastguard Worker void
vn_wsi_fini(struct vn_physical_device * physical_dev)97*61046927SAndroid Build Coastguard Worker vn_wsi_fini(struct vn_physical_device *physical_dev)
98*61046927SAndroid Build Coastguard Worker {
99*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *alloc =
100*61046927SAndroid Build Coastguard Worker &physical_dev->instance->base.base.alloc;
101*61046927SAndroid Build Coastguard Worker physical_dev->base.base.wsi_device = NULL;
102*61046927SAndroid Build Coastguard Worker wsi_device_finish(&physical_dev->wsi_device, alloc);
103*61046927SAndroid Build Coastguard Worker }
104*61046927SAndroid Build Coastguard Worker
105*61046927SAndroid Build Coastguard Worker VkResult
vn_wsi_create_image(struct vn_device * dev,const VkImageCreateInfo * create_info,const struct wsi_image_create_info * wsi_info,const VkAllocationCallbacks * alloc,struct vn_image ** out_img)106*61046927SAndroid Build Coastguard Worker vn_wsi_create_image(struct vn_device *dev,
107*61046927SAndroid Build Coastguard Worker const VkImageCreateInfo *create_info,
108*61046927SAndroid Build Coastguard Worker const struct wsi_image_create_info *wsi_info,
109*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *alloc,
110*61046927SAndroid Build Coastguard Worker struct vn_image **out_img)
111*61046927SAndroid Build Coastguard Worker {
112*61046927SAndroid Build Coastguard Worker /* TODO This is the legacy path used by wsi_create_native_image when there
113*61046927SAndroid Build Coastguard Worker * is no modifier support. Instead of forcing linear tiling, we should ask
114*61046927SAndroid Build Coastguard Worker * wsi to use wsi_create_prime_image instead.
115*61046927SAndroid Build Coastguard Worker *
116*61046927SAndroid Build Coastguard Worker * In fact, this is not enough when the image is truely used for scanout by
117*61046927SAndroid Build Coastguard Worker * the host compositor. There can be requirements we fail to meet. We
118*61046927SAndroid Build Coastguard Worker * should require modifier support at some point.
119*61046927SAndroid Build Coastguard Worker */
120*61046927SAndroid Build Coastguard Worker const uint64_t modifier = DRM_FORMAT_MOD_LINEAR;
121*61046927SAndroid Build Coastguard Worker const VkImageDrmFormatModifierListCreateInfoEXT mod_list_info = {
122*61046927SAndroid Build Coastguard Worker .sType =
123*61046927SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT,
124*61046927SAndroid Build Coastguard Worker .pNext = create_info->pNext,
125*61046927SAndroid Build Coastguard Worker .drmFormatModifierCount = 1,
126*61046927SAndroid Build Coastguard Worker .pDrmFormatModifiers = &modifier,
127*61046927SAndroid Build Coastguard Worker };
128*61046927SAndroid Build Coastguard Worker VkImageCreateInfo local_create_info = *create_info;
129*61046927SAndroid Build Coastguard Worker create_info = &local_create_info;
130*61046927SAndroid Build Coastguard Worker if (wsi_info->scanout) {
131*61046927SAndroid Build Coastguard Worker assert(!vk_find_struct_const(
132*61046927SAndroid Build Coastguard Worker create_info->pNext, IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT));
133*61046927SAndroid Build Coastguard Worker
134*61046927SAndroid Build Coastguard Worker local_create_info.pNext = &mod_list_info;
135*61046927SAndroid Build Coastguard Worker local_create_info.tiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT;
136*61046927SAndroid Build Coastguard Worker
137*61046927SAndroid Build Coastguard Worker if (VN_DEBUG(WSI)) {
138*61046927SAndroid Build Coastguard Worker vn_log(
139*61046927SAndroid Build Coastguard Worker dev->instance,
140*61046927SAndroid Build Coastguard Worker "forcing scanout image linear (no explicit modifier support)");
141*61046927SAndroid Build Coastguard Worker }
142*61046927SAndroid Build Coastguard Worker } else {
143*61046927SAndroid Build Coastguard Worker if (dev->physical_device->renderer_driver_id ==
144*61046927SAndroid Build Coastguard Worker VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA) {
145*61046927SAndroid Build Coastguard Worker /* See explanation in vn_GetPhysicalDeviceImageFormatProperties2() */
146*61046927SAndroid Build Coastguard Worker local_create_info.flags &= ~VK_IMAGE_CREATE_ALIAS_BIT;
147*61046927SAndroid Build Coastguard Worker }
148*61046927SAndroid Build Coastguard Worker
149*61046927SAndroid Build Coastguard Worker if (VN_PERF(NO_TILED_WSI_IMAGE)) {
150*61046927SAndroid Build Coastguard Worker const VkImageDrmFormatModifierListCreateInfoEXT *modifier_info =
151*61046927SAndroid Build Coastguard Worker vk_find_struct_const(
152*61046927SAndroid Build Coastguard Worker create_info->pNext,
153*61046927SAndroid Build Coastguard Worker IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT);
154*61046927SAndroid Build Coastguard Worker assert(modifier_info);
155*61046927SAndroid Build Coastguard Worker assert(modifier_info->drmFormatModifierCount == 1 &&
156*61046927SAndroid Build Coastguard Worker modifier_info->pDrmFormatModifiers[0] ==
157*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_LINEAR);
158*61046927SAndroid Build Coastguard Worker if (VN_DEBUG(WSI)) {
159*61046927SAndroid Build Coastguard Worker vn_log(dev->instance,
160*61046927SAndroid Build Coastguard Worker "forcing scanout image linear (given no_tiled_wsi_image)");
161*61046927SAndroid Build Coastguard Worker }
162*61046927SAndroid Build Coastguard Worker }
163*61046927SAndroid Build Coastguard Worker }
164*61046927SAndroid Build Coastguard Worker
165*61046927SAndroid Build Coastguard Worker struct vn_image *img;
166*61046927SAndroid Build Coastguard Worker VkResult result = vn_image_create(dev, create_info, alloc, &img);
167*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
168*61046927SAndroid Build Coastguard Worker return result;
169*61046927SAndroid Build Coastguard Worker
170*61046927SAndroid Build Coastguard Worker img->wsi.is_wsi = true;
171*61046927SAndroid Build Coastguard Worker img->wsi.is_prime_blit_src = wsi_info->blit_src;
172*61046927SAndroid Build Coastguard Worker img->wsi.tiling_override = create_info->tiling;
173*61046927SAndroid Build Coastguard Worker
174*61046927SAndroid Build Coastguard Worker if (create_info->tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
175*61046927SAndroid Build Coastguard Worker VkDevice dev_handle = vn_device_to_handle(dev);
176*61046927SAndroid Build Coastguard Worker VkImage img_handle = vn_image_to_handle(img);
177*61046927SAndroid Build Coastguard Worker
178*61046927SAndroid Build Coastguard Worker VkImageDrmFormatModifierPropertiesEXT props = {
179*61046927SAndroid Build Coastguard Worker .sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT,
180*61046927SAndroid Build Coastguard Worker };
181*61046927SAndroid Build Coastguard Worker result = vn_GetImageDrmFormatModifierPropertiesEXT(dev_handle,
182*61046927SAndroid Build Coastguard Worker img_handle, &props);
183*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
184*61046927SAndroid Build Coastguard Worker vn_DestroyImage(dev_handle, img_handle, alloc);
185*61046927SAndroid Build Coastguard Worker return result;
186*61046927SAndroid Build Coastguard Worker }
187*61046927SAndroid Build Coastguard Worker
188*61046927SAndroid Build Coastguard Worker img->wsi.drm_format_modifier = props.drmFormatModifier;
189*61046927SAndroid Build Coastguard Worker }
190*61046927SAndroid Build Coastguard Worker
191*61046927SAndroid Build Coastguard Worker *out_img = img;
192*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
193*61046927SAndroid Build Coastguard Worker }
194*61046927SAndroid Build Coastguard Worker
195*61046927SAndroid Build Coastguard Worker VkResult
vn_wsi_create_image_from_swapchain(struct vn_device * dev,const VkImageCreateInfo * create_info,const VkImageSwapchainCreateInfoKHR * swapchain_info,const VkAllocationCallbacks * alloc,struct vn_image ** out_img)196*61046927SAndroid Build Coastguard Worker vn_wsi_create_image_from_swapchain(
197*61046927SAndroid Build Coastguard Worker struct vn_device *dev,
198*61046927SAndroid Build Coastguard Worker const VkImageCreateInfo *create_info,
199*61046927SAndroid Build Coastguard Worker const VkImageSwapchainCreateInfoKHR *swapchain_info,
200*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *alloc,
201*61046927SAndroid Build Coastguard Worker struct vn_image **out_img)
202*61046927SAndroid Build Coastguard Worker {
203*61046927SAndroid Build Coastguard Worker const struct vn_image *swapchain_img = vn_image_from_handle(
204*61046927SAndroid Build Coastguard Worker wsi_common_get_image(swapchain_info->swapchain, 0));
205*61046927SAndroid Build Coastguard Worker assert(swapchain_img->wsi.is_wsi);
206*61046927SAndroid Build Coastguard Worker
207*61046927SAndroid Build Coastguard Worker /* must match what the common WSI and vn_wsi_create_image do */
208*61046927SAndroid Build Coastguard Worker VkImageCreateInfo local_create_info = *create_info;
209*61046927SAndroid Build Coastguard Worker
210*61046927SAndroid Build Coastguard Worker /* match external memory */
211*61046927SAndroid Build Coastguard Worker const VkExternalMemoryImageCreateInfo local_external_info = {
212*61046927SAndroid Build Coastguard Worker .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO,
213*61046927SAndroid Build Coastguard Worker .pNext = local_create_info.pNext,
214*61046927SAndroid Build Coastguard Worker .handleTypes =
215*61046927SAndroid Build Coastguard Worker dev->physical_device->external_memory.renderer_handle_type,
216*61046927SAndroid Build Coastguard Worker };
217*61046927SAndroid Build Coastguard Worker local_create_info.pNext = &local_external_info;
218*61046927SAndroid Build Coastguard Worker
219*61046927SAndroid Build Coastguard Worker /* match image tiling */
220*61046927SAndroid Build Coastguard Worker local_create_info.tiling = swapchain_img->wsi.tiling_override;
221*61046927SAndroid Build Coastguard Worker
222*61046927SAndroid Build Coastguard Worker VkImageDrmFormatModifierListCreateInfoEXT local_mod_info;
223*61046927SAndroid Build Coastguard Worker if (local_create_info.tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
224*61046927SAndroid Build Coastguard Worker local_mod_info = (const VkImageDrmFormatModifierListCreateInfoEXT){
225*61046927SAndroid Build Coastguard Worker .sType =
226*61046927SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT,
227*61046927SAndroid Build Coastguard Worker .pNext = local_create_info.pNext,
228*61046927SAndroid Build Coastguard Worker .drmFormatModifierCount = 1,
229*61046927SAndroid Build Coastguard Worker .pDrmFormatModifiers = &swapchain_img->wsi.drm_format_modifier,
230*61046927SAndroid Build Coastguard Worker };
231*61046927SAndroid Build Coastguard Worker local_create_info.pNext = &local_mod_info;
232*61046927SAndroid Build Coastguard Worker }
233*61046927SAndroid Build Coastguard Worker
234*61046927SAndroid Build Coastguard Worker /* match image usage */
235*61046927SAndroid Build Coastguard Worker if (swapchain_img->wsi.is_prime_blit_src)
236*61046927SAndroid Build Coastguard Worker local_create_info.usage |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
237*61046927SAndroid Build Coastguard Worker
238*61046927SAndroid Build Coastguard Worker create_info = &local_create_info;
239*61046927SAndroid Build Coastguard Worker
240*61046927SAndroid Build Coastguard Worker struct vn_image *img;
241*61046927SAndroid Build Coastguard Worker VkResult result = vn_image_create(dev, create_info, alloc, &img);
242*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
243*61046927SAndroid Build Coastguard Worker return result;
244*61046927SAndroid Build Coastguard Worker
245*61046927SAndroid Build Coastguard Worker img->wsi.is_wsi = true;
246*61046927SAndroid Build Coastguard Worker img->wsi.tiling_override = swapchain_img->wsi.tiling_override;
247*61046927SAndroid Build Coastguard Worker img->wsi.drm_format_modifier = swapchain_img->wsi.drm_format_modifier;
248*61046927SAndroid Build Coastguard Worker
249*61046927SAndroid Build Coastguard Worker *out_img = img;
250*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
251*61046927SAndroid Build Coastguard Worker }
252*61046927SAndroid Build Coastguard Worker
253*61046927SAndroid Build Coastguard Worker /* swapchain commands */
254*61046927SAndroid Build Coastguard Worker
255*61046927SAndroid Build Coastguard Worker VkResult
vn_CreateSwapchainKHR(VkDevice device,const VkSwapchainCreateInfoKHR * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkSwapchainKHR * pSwapchain)256*61046927SAndroid Build Coastguard Worker vn_CreateSwapchainKHR(VkDevice device,
257*61046927SAndroid Build Coastguard Worker const VkSwapchainCreateInfoKHR *pCreateInfo,
258*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
259*61046927SAndroid Build Coastguard Worker VkSwapchainKHR *pSwapchain)
260*61046927SAndroid Build Coastguard Worker {
261*61046927SAndroid Build Coastguard Worker struct vn_device *dev = vn_device_from_handle(device);
262*61046927SAndroid Build Coastguard Worker
263*61046927SAndroid Build Coastguard Worker VkResult result =
264*61046927SAndroid Build Coastguard Worker wsi_CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
265*61046927SAndroid Build Coastguard Worker if (VN_DEBUG(WSI) && result == VK_SUCCESS) {
266*61046927SAndroid Build Coastguard Worker vn_log(dev->instance,
267*61046927SAndroid Build Coastguard Worker "swapchain %p: created with surface %p, min count %d, size "
268*61046927SAndroid Build Coastguard Worker "%dx%d, mode %s, old %p",
269*61046927SAndroid Build Coastguard Worker VN_WSI_PTR(*pSwapchain), VN_WSI_PTR(pCreateInfo->surface),
270*61046927SAndroid Build Coastguard Worker pCreateInfo->minImageCount, pCreateInfo->imageExtent.width,
271*61046927SAndroid Build Coastguard Worker pCreateInfo->imageExtent.height,
272*61046927SAndroid Build Coastguard Worker vk_PresentModeKHR_to_str(pCreateInfo->presentMode),
273*61046927SAndroid Build Coastguard Worker VN_WSI_PTR(pCreateInfo->oldSwapchain));
274*61046927SAndroid Build Coastguard Worker }
275*61046927SAndroid Build Coastguard Worker
276*61046927SAndroid Build Coastguard Worker vn_tls_set_async_pipeline_create();
277*61046927SAndroid Build Coastguard Worker
278*61046927SAndroid Build Coastguard Worker return vn_result(dev->instance, result);
279*61046927SAndroid Build Coastguard Worker }
280*61046927SAndroid Build Coastguard Worker
281*61046927SAndroid Build Coastguard Worker void
vn_DestroySwapchainKHR(VkDevice device,VkSwapchainKHR swapchain,const VkAllocationCallbacks * pAllocator)282*61046927SAndroid Build Coastguard Worker vn_DestroySwapchainKHR(VkDevice device,
283*61046927SAndroid Build Coastguard Worker VkSwapchainKHR swapchain,
284*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
285*61046927SAndroid Build Coastguard Worker {
286*61046927SAndroid Build Coastguard Worker struct vn_device *dev = vn_device_from_handle(device);
287*61046927SAndroid Build Coastguard Worker
288*61046927SAndroid Build Coastguard Worker wsi_DestroySwapchainKHR(device, swapchain, pAllocator);
289*61046927SAndroid Build Coastguard Worker if (VN_DEBUG(WSI))
290*61046927SAndroid Build Coastguard Worker vn_log(dev->instance, "swapchain %p: destroyed", VN_WSI_PTR(swapchain));
291*61046927SAndroid Build Coastguard Worker }
292*61046927SAndroid Build Coastguard Worker
293*61046927SAndroid Build Coastguard Worker VkResult
vn_QueuePresentKHR(VkQueue _queue,const VkPresentInfoKHR * pPresentInfo)294*61046927SAndroid Build Coastguard Worker vn_QueuePresentKHR(VkQueue _queue, const VkPresentInfoKHR *pPresentInfo)
295*61046927SAndroid Build Coastguard Worker {
296*61046927SAndroid Build Coastguard Worker VN_TRACE_FUNC();
297*61046927SAndroid Build Coastguard Worker struct vk_queue *queue_vk = vk_queue_from_handle(_queue);
298*61046927SAndroid Build Coastguard Worker struct vn_device *dev = (void *)queue_vk->base.device;
299*61046927SAndroid Build Coastguard Worker
300*61046927SAndroid Build Coastguard Worker VkResult result = wsi_common_queue_present(
301*61046927SAndroid Build Coastguard Worker &dev->physical_device->wsi_device, vn_device_to_handle(dev), _queue,
302*61046927SAndroid Build Coastguard Worker queue_vk->queue_family_index, pPresentInfo);
303*61046927SAndroid Build Coastguard Worker if (VN_DEBUG(WSI) && result != VK_SUCCESS) {
304*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < pPresentInfo->swapchainCount; i++) {
305*61046927SAndroid Build Coastguard Worker const VkResult r =
306*61046927SAndroid Build Coastguard Worker pPresentInfo->pResults ? pPresentInfo->pResults[i] : result;
307*61046927SAndroid Build Coastguard Worker vn_log(dev->instance, "swapchain %p: presented image %d: %s",
308*61046927SAndroid Build Coastguard Worker VN_WSI_PTR(pPresentInfo->pSwapchains[i]),
309*61046927SAndroid Build Coastguard Worker pPresentInfo->pImageIndices[i], vk_Result_to_str(r));
310*61046927SAndroid Build Coastguard Worker }
311*61046927SAndroid Build Coastguard Worker }
312*61046927SAndroid Build Coastguard Worker
313*61046927SAndroid Build Coastguard Worker return vn_result(dev->instance, result);
314*61046927SAndroid Build Coastguard Worker }
315*61046927SAndroid Build Coastguard Worker
316*61046927SAndroid Build Coastguard Worker VkResult
vn_AcquireNextImage2KHR(VkDevice device,const VkAcquireNextImageInfoKHR * pAcquireInfo,uint32_t * pImageIndex)317*61046927SAndroid Build Coastguard Worker vn_AcquireNextImage2KHR(VkDevice device,
318*61046927SAndroid Build Coastguard Worker const VkAcquireNextImageInfoKHR *pAcquireInfo,
319*61046927SAndroid Build Coastguard Worker uint32_t *pImageIndex)
320*61046927SAndroid Build Coastguard Worker {
321*61046927SAndroid Build Coastguard Worker VN_TRACE_FUNC();
322*61046927SAndroid Build Coastguard Worker struct vn_device *dev = vn_device_from_handle(device);
323*61046927SAndroid Build Coastguard Worker
324*61046927SAndroid Build Coastguard Worker VkResult result = wsi_common_acquire_next_image2(
325*61046927SAndroid Build Coastguard Worker &dev->physical_device->wsi_device, device, pAcquireInfo, pImageIndex);
326*61046927SAndroid Build Coastguard Worker if (VN_DEBUG(WSI) && result != VK_SUCCESS) {
327*61046927SAndroid Build Coastguard Worker const int idx = result >= VK_SUCCESS ? *pImageIndex : -1;
328*61046927SAndroid Build Coastguard Worker vn_log(dev->instance, "swapchain %p: acquired image %d: %s",
329*61046927SAndroid Build Coastguard Worker VN_WSI_PTR(pAcquireInfo->swapchain), idx,
330*61046927SAndroid Build Coastguard Worker vk_Result_to_str(result));
331*61046927SAndroid Build Coastguard Worker }
332*61046927SAndroid Build Coastguard Worker
333*61046927SAndroid Build Coastguard Worker /* XXX this relies on implicit sync */
334*61046927SAndroid Build Coastguard Worker if (result == VK_SUCCESS || result == VK_SUBOPTIMAL_KHR) {
335*61046927SAndroid Build Coastguard Worker struct vn_semaphore *sem =
336*61046927SAndroid Build Coastguard Worker vn_semaphore_from_handle(pAcquireInfo->semaphore);
337*61046927SAndroid Build Coastguard Worker if (sem)
338*61046927SAndroid Build Coastguard Worker vn_semaphore_signal_wsi(dev, sem);
339*61046927SAndroid Build Coastguard Worker
340*61046927SAndroid Build Coastguard Worker struct vn_fence *fence = vn_fence_from_handle(pAcquireInfo->fence);
341*61046927SAndroid Build Coastguard Worker if (fence)
342*61046927SAndroid Build Coastguard Worker vn_fence_signal_wsi(dev, fence);
343*61046927SAndroid Build Coastguard Worker }
344*61046927SAndroid Build Coastguard Worker
345*61046927SAndroid Build Coastguard Worker return vn_result(dev->instance, result);
346*61046927SAndroid Build Coastguard Worker }
347