xref: /aosp_15_r20/external/mesa3d/src/virtio/vulkan/vn_wsi.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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