blob: ed8b27cd32499a808d7bc96fa0c38a1d2a632f99 [file] [log] [blame]
Ian Elliott54cea232015-10-30 15:28:23 -06001/*
Lenny Komowa1b5e442019-09-16 16:14:36 -06002 * Copyright (c) 2015-2016, 2019 The Khronos Group Inc.
3 * Copyright (c) 2015-2016, 2019 Valve Corporation
4 * Copyright (c) 2015-2016, 2019 LunarG, Inc.
Ian Elliott54cea232015-10-30 15:28:23 -06005 *
Jon Ashburn4f80d672016-04-19 11:30:31 -06006 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
Ian Elliott54cea232015-10-30 15:28:23 -06009 *
Jon Ashburn4f80d672016-04-19 11:30:31 -060010 * http://www.apache.org/licenses/LICENSE-2.0
Ian Elliott54cea232015-10-30 15:28:23 -060011 *
Jon Ashburn4f80d672016-04-19 11:30:31 -060012 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
Ian Elliott54cea232015-10-30 15:28:23 -060017 *
18 * Author: Ian Elliott <ian@lunarg.com>
Jon Ashburn1c75aec2016-02-02 17:47:28 -070019 * Author: Jon Ashburn <jon@lunarg.com>
Ian Elliottb1849742015-11-19 11:58:08 -070020 * Author: Ian Elliott <ianelliott@google.com>
Jon Ashburn1c75aec2016-02-02 17:47:28 -070021 * Author: Mark Lobodzinski <mark@lunarg.com>
Lenny Komowa1b5e442019-09-16 16:14:36 -060022 * Author: Lenny Komow <lenny@lunarg.com>
Ian Elliott54cea232015-10-30 15:28:23 -060023 */
24
Tom Andersona8358802018-07-25 17:10:16 -070025#ifndef _GNU_SOURCE
Ian Elliott54cea232015-10-30 15:28:23 -060026#define _GNU_SOURCE
Tom Andersona8358802018-07-25 17:10:16 -070027#endif
Ian Elliott0d4ffa32016-03-24 13:59:22 -060028#include <stdio.h>
Ian Elliott54cea232015-10-30 15:28:23 -060029#include <stdlib.h>
30#include <string.h>
31#include "vk_loader_platform.h"
32#include "loader.h"
33#include "wsi.h"
Ian Elliott7c352552015-11-19 13:14:05 -070034#include <vulkan/vk_icd.h>
Ian Elliott54cea232015-10-30 15:28:23 -060035
Mark Young5467d672016-06-28 10:52:43 -060036// The first ICD/Loader interface that support querying the SurfaceKHR from
37// the ICDs.
38#define ICD_VER_SUPPORTS_ICD_SURFACE_KHR 3
39
Mark Lobodzinski91c10752017-01-26 12:16:30 -070040void wsi_create_instance(struct loader_instance *ptr_instance, const VkInstanceCreateInfo *pCreateInfo) {
Ian Elliott5fb891a2015-10-30 17:45:05 -060041 ptr_instance->wsi_surface_enabled = false;
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -070042
43#ifdef VK_USE_PLATFORM_WIN32_KHR
Jon Ashburncc370d02016-03-08 09:30:30 -070044 ptr_instance->wsi_win32_surface_enabled = false;
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -070045#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -070046#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott54cea232015-10-30 15:28:23 -060047 ptr_instance->wsi_wayland_surface_enabled = false;
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -070048#endif // VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -070049#ifdef VK_USE_PLATFORM_XCB_KHR
Ian Elliott54cea232015-10-30 15:28:23 -060050 ptr_instance->wsi_xcb_surface_enabled = false;
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -070051#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -070052#ifdef VK_USE_PLATFORM_XLIB_KHR
Ian Elliott54cea232015-10-30 15:28:23 -060053 ptr_instance->wsi_xlib_surface_enabled = false;
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -070054#endif // VK_USE_PLATFORM_XLIB_KHR
Nicolas Caramellifa696ca2020-07-04 22:53:59 +020055#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
56 ptr_instance->wsi_directfb_surface_enabled = false;
57#endif // VK_USE_PLATFORM_DIRECTFB_EXT
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -070058#ifdef VK_USE_PLATFORM_ANDROID_KHR
59 ptr_instance->wsi_android_surface_enabled = false;
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -070060#endif // VK_USE_PLATFORM_ANDROID_KHR
Karl Schultzd81ebfb2017-12-12 10:33:01 -050061#ifdef VK_USE_PLATFORM_MACOS_MVK
62 ptr_instance->wsi_macos_surface_enabled = false;
63#endif // VK_USE_PLATFORM_MACOS_MVK
64#ifdef VK_USE_PLATFORM_IOS_MVK
65 ptr_instance->wsi_ios_surface_enabled = false;
66#endif // VK_USE_PLATFORM_IOS_MVK
J.D. Rouand7928a12020-11-16 15:36:42 -080067#ifdef VK_USE_PLATFORM_GGP
68 ptr_instance->wsi_ggp_surface_enabled = false;
69#endif // VK_USE_PLATFORM_GGP
Craig Stoutf3b74dc2020-10-26 12:05:15 -070070#ifdef VK_USE_PLATFORM_FUCHSIA
71 ptr_instance->wsi_imagepipe_surface_enabled = false;
72#endif // VK_USE_PLATFORM_FUCHSIA
Jon Ashburncc370d02016-03-08 09:30:30 -070073 ptr_instance->wsi_display_enabled = false;
Lenny Komow61139782018-05-31 11:32:31 -060074 ptr_instance->wsi_display_props2_enabled = false;
Lenny Komowa1b5e442019-09-16 16:14:36 -060075#ifdef VK_USE_PLATFORM_METAL_EXT
76 ptr_instance->wsi_metal_surface_enabled = false;
77#endif // VK_USE_PLATFORM_METAL_EXT
Mike Gorchak684c2a62021-03-10 22:17:20 -050078#ifdef VK_USE_PLATFORM_SCREEN_QNX
79 ptr_instance->wsi_screen_surface_enabled = false;
80#endif // VK_USE_PLATFORM_SCREEN_QNX
Jon Ashburncc370d02016-03-08 09:30:30 -070081
Jon Ashburna0673ab2016-01-11 13:12:43 -070082 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -070083 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
Ian Elliott54cea232015-10-30 15:28:23 -060084 ptr_instance->wsi_surface_enabled = true;
Ian Elliottb1849742015-11-19 11:58:08 -070085 continue;
Ian Elliott54cea232015-10-30 15:28:23 -060086 }
Ian Elliottb1849742015-11-19 11:58:08 -070087#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -070088 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
Ian Elliott1693f592015-11-23 10:17:23 -070089 ptr_instance->wsi_win32_surface_enabled = true;
Ian Elliottb1849742015-11-19 11:58:08 -070090 continue;
Ian Elliott54cea232015-10-30 15:28:23 -060091 }
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -070092#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott5fb891a2015-10-30 17:45:05 -060093#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -070094 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
Ian Elliott54cea232015-10-30 15:28:23 -060095 ptr_instance->wsi_wayland_surface_enabled = true;
Ian Elliottb1849742015-11-19 11:58:08 -070096 continue;
Ian Elliott54cea232015-10-30 15:28:23 -060097 }
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -070098#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott5fb891a2015-10-30 17:45:05 -060099#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700100 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
Ian Elliott54cea232015-10-30 15:28:23 -0600101 ptr_instance->wsi_xcb_surface_enabled = true;
Ian Elliottb1849742015-11-19 11:58:08 -0700102 continue;
Ian Elliott54cea232015-10-30 15:28:23 -0600103 }
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -0700104#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott5fb891a2015-10-30 17:45:05 -0600105#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700106 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
Ian Elliott54cea232015-10-30 15:28:23 -0600107 ptr_instance->wsi_xlib_surface_enabled = true;
Ian Elliottb1849742015-11-19 11:58:08 -0700108 continue;
Ian Elliott54cea232015-10-30 15:28:23 -0600109 }
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -0700110#endif // VK_USE_PLATFORM_XLIB_KHR
Nicolas Caramellifa696ca2020-07-04 22:53:59 +0200111#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
112 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_EXT_DIRECTFB_SURFACE_EXTENSION_NAME) == 0) {
113 ptr_instance->wsi_directfb_surface_enabled = true;
114 continue;
115 }
116#endif // VK_USE_PLATFORM_DIRECTFB_EXT
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -0700117#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700118 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -0700119 ptr_instance->wsi_android_surface_enabled = true;
120 continue;
121 }
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -0700122#endif // VK_USE_PLATFORM_ANDROID_KHR
Karl Schultzd81ebfb2017-12-12 10:33:01 -0500123#ifdef VK_USE_PLATFORM_MACOS_MVK
124 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_MVK_MACOS_SURFACE_EXTENSION_NAME) == 0) {
125 ptr_instance->wsi_macos_surface_enabled = true;
126 continue;
127 }
128#endif // VK_USE_PLATFORM_MACOS_MVK
129#ifdef VK_USE_PLATFORM_IOS_MVK
130 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_MVK_IOS_SURFACE_EXTENSION_NAME) == 0) {
131 ptr_instance->wsi_ios_surface_enabled = true;
132 continue;
133 }
134#endif // VK_USE_PLATFORM_IOS_MVK
J.D. Rouand7928a12020-11-16 15:36:42 -0800135#ifdef VK_USE_PLATFORM_GGP
136 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_GGP_STREAM_DESCRIPTOR_SURFACE_EXTENSION_NAME) == 0) {
137 ptr_instance->wsi_ggp_surface_enabled = true;
138 continue;
139 }
140#endif // VK_USE_PLATFORM_GGP
Craig Stoutf3b74dc2020-10-26 12:05:15 -0700141#ifdef VK_USE_PLATFORM_FUCHSIA
142 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_FUCHSIA_IMAGEPIPE_SURFACE_EXTENSION_NAME) == 0) {
143 ptr_instance->wsi_imagepipe_surface_enabled = true;
144 continue;
145 }
146#endif // VK_USE_PLATFORM_FUCHSIA
Bryan Law-Smith57305692019-04-01 09:45:55 +0100147 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_EXT_HEADLESS_SURFACE_EXTENSION_NAME) == 0) {
148 ptr_instance->wsi_headless_surface_enabled = true;
149 continue;
150 }
Lenny Komowa1b5e442019-09-16 16:14:36 -0600151#if defined(VK_USE_PLATFORM_METAL_EXT)
152 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_EXT_METAL_SURFACE_EXTENSION_NAME) == 0) {
153 ptr_instance->wsi_metal_surface_enabled = true;
154 continue;
155 }
156#endif
Mike Gorchak684c2a62021-03-10 22:17:20 -0500157#if defined(VK_USE_PLATFORM_SCREEN_QNX)
158 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_QNX_SCREEN_SURFACE_EXTENSION_NAME) == 0) {
159 ptr_instance->wsi_screen_surface_enabled = true;
160 continue;
161 }
162#endif // VK_USE_PLATFORM_SCREEN_QNX
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700163 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
Jon Ashburncc370d02016-03-08 09:30:30 -0700164 ptr_instance->wsi_display_enabled = true;
165 continue;
166 }
Lenny Komow61139782018-05-31 11:32:31 -0600167 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_GET_DISPLAY_PROPERTIES_2_EXTENSION_NAME) == 0) {
168 ptr_instance->wsi_display_props2_enabled = true;
169 continue;
170 }
Ian Elliott54cea232015-10-30 15:28:23 -0600171 }
172}
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600173
174// Linux WSI surface extensions are not always compiled into the loader. (Assume
175// for Windows the KHR_win32_surface is always compiled into loader). A given
176// Linux build environment might not have the headers required for building one
Tony-LunarG03667212018-10-23 14:08:03 -0600177// of the three extensions (Xlib, Xcb, Wayland). Thus, need to check if
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600178// the built loader actually supports the particular Linux surface extension.
179// If not supported by the built loader it will not be included in the list of
180// enumerated instance extensions. This solves the issue where an ICD or layer
181// advertises support for a given Linux surface extension but the loader was not
182// built to support the extension.
Jon Ashburnae8f1e82016-03-25 12:49:35 -0600183bool wsi_unsupported_instance_extension(const VkExtensionProperties *ext_prop) {
Jon Ashburnae8f1e82016-03-25 12:49:35 -0600184#ifndef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -0700185 if (!strcmp(ext_prop->extensionName, "VK_KHR_wayland_surface")) return true;
186#endif // VK_USE_PLATFORM_WAYLAND_KHR
Jon Ashburnae8f1e82016-03-25 12:49:35 -0600187#ifndef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -0700188 if (!strcmp(ext_prop->extensionName, "VK_KHR_xcb_surface")) return true;
189#endif // VK_USE_PLATFORM_XCB_KHR
Jon Ashburnae8f1e82016-03-25 12:49:35 -0600190#ifndef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -0700191 if (!strcmp(ext_prop->extensionName, "VK_KHR_xlib_surface")) return true;
192#endif // VK_USE_PLATFORM_XLIB_KHR
Nicolas Caramellifa696ca2020-07-04 22:53:59 +0200193#ifndef VK_USE_PLATFORM_DIRECTFB_EXT
194 if (!strcmp(ext_prop->extensionName, "VK_EXT_directfb_surface")) return true;
195#endif // VK_USE_PLATFORM_DIRECTFB_EXT
Mike Gorchak684c2a62021-03-10 22:17:20 -0500196#ifndef VK_USE_PLATFORM_SCREEN_QNX
197 if (!strcmp(ext_prop->extensionName, "VK_QNX_screen_surface")) return true;
198#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott54cea232015-10-30 15:28:23 -0600199
Jon Ashburnae8f1e82016-03-25 12:49:35 -0600200 return false;
201}
Ian Elliott7c352552015-11-19 13:14:05 -0700202
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600203// Functions for the VK_KHR_surface extension:
204
205// This is the trampoline entrypoint for DestroySurfaceKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700206LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface,
207 const VkAllocationCallbacks *pAllocator) {
Ian Elliottabf50662015-11-25 14:43:02 -0700208 const VkLayerInstanceDispatchTable *disp;
Mark Young274e4bc2017-01-19 21:10:49 -0700209 disp = loader_get_instance_layer_dispatch(instance);
Ian Elliottabf50662015-11-25 14:43:02 -0700210 disp->DestroySurfaceKHR(instance, surface, pAllocator);
211}
212
Jon Ashburncc370d02016-03-08 09:30:30 -0700213// TODO probably need to lock around all the loader_get_instance() calls.
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600214
215// This is the instance chain terminator function for DestroySurfaceKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700216VKAPI_ATTR void VKAPI_CALL terminator_DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface,
217 const VkAllocationCallbacks *pAllocator) {
Ian Elliott1693f592015-11-23 10:17:23 -0700218 struct loader_instance *ptr_instance = loader_get_instance(instance);
219
Karl Schultza9e989f2016-11-19 09:02:27 -0700220 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)surface;
Mark Young11e9d472016-10-17 12:27:36 -0600221 if (NULL != icd_surface) {
222 if (NULL != icd_surface->real_icd_surfaces) {
Mark Young573a7a12016-11-02 09:37:08 -0600223 uint32_t i = 0;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700224 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
225 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
Mark Youngd4e5ba42017-02-28 09:58:04 -0700226 if (NULL != icd_term->dispatch.DestroySurfaceKHR && (VkSurfaceKHR)NULL != icd_surface->real_icd_surfaces[i]) {
227 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, icd_surface->real_icd_surfaces[i], pAllocator);
Mark Young3eda5882016-12-01 10:42:21 -0700228 icd_surface->real_icd_surfaces[i] = (VkSurfaceKHR)NULL;
Mark Young11e9d472016-10-17 12:27:36 -0600229 }
230 } else {
231 // The real_icd_surface for any ICD not supporting the
232 // proper interface version should be NULL. If not, then
233 // we have a problem.
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700234 assert((VkSurfaceKHR)NULL == icd_surface->real_icd_surfaces[i]);
Mark Young5467d672016-06-28 10:52:43 -0600235 }
Mark Young5467d672016-06-28 10:52:43 -0600236 }
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700237 loader_instance_heap_free(ptr_instance, icd_surface->real_icd_surfaces);
Mark Young5467d672016-06-28 10:52:43 -0600238 }
Mark Young5467d672016-06-28 10:52:43 -0600239
Karl Schultza9e989f2016-11-19 09:02:27 -0700240 loader_instance_heap_free(ptr_instance, (void *)(uintptr_t)surface);
Mark Young11e9d472016-10-17 12:27:36 -0600241 }
Ian Elliott7c352552015-11-19 13:14:05 -0700242}
243
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600244// This is the trampoline entrypoint for GetPhysicalDeviceSurfaceSupportKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700245LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
246 uint32_t queueFamilyIndex, VkSurfaceKHR surface,
247 VkBool32 *pSupported) {
Ian Elliott54cea232015-10-30 15:28:23 -0600248 const VkLayerInstanceDispatchTable *disp;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700249 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Mark Young274e4bc2017-01-19 21:10:49 -0700250 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700251 VkResult res = disp->GetPhysicalDeviceSurfaceSupportKHR(unwrapped_phys_dev, queueFamilyIndex, surface, pSupported);
Ian Elliott54cea232015-10-30 15:28:23 -0600252 return res;
253}
254
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600255// This is the instance chain terminator function for
256// GetPhysicalDeviceSurfaceSupportKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700257VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
258 uint32_t queueFamilyIndex, VkSurfaceKHR surface,
259 VkBool32 *pSupported) {
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600260 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700261 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young26c19372016-11-03 14:27:13 -0600262 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700263 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600264 if (!ptr_instance->wsi_surface_enabled) {
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -0700265 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Youngd4e5ba42017-02-28 09:58:04 -0700266 "VK_KHR_surface extension not enabled. vkGetPhysicalDeviceSurfaceSupportKHR not executed!\n");
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600267 return VK_SUCCESS;
268 }
269
Mark Youngd4e5ba42017-02-28 09:58:04 -0700270 if (NULL == pSupported) {
271 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
272 "NULL pointer passed into vkGetPhysicalDeviceSurfaceSupportKHR for pSupported!\n");
273 assert(false && "GetPhysicalDeviceSurfaceSupportKHR: Error, null pSupported");
274 }
Ian Elliott54cea232015-10-30 15:28:23 -0600275 *pSupported = false;
276
Mark Youngd4e5ba42017-02-28 09:58:04 -0700277 if (NULL == icd_term->dispatch.GetPhysicalDeviceSurfaceSupportKHR) {
278 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
279 "ICD for selected physical device is not exporting vkGetPhysicalDeviceSurfaceSupportKHR!\n");
280 assert(false && "loader: null GetPhysicalDeviceSurfaceSupportKHR ICD pointer");
281 }
Ian Elliott54cea232015-10-30 15:28:23 -0600282
Karl Schultza9e989f2016-11-19 09:02:27 -0700283 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)surface;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700284 if (NULL != icd_surface->real_icd_surfaces && (VkSurfaceKHR)NULL != icd_surface->real_icd_surfaces[phys_dev_term->icd_index]) {
Mark Youngd4e5ba42017-02-28 09:58:04 -0700285 return icd_term->dispatch.GetPhysicalDeviceSurfaceSupportKHR(
286 phys_dev_term->phys_dev, queueFamilyIndex, icd_surface->real_icd_surfaces[phys_dev_term->icd_index], pSupported);
Mark Young5467d672016-06-28 10:52:43 -0600287 }
Mark Young5467d672016-06-28 10:52:43 -0600288
Mark Youngd4e5ba42017-02-28 09:58:04 -0700289 return icd_term->dispatch.GetPhysicalDeviceSurfaceSupportKHR(phys_dev_term->phys_dev, queueFamilyIndex, surface, pSupported);
Ian Elliott54cea232015-10-30 15:28:23 -0600290}
291
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600292// This is the trampoline entrypoint for GetPhysicalDeviceSurfaceCapabilitiesKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700293LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
294 VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
Ian Elliottea666b22015-11-19 16:05:09 -0700295 const VkLayerInstanceDispatchTable *disp;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700296 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Mark Young274e4bc2017-01-19 21:10:49 -0700297 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700298 VkResult res = disp->GetPhysicalDeviceSurfaceCapabilitiesKHR(unwrapped_phys_dev, surface, pSurfaceCapabilities);
Ian Elliottea666b22015-11-19 16:05:09 -0700299 return res;
300}
301
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600302// This is the instance chain terminator function for
303// GetPhysicalDeviceSurfaceCapabilitiesKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700304VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice,
305 VkSurfaceKHR surface,
306 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600307 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700308 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young26c19372016-11-03 14:27:13 -0600309 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700310 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600311 if (!ptr_instance->wsi_surface_enabled) {
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -0700312 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Youngd4e5ba42017-02-28 09:58:04 -0700313 "VK_KHR_surface extension not enabled. vkGetPhysicalDeviceSurfaceCapabilitiesKHR not executed!\n");
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600314 return VK_SUCCESS;
315 }
316
Mark Youngd4e5ba42017-02-28 09:58:04 -0700317 if (NULL == pSurfaceCapabilities) {
318 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
319 "NULL pointer passed into vkGetPhysicalDeviceSurfaceCapabilitiesKHR for pSurfaceCapabilities!\n");
320 assert(false && "GetPhysicalDeviceSurfaceCapabilitiesKHR: Error, null pSurfaceCapabilities");
321 }
Ian Elliottea666b22015-11-19 16:05:09 -0700322
Mark Youngd4e5ba42017-02-28 09:58:04 -0700323 if (NULL == icd_term->dispatch.GetPhysicalDeviceSurfaceCapabilitiesKHR) {
324 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
325 "ICD for selected physical device is not exporting vkGetPhysicalDeviceSurfaceCapabilitiesKHR!\n");
326 assert(false && "loader: null GetPhysicalDeviceSurfaceCapabilitiesKHR ICD pointer");
327 }
Ian Elliottea666b22015-11-19 16:05:09 -0700328
Karl Schultza9e989f2016-11-19 09:02:27 -0700329 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)surface;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700330 if (NULL != icd_surface->real_icd_surfaces && (VkSurfaceKHR)NULL != icd_surface->real_icd_surfaces[phys_dev_term->icd_index]) {
Mark Youngd4e5ba42017-02-28 09:58:04 -0700331 return icd_term->dispatch.GetPhysicalDeviceSurfaceCapabilitiesKHR(
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700332 phys_dev_term->phys_dev, icd_surface->real_icd_surfaces[phys_dev_term->icd_index], pSurfaceCapabilities);
Mark Young5467d672016-06-28 10:52:43 -0600333 }
Mark Young5467d672016-06-28 10:52:43 -0600334
Mark Youngd4e5ba42017-02-28 09:58:04 -0700335 return icd_term->dispatch.GetPhysicalDeviceSurfaceCapabilitiesKHR(phys_dev_term->phys_dev, surface, pSurfaceCapabilities);
Ian Elliottea666b22015-11-19 16:05:09 -0700336}
337
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600338// This is the trampoline entrypoint for GetPhysicalDeviceSurfaceFormatsKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700339LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice,
340 VkSurfaceKHR surface,
341 uint32_t *pSurfaceFormatCount,
342 VkSurfaceFormatKHR *pSurfaceFormats) {
343 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Ian Elliottea666b22015-11-19 16:05:09 -0700344 const VkLayerInstanceDispatchTable *disp;
Mark Young274e4bc2017-01-19 21:10:49 -0700345 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700346 VkResult res = disp->GetPhysicalDeviceSurfaceFormatsKHR(unwrapped_phys_dev, surface, pSurfaceFormatCount, pSurfaceFormats);
Ian Elliottea666b22015-11-19 16:05:09 -0700347 return res;
348}
349
Mark Young573a7a12016-11-02 09:37:08 -0600350// This is the instance chain terminator function for
351// GetPhysicalDeviceSurfaceFormatsKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700352VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
353 uint32_t *pSurfaceFormatCount,
354 VkSurfaceFormatKHR *pSurfaceFormats) {
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600355 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700356 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young26c19372016-11-03 14:27:13 -0600357 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700358 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600359 if (!ptr_instance->wsi_surface_enabled) {
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -0700360 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Youngd4e5ba42017-02-28 09:58:04 -0700361 "VK_KHR_surface extension not enabled. vkGetPhysicalDeviceSurfaceFormatsKHR not executed!\n");
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600362 return VK_SUCCESS;
363 }
364
Mark Youngd4e5ba42017-02-28 09:58:04 -0700365 if (NULL == pSurfaceFormatCount) {
366 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
367 "NULL pointer passed into vkGetPhysicalDeviceSurfaceFormatsKHR for pSurfaceFormatCount!\n");
368 assert(false && "GetPhysicalDeviceSurfaceFormatsKHR(: Error, null pSurfaceFormatCount");
369 }
Ian Elliottea666b22015-11-19 16:05:09 -0700370
Mark Youngd4e5ba42017-02-28 09:58:04 -0700371 if (NULL == icd_term->dispatch.GetPhysicalDeviceSurfaceFormatsKHR) {
372 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
373 "ICD for selected physical device is not exporting vkGetPhysicalDeviceSurfaceCapabilitiesKHR!\n");
374 assert(false && "loader: null GetPhysicalDeviceSurfaceFormatsKHR ICD pointer");
375 }
Ian Elliottea666b22015-11-19 16:05:09 -0700376
Karl Schultza9e989f2016-11-19 09:02:27 -0700377 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)surface;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700378 if (NULL != icd_surface->real_icd_surfaces && (VkSurfaceKHR)NULL != icd_surface->real_icd_surfaces[phys_dev_term->icd_index]) {
Mark Youngd4e5ba42017-02-28 09:58:04 -0700379 return icd_term->dispatch.GetPhysicalDeviceSurfaceFormatsKHR(phys_dev_term->phys_dev,
380 icd_surface->real_icd_surfaces[phys_dev_term->icd_index],
381 pSurfaceFormatCount, pSurfaceFormats);
Mark Young5467d672016-06-28 10:52:43 -0600382 }
Mark Young5467d672016-06-28 10:52:43 -0600383
Mark Youngd4e5ba42017-02-28 09:58:04 -0700384 return icd_term->dispatch.GetPhysicalDeviceSurfaceFormatsKHR(phys_dev_term->phys_dev, surface, pSurfaceFormatCount,
385 pSurfaceFormats);
Ian Elliottea666b22015-11-19 16:05:09 -0700386}
387
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600388// This is the trampoline entrypoint for GetPhysicalDeviceSurfacePresentModesKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700389LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice,
390 VkSurfaceKHR surface,
391 uint32_t *pPresentModeCount,
392 VkPresentModeKHR *pPresentModes) {
393 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Ian Elliottea666b22015-11-19 16:05:09 -0700394 const VkLayerInstanceDispatchTable *disp;
Mark Young274e4bc2017-01-19 21:10:49 -0700395 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700396 VkResult res = disp->GetPhysicalDeviceSurfacePresentModesKHR(unwrapped_phys_dev, surface, pPresentModeCount, pPresentModes);
Ian Elliottea666b22015-11-19 16:05:09 -0700397 return res;
398}
399
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600400// This is the instance chain terminator function for
401// GetPhysicalDeviceSurfacePresentModesKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700402VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice,
403 VkSurfaceKHR surface, uint32_t *pPresentModeCount,
404 VkPresentModeKHR *pPresentModes) {
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600405 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700406 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young26c19372016-11-03 14:27:13 -0600407 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700408 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600409 if (!ptr_instance->wsi_surface_enabled) {
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -0700410 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Youngd4e5ba42017-02-28 09:58:04 -0700411 "VK_KHR_surface extension not enabled. vkGetPhysicalDeviceSurfacePresentModesKHR not executed!\n");
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600412 return VK_SUCCESS;
413 }
414
Mark Youngd4e5ba42017-02-28 09:58:04 -0700415 if (NULL == pPresentModeCount) {
416 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
417 "NULL pointer passed into vkGetPhysicalDeviceSurfacePresentModesKHR for pPresentModeCount!\n");
418 assert(false && "GetPhysicalDeviceSurfacePresentModesKHR(: Error, null pPresentModeCount");
419 }
Ian Elliottea666b22015-11-19 16:05:09 -0700420
Mark Youngd4e5ba42017-02-28 09:58:04 -0700421 if (NULL == icd_term->dispatch.GetPhysicalDeviceSurfacePresentModesKHR) {
422 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
423 "ICD for selected physical device is not exporting vkGetPhysicalDeviceSurfacePresentModesKHR!\n");
424 assert(false && "loader: null GetPhysicalDeviceSurfacePresentModesKHR ICD pointer");
425 }
Ian Elliottea666b22015-11-19 16:05:09 -0700426
Karl Schultza9e989f2016-11-19 09:02:27 -0700427 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)surface;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700428 if (NULL != icd_surface->real_icd_surfaces && (VkSurfaceKHR)NULL != icd_surface->real_icd_surfaces[phys_dev_term->icd_index]) {
Mark Youngd4e5ba42017-02-28 09:58:04 -0700429 return icd_term->dispatch.GetPhysicalDeviceSurfacePresentModesKHR(
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700430 phys_dev_term->phys_dev, icd_surface->real_icd_surfaces[phys_dev_term->icd_index], pPresentModeCount, pPresentModes);
Mark Young5467d672016-06-28 10:52:43 -0600431 }
Mark Young5467d672016-06-28 10:52:43 -0600432
Mark Youngd4e5ba42017-02-28 09:58:04 -0700433 return icd_term->dispatch.GetPhysicalDeviceSurfacePresentModesKHR(phys_dev_term->phys_dev, surface, pPresentModeCount,
434 pPresentModes);
Ian Elliottea666b22015-11-19 16:05:09 -0700435}
436
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600437// Functions for the VK_KHR_swapchain extension:
Ian Elliott7c352552015-11-19 13:14:05 -0700438
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600439// This is the trampoline entrypoint for CreateSwapchainKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700440LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
441 const VkAllocationCallbacks *pAllocator,
442 VkSwapchainKHR *pSwapchain) {
Ian Elliott9b89a472015-11-19 16:39:21 -0700443 const VkLayerDispatchTable *disp;
444 disp = loader_get_dispatch(device);
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700445 return disp->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
Ian Elliott9b89a472015-11-19 16:39:21 -0700446}
Ian Elliott7c352552015-11-19 13:14:05 -0700447
Mark Youngd4e5ba42017-02-28 09:58:04 -0700448VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Karl Schultzd81ebfb2017-12-12 10:33:01 -0500449 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Young5467d672016-06-28 10:52:43 -0600450 uint32_t icd_index = 0;
451 struct loader_device *dev;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700452 struct loader_icd_term *icd_term = loader_get_icd_and_device(device, &dev, &icd_index);
Mark Youngd4e5ba42017-02-28 09:58:04 -0700453 if (NULL != icd_term && NULL != icd_term->dispatch.CreateSwapchainKHR) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700454 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)pCreateInfo->surface;
Mark Young5467d672016-06-28 10:52:43 -0600455 if (NULL != icd_surface->real_icd_surfaces) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700456 if ((VkSurfaceKHR)NULL != icd_surface->real_icd_surfaces[icd_index]) {
Mark Young5467d672016-06-28 10:52:43 -0600457 // We found the ICD, and there is an ICD KHR surface
458 // associated with it, so copy the CreateInfo struct
459 // and point it at the ICD's surface.
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700460 VkSwapchainCreateInfoKHR *pCreateCopy = loader_stack_alloc(sizeof(VkSwapchainCreateInfoKHR));
Mark Young5467d672016-06-28 10:52:43 -0600461 if (NULL == pCreateCopy) {
462 return VK_ERROR_OUT_OF_HOST_MEMORY;
463 }
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700464 memcpy(pCreateCopy, pCreateInfo, sizeof(VkSwapchainCreateInfoKHR));
465 pCreateCopy->surface = icd_surface->real_icd_surfaces[icd_index];
Mark Youngd4e5ba42017-02-28 09:58:04 -0700466 return icd_term->dispatch.CreateSwapchainKHR(device, pCreateCopy, pAllocator, pSwapchain);
Mark Young5467d672016-06-28 10:52:43 -0600467 }
468 }
Mark Youngd4e5ba42017-02-28 09:58:04 -0700469 return icd_term->dispatch.CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
Mark Young5467d672016-06-28 10:52:43 -0600470 }
471 return VK_SUCCESS;
472}
473
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600474// This is the trampoline entrypoint for DestroySwapchainKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700475LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain,
476 const VkAllocationCallbacks *pAllocator) {
Ian Elliott9b89a472015-11-19 16:39:21 -0700477 const VkLayerDispatchTable *disp;
478 disp = loader_get_dispatch(device);
479 disp->DestroySwapchainKHR(device, swapchain, pAllocator);
480}
Ian Elliott7c352552015-11-19 13:14:05 -0700481
Mark Youngd4e5ba42017-02-28 09:58:04 -0700482// This is the trampoline entrypoint for GetSwapchainImagesKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700483LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain,
484 uint32_t *pSwapchainImageCount, VkImage *pSwapchainImages) {
Ian Elliott9b89a472015-11-19 16:39:21 -0700485 const VkLayerDispatchTable *disp;
486 disp = loader_get_dispatch(device);
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700487 return disp->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
Ian Elliott9b89a472015-11-19 16:39:21 -0700488}
489
Mark Youngd4e5ba42017-02-28 09:58:04 -0700490// This is the trampoline entrypoint for AcquireNextImageKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700491LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
492 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Ian Elliott9b89a472015-11-19 16:39:21 -0700493 const VkLayerDispatchTable *disp;
494 disp = loader_get_dispatch(device);
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700495 return disp->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Ian Elliott9b89a472015-11-19 16:39:21 -0700496}
497
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600498// This is the trampoline entrypoint for QueuePresentKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700499LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
Ian Elliott9b89a472015-11-19 16:39:21 -0700500 const VkLayerDispatchTable *disp;
501 disp = loader_get_dispatch(queue);
Mark Young76b3fe02016-09-08 12:28:38 -0600502 return disp->QueuePresentKHR(queue, pPresentInfo);
Ian Elliott9b89a472015-11-19 16:39:21 -0700503}
Ian Elliott7c352552015-11-19 13:14:05 -0700504
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700505static VkIcdSurface *AllocateIcdSurfaceStruct(struct loader_instance *instance, size_t base_size, size_t platform_size) {
Mark Youngf27962c2016-09-16 10:18:42 -0600506 // Next, if so, proceed with the implementation of this function:
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700507 VkIcdSurface *pIcdSurface = loader_instance_heap_alloc(instance, sizeof(VkIcdSurface), VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
Mark Youngf27962c2016-09-16 10:18:42 -0600508 if (pIcdSurface != NULL) {
509 // Setup the new sizes and offsets so we can grow the structures in the
510 // future without having problems
511 pIcdSurface->base_size = (uint32_t)base_size;
512 pIcdSurface->platform_size = (uint32_t)platform_size;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700513 pIcdSurface->non_platform_offset = (uint32_t)((uint8_t *)(&pIcdSurface->base_size) - (uint8_t *)pIcdSurface);
Mark Youngf27962c2016-09-16 10:18:42 -0600514 pIcdSurface->entire_size = sizeof(VkIcdSurface);
515
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700516 pIcdSurface->real_icd_surfaces = loader_instance_heap_alloc(instance, sizeof(VkSurfaceKHR) * instance->total_icd_count,
517 VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
Mark Young5117fdc2016-12-13 17:19:32 -0700518 if (pIcdSurface->real_icd_surfaces == NULL) {
519 loader_instance_heap_free(instance, pIcdSurface);
520 pIcdSurface = NULL;
Mark Youngf27962c2016-09-16 10:18:42 -0600521 } else {
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700522 memset(pIcdSurface->real_icd_surfaces, 0, sizeof(VkSurfaceKHR) * instance->total_icd_count);
Mark Youngf27962c2016-09-16 10:18:42 -0600523 }
524 }
525 return pIcdSurface;
526}
527
Ian Elliott7c352552015-11-19 13:14:05 -0700528#ifdef VK_USE_PLATFORM_WIN32_KHR
529
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600530// Functions for the VK_KHR_win32_surface extension:
531
532// This is the trampoline entrypoint for CreateWin32SurfaceKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700533LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateWin32SurfaceKHR(VkInstance instance,
534 const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
535 const VkAllocationCallbacks *pAllocator,
536 VkSurfaceKHR *pSurface) {
Jon Ashburn16edfa62015-11-25 17:55:49 -0700537 const VkLayerInstanceDispatchTable *disp;
Mark Young274e4bc2017-01-19 21:10:49 -0700538 disp = loader_get_instance_layer_dispatch(instance);
Jon Ashburn16edfa62015-11-25 17:55:49 -0700539 VkResult res;
540
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700541 res = disp->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburn16edfa62015-11-25 17:55:49 -0700542 return res;
543}
544
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600545// This is the instance chain terminator function for CreateWin32SurfaceKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700546VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
547 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Young5467d672016-06-28 10:52:43 -0600548 VkResult vkRes = VK_SUCCESS;
Mark Youngd7fb1592016-10-12 14:18:44 -0600549 VkIcdSurface *pIcdSurface = NULL;
Mark Young573a7a12016-11-02 09:37:08 -0600550 uint32_t i = 0;
551
Mark Youngf27962c2016-09-16 10:18:42 -0600552 // Initialize pSurface to NULL just to be safe.
553 *pSurface = VK_NULL_HANDLE;
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600554 // First, check to ensure the appropriate extension was enabled:
Ian Elliott1693f592015-11-23 10:17:23 -0700555 struct loader_instance *ptr_instance = loader_get_instance(instance);
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600556 if (!ptr_instance->wsi_win32_surface_enabled) {
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -0700557 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Youngd4e5ba42017-02-28 09:58:04 -0700558 "VK_KHR_win32_surface extension not enabled. vkCreateWin32SurfaceKHR not executed!\n");
Mark Young5467d672016-06-28 10:52:43 -0600559 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
560 goto out;
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600561 }
562
563 // Next, if so, proceed with the implementation of this function:
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700564 pIcdSurface = AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->win_surf.base), sizeof(pIcdSurface->win_surf));
Ian Elliott7c352552015-11-19 13:14:05 -0700565 if (pIcdSurface == NULL) {
Mark Young5467d672016-06-28 10:52:43 -0600566 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
567 goto out;
Ian Elliott7c352552015-11-19 13:14:05 -0700568 }
569
Mark Young5467d672016-06-28 10:52:43 -0600570 pIcdSurface->win_surf.base.platform = VK_ICD_WSI_PLATFORM_WIN32;
571 pIcdSurface->win_surf.hinstance = pCreateInfo->hinstance;
572 pIcdSurface->win_surf.hwnd = pCreateInfo->hwnd;
Ian Elliott7c352552015-11-19 13:14:05 -0700573
Mark Young5467d672016-06-28 10:52:43 -0600574 // Loop through each ICD and determine if they need to create a surface
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700575 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
576 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
Mark Youngd4e5ba42017-02-28 09:58:04 -0700577 if (NULL != icd_term->dispatch.CreateWin32SurfaceKHR) {
578 vkRes = icd_term->dispatch.CreateWin32SurfaceKHR(icd_term->instance, pCreateInfo, pAllocator,
579 &pIcdSurface->real_icd_surfaces[i]);
Mark Young5467d672016-06-28 10:52:43 -0600580 if (VK_SUCCESS != vkRes) {
581 goto out;
582 }
583 }
584 }
585 }
586
587 *pSurface = (VkSurfaceKHR)(pIcdSurface);
588
589out:
590
591 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
592 if (NULL != pIcdSurface->real_icd_surfaces) {
Mark Young573a7a12016-11-02 09:37:08 -0600593 i = 0;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700594 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
Mark Youngd4e5ba42017-02-28 09:58:04 -0700595 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
596 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
Mark Young5467d672016-06-28 10:52:43 -0600597 }
598 }
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700599 loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces);
Mark Young5467d672016-06-28 10:52:43 -0600600 }
601 loader_instance_heap_free(ptr_instance, pIcdSurface);
602 }
603
604 return vkRes;
Ian Elliott7c352552015-11-19 13:14:05 -0700605}
Ian Elliotte851dd62015-11-24 15:39:10 -0700606
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600607// This is the trampoline entrypoint for
608// GetPhysicalDeviceWin32PresentationSupportKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700609LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
610 uint32_t queueFamilyIndex) {
611 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Ian Elliotte851dd62015-11-24 15:39:10 -0700612 const VkLayerInstanceDispatchTable *disp;
Mark Young274e4bc2017-01-19 21:10:49 -0700613 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700614 VkBool32 res = disp->GetPhysicalDeviceWin32PresentationSupportKHR(unwrapped_phys_dev, queueFamilyIndex);
Ian Elliotte851dd62015-11-24 15:39:10 -0700615 return res;
616}
617
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600618// This is the instance chain terminator function for
619// GetPhysicalDeviceWin32PresentationSupportKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700620VKAPI_ATTR VkBool32 VKAPI_CALL terminator_GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
621 uint32_t queueFamilyIndex) {
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600622 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700623 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young26c19372016-11-03 14:27:13 -0600624 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700625 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600626 if (!ptr_instance->wsi_win32_surface_enabled) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700627 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Youngd4e5ba42017-02-28 09:58:04 -0700628 "VK_KHR_win32_surface extension not enabled. vkGetPhysicalDeviceWin32PresentationSupportKHR not executed!\n");
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600629 return VK_SUCCESS;
630 }
631
Mark Youngd4e5ba42017-02-28 09:58:04 -0700632 if (NULL == icd_term->dispatch.GetPhysicalDeviceWin32PresentationSupportKHR) {
633 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
634 "ICD for selected physical device is not exporting vkGetPhysicalDeviceWin32PresentationSupportKHR!\n");
635 assert(false && "loader: null GetPhysicalDeviceWin32PresentationSupportKHR ICD pointer");
636 }
Ian Elliotte851dd62015-11-24 15:39:10 -0700637
Mark Youngd4e5ba42017-02-28 09:58:04 -0700638 return icd_term->dispatch.GetPhysicalDeviceWin32PresentationSupportKHR(phys_dev_term->phys_dev, queueFamilyIndex);
Ian Elliotte851dd62015-11-24 15:39:10 -0700639}
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -0700640#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott7c352552015-11-19 13:14:05 -0700641
Ian Elliott7c352552015-11-19 13:14:05 -0700642#ifdef VK_USE_PLATFORM_WAYLAND_KHR
643
Mark Youngd4e5ba42017-02-28 09:58:04 -0700644// This is the trampoline entrypoint for CreateWaylandSurfaceKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700645LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateWaylandSurfaceKHR(VkInstance instance,
646 const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
647 const VkAllocationCallbacks *pAllocator,
648 VkSurfaceKHR *pSurface) {
Jon Ashburn16edfa62015-11-25 17:55:49 -0700649 const VkLayerInstanceDispatchTable *disp;
Mark Young274e4bc2017-01-19 21:10:49 -0700650 disp = loader_get_instance_layer_dispatch(instance);
Jon Ashburn16edfa62015-11-25 17:55:49 -0700651 VkResult res;
652
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700653 res = disp->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburn16edfa62015-11-25 17:55:49 -0700654 return res;
655}
656
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600657// This is the instance chain terminator function for CreateWaylandSurfaceKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700658VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateWaylandSurfaceKHR(VkInstance instance,
659 const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
660 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Young5467d672016-06-28 10:52:43 -0600661 VkResult vkRes = VK_SUCCESS;
Mark Youngd7fb1592016-10-12 14:18:44 -0600662 VkIcdSurface *pIcdSurface = NULL;
Mark Young573a7a12016-11-02 09:37:08 -0600663 uint32_t i = 0;
664
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600665 // First, check to ensure the appropriate extension was enabled:
Ian Elliott1693f592015-11-23 10:17:23 -0700666 struct loader_instance *ptr_instance = loader_get_instance(instance);
Jon Ashburn436d6a32016-03-24 17:26:59 -0600667 if (!ptr_instance->wsi_wayland_surface_enabled) {
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -0700668 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Youngd4e5ba42017-02-28 09:58:04 -0700669 "VK_KHR_wayland_surface extension not enabled. vkCreateWaylandSurfaceKHR not executed!\n");
Mark Young5467d672016-06-28 10:52:43 -0600670 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
671 goto out;
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600672 }
673
674 // Next, if so, proceed with the implementation of this function:
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700675 pIcdSurface = AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->wayland_surf.base), sizeof(pIcdSurface->wayland_surf));
Ian Elliott7c352552015-11-19 13:14:05 -0700676 if (pIcdSurface == NULL) {
Mark Young5467d672016-06-28 10:52:43 -0600677 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
678 goto out;
Ian Elliott7c352552015-11-19 13:14:05 -0700679 }
680
Mark Young5467d672016-06-28 10:52:43 -0600681 pIcdSurface->wayland_surf.base.platform = VK_ICD_WSI_PLATFORM_WAYLAND;
682 pIcdSurface->wayland_surf.display = pCreateInfo->display;
683 pIcdSurface->wayland_surf.surface = pCreateInfo->surface;
684
Mark Young5467d672016-06-28 10:52:43 -0600685 // Loop through each ICD and determine if they need to create a surface
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700686 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
687 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
Mark Youngd4e5ba42017-02-28 09:58:04 -0700688 if (NULL != icd_term->dispatch.CreateWaylandSurfaceKHR) {
689 vkRes = icd_term->dispatch.CreateWaylandSurfaceKHR(icd_term->instance, pCreateInfo, pAllocator,
690 &pIcdSurface->real_icd_surfaces[i]);
Mark Young5467d672016-06-28 10:52:43 -0600691 if (VK_SUCCESS != vkRes) {
692 goto out;
693 }
694 }
695 }
696 }
Ian Elliott7c352552015-11-19 13:14:05 -0700697
Jon Ashburn1c75aec2016-02-02 17:47:28 -0700698 *pSurface = (VkSurfaceKHR)pIcdSurface;
Ian Elliott7c352552015-11-19 13:14:05 -0700699
Mark Young5467d672016-06-28 10:52:43 -0600700out:
701
702 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
703 if (NULL != pIcdSurface->real_icd_surfaces) {
Mark Young573a7a12016-11-02 09:37:08 -0600704 i = 0;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700705 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
Mark Youngd4e5ba42017-02-28 09:58:04 -0700706 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
707 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
Mark Young5467d672016-06-28 10:52:43 -0600708 }
709 }
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700710 loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces);
Mark Young5467d672016-06-28 10:52:43 -0600711 }
712 loader_instance_heap_free(ptr_instance, pIcdSurface);
713 }
714
715 return vkRes;
Ian Elliott7c352552015-11-19 13:14:05 -0700716}
Ian Elliotte851dd62015-11-24 15:39:10 -0700717
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600718// This is the trampoline entrypoint for
719// GetPhysicalDeviceWaylandPresentationSupportKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700720LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
721 uint32_t queueFamilyIndex,
722 struct wl_display *display) {
723 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Ian Elliotte851dd62015-11-24 15:39:10 -0700724 const VkLayerInstanceDispatchTable *disp;
Mark Young274e4bc2017-01-19 21:10:49 -0700725 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700726 VkBool32 res = disp->GetPhysicalDeviceWaylandPresentationSupportKHR(unwrapped_phys_dev, queueFamilyIndex, display);
Ian Elliotte851dd62015-11-24 15:39:10 -0700727 return res;
728}
729
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600730// This is the instance chain terminator function for
731// GetPhysicalDeviceWaylandPresentationSupportKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700732VKAPI_ATTR VkBool32 VKAPI_CALL terminator_GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
733 uint32_t queueFamilyIndex,
734 struct wl_display *display) {
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600735 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700736 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young26c19372016-11-03 14:27:13 -0600737 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700738 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Jon Ashburn436d6a32016-03-24 17:26:59 -0600739 if (!ptr_instance->wsi_wayland_surface_enabled) {
Mark Youngd4e5ba42017-02-28 09:58:04 -0700740 loader_log(
741 ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
742 "VK_KHR_wayland_surface extension not enabled. vkGetPhysicalDeviceWaylandPresentationSupportKHR not executed!\n");
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600743 return VK_SUCCESS;
744 }
745
Mark Youngd4e5ba42017-02-28 09:58:04 -0700746 if (NULL == icd_term->dispatch.GetPhysicalDeviceWaylandPresentationSupportKHR) {
747 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
748 "ICD for selected physical device is not exporting vkGetPhysicalDeviceWaylandPresentationSupportKHR!\n");
749 assert(false && "loader: null GetPhysicalDeviceWaylandPresentationSupportKHR ICD pointer");
750 }
Ian Elliotte851dd62015-11-24 15:39:10 -0700751
Mark Youngd4e5ba42017-02-28 09:58:04 -0700752 return icd_term->dispatch.GetPhysicalDeviceWaylandPresentationSupportKHR(phys_dev_term->phys_dev, queueFamilyIndex, display);
Ian Elliotte851dd62015-11-24 15:39:10 -0700753}
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -0700754#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott7c352552015-11-19 13:14:05 -0700755
756#ifdef VK_USE_PLATFORM_XCB_KHR
757
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600758// Functions for the VK_KHR_xcb_surface extension:
759
760// This is the trampoline entrypoint for CreateXcbSurfaceKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700761LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateXcbSurfaceKHR(VkInstance instance,
762 const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
763 const VkAllocationCallbacks *pAllocator,
764 VkSurfaceKHR *pSurface) {
Jon Ashburn16edfa62015-11-25 17:55:49 -0700765 const VkLayerInstanceDispatchTable *disp;
Mark Young274e4bc2017-01-19 21:10:49 -0700766 disp = loader_get_instance_layer_dispatch(instance);
Jon Ashburn16edfa62015-11-25 17:55:49 -0700767 VkResult res;
768
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700769 res = disp->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburn16edfa62015-11-25 17:55:49 -0700770 return res;
771}
772
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600773// This is the instance chain terminator function for CreateXcbSurfaceKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700774VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
775 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Young5467d672016-06-28 10:52:43 -0600776 VkResult vkRes = VK_SUCCESS;
Mark Youngd7fb1592016-10-12 14:18:44 -0600777 VkIcdSurface *pIcdSurface = NULL;
Mark Young573a7a12016-11-02 09:37:08 -0600778 uint32_t i = 0;
779
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600780 // First, check to ensure the appropriate extension was enabled:
Ian Elliott1693f592015-11-23 10:17:23 -0700781 struct loader_instance *ptr_instance = loader_get_instance(instance);
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600782 if (!ptr_instance->wsi_xcb_surface_enabled) {
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -0700783 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Youngd4e5ba42017-02-28 09:58:04 -0700784 "VK_KHR_xcb_surface extension not enabled. vkCreateXcbSurfaceKHR not executed!\n");
Mark Young5467d672016-06-28 10:52:43 -0600785 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
786 goto out;
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600787 }
788
789 // Next, if so, proceed with the implementation of this function:
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700790 pIcdSurface = AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->xcb_surf.base), sizeof(pIcdSurface->xcb_surf));
Ian Elliott7c352552015-11-19 13:14:05 -0700791 if (pIcdSurface == NULL) {
Mark Young5467d672016-06-28 10:52:43 -0600792 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
793 goto out;
Ian Elliott7c352552015-11-19 13:14:05 -0700794 }
795
Mark Young5467d672016-06-28 10:52:43 -0600796 pIcdSurface->xcb_surf.base.platform = VK_ICD_WSI_PLATFORM_XCB;
797 pIcdSurface->xcb_surf.connection = pCreateInfo->connection;
798 pIcdSurface->xcb_surf.window = pCreateInfo->window;
799
Mark Young5467d672016-06-28 10:52:43 -0600800 // Loop through each ICD and determine if they need to create a surface
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700801 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
802 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
Mark Youngd4e5ba42017-02-28 09:58:04 -0700803 if (NULL != icd_term->dispatch.CreateXcbSurfaceKHR) {
804 vkRes = icd_term->dispatch.CreateXcbSurfaceKHR(icd_term->instance, pCreateInfo, pAllocator,
805 &pIcdSurface->real_icd_surfaces[i]);
Mark Young5467d672016-06-28 10:52:43 -0600806 if (VK_SUCCESS != vkRes) {
807 goto out;
808 }
809 }
810 }
811 }
Ian Elliott7c352552015-11-19 13:14:05 -0700812
Mark Young3eda5882016-12-01 10:42:21 -0700813 *pSurface = (VkSurfaceKHR)pIcdSurface;
Ian Elliott7c352552015-11-19 13:14:05 -0700814
Mark Young5467d672016-06-28 10:52:43 -0600815out:
816
817 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
818 if (NULL != pIcdSurface->real_icd_surfaces) {
Mark Young573a7a12016-11-02 09:37:08 -0600819 i = 0;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700820 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
Mark Youngd4e5ba42017-02-28 09:58:04 -0700821 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
822 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
Mark Young5467d672016-06-28 10:52:43 -0600823 }
824 }
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700825 loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces);
Mark Young5467d672016-06-28 10:52:43 -0600826 }
827 loader_instance_heap_free(ptr_instance, pIcdSurface);
828 }
829
830 return vkRes;
Ian Elliott7c352552015-11-19 13:14:05 -0700831}
Ian Elliotte851dd62015-11-24 15:39:10 -0700832
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600833// This is the trampoline entrypoint for
834// GetPhysicalDeviceXcbPresentationSupportKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700835LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
836 uint32_t queueFamilyIndex,
837 xcb_connection_t *connection,
838 xcb_visualid_t visual_id) {
839 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Ian Elliotte851dd62015-11-24 15:39:10 -0700840 const VkLayerInstanceDispatchTable *disp;
Mark Young274e4bc2017-01-19 21:10:49 -0700841 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700842 VkBool32 res = disp->GetPhysicalDeviceXcbPresentationSupportKHR(unwrapped_phys_dev, queueFamilyIndex, connection, visual_id);
Ian Elliotte851dd62015-11-24 15:39:10 -0700843 return res;
844}
845
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600846// This is the instance chain terminator function for
847// GetPhysicalDeviceXcbPresentationSupportKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700848VKAPI_ATTR VkBool32 VKAPI_CALL terminator_GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
849 uint32_t queueFamilyIndex,
850 xcb_connection_t *connection,
851 xcb_visualid_t visual_id) {
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600852 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700853 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young26c19372016-11-03 14:27:13 -0600854 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700855 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600856 if (!ptr_instance->wsi_xcb_surface_enabled) {
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -0700857 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Youngd4e5ba42017-02-28 09:58:04 -0700858 "VK_KHR_xcb_surface extension not enabled. vkGetPhysicalDeviceXcbPresentationSupportKHR not executed!\n");
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600859 return VK_SUCCESS;
860 }
861
Mark Youngd4e5ba42017-02-28 09:58:04 -0700862 if (NULL == icd_term->dispatch.GetPhysicalDeviceXcbPresentationSupportKHR) {
863 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
864 "ICD for selected physical device is not exporting vkGetPhysicalDeviceXcbPresentationSupportKHR!\n");
865 assert(false && "loader: null GetPhysicalDeviceXcbPresentationSupportKHR ICD pointer");
866 }
Ian Elliotte851dd62015-11-24 15:39:10 -0700867
Mark Youngd4e5ba42017-02-28 09:58:04 -0700868 return icd_term->dispatch.GetPhysicalDeviceXcbPresentationSupportKHR(phys_dev_term->phys_dev, queueFamilyIndex, connection,
869 visual_id);
Ian Elliotte851dd62015-11-24 15:39:10 -0700870}
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -0700871#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott7c352552015-11-19 13:14:05 -0700872
873#ifdef VK_USE_PLATFORM_XLIB_KHR
874
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600875// Functions for the VK_KHR_xlib_surface extension:
Ian Elliott7c352552015-11-19 13:14:05 -0700876
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600877// This is the trampoline entrypoint for CreateXlibSurfaceKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700878LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateXlibSurfaceKHR(VkInstance instance,
879 const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
880 const VkAllocationCallbacks *pAllocator,
881 VkSurfaceKHR *pSurface) {
Jon Ashburn16edfa62015-11-25 17:55:49 -0700882 const VkLayerInstanceDispatchTable *disp;
Mark Young274e4bc2017-01-19 21:10:49 -0700883 disp = loader_get_instance_layer_dispatch(instance);
Jon Ashburn16edfa62015-11-25 17:55:49 -0700884 VkResult res;
885
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700886 res = disp->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburn16edfa62015-11-25 17:55:49 -0700887 return res;
888}
889
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600890// This is the instance chain terminator function for CreateXlibSurfaceKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700891VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
892 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Young5467d672016-06-28 10:52:43 -0600893 VkResult vkRes = VK_SUCCESS;
Mark Youngd7fb1592016-10-12 14:18:44 -0600894 VkIcdSurface *pIcdSurface = NULL;
Mark Young573a7a12016-11-02 09:37:08 -0600895 uint32_t i = 0;
896
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600897 // First, check to ensure the appropriate extension was enabled:
Ian Elliott1693f592015-11-23 10:17:23 -0700898 struct loader_instance *ptr_instance = loader_get_instance(instance);
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600899 if (!ptr_instance->wsi_xlib_surface_enabled) {
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -0700900 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Youngd4e5ba42017-02-28 09:58:04 -0700901 "VK_KHR_xlib_surface extension not enabled. vkCreateXlibSurfaceKHR not executed!\n");
Mark Young5467d672016-06-28 10:52:43 -0600902 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
903 goto out;
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600904 }
905
906 // Next, if so, proceed with the implementation of this function:
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700907 pIcdSurface = AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->xlib_surf.base), sizeof(pIcdSurface->xlib_surf));
Ian Elliott7c352552015-11-19 13:14:05 -0700908 if (pIcdSurface == NULL) {
Mark Young5467d672016-06-28 10:52:43 -0600909 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
910 goto out;
Ian Elliott7c352552015-11-19 13:14:05 -0700911 }
912
Mark Young5467d672016-06-28 10:52:43 -0600913 pIcdSurface->xlib_surf.base.platform = VK_ICD_WSI_PLATFORM_XLIB;
914 pIcdSurface->xlib_surf.dpy = pCreateInfo->dpy;
915 pIcdSurface->xlib_surf.window = pCreateInfo->window;
916
Mark Young5467d672016-06-28 10:52:43 -0600917 // Loop through each ICD and determine if they need to create a surface
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700918 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
919 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
Mark Youngd4e5ba42017-02-28 09:58:04 -0700920 if (NULL != icd_term->dispatch.CreateXlibSurfaceKHR) {
921 vkRes = icd_term->dispatch.CreateXlibSurfaceKHR(icd_term->instance, pCreateInfo, pAllocator,
922 &pIcdSurface->real_icd_surfaces[i]);
Mark Young5467d672016-06-28 10:52:43 -0600923 if (VK_SUCCESS != vkRes) {
924 goto out;
925 }
926 }
927 }
928 }
Ian Elliott7c352552015-11-19 13:14:05 -0700929
Mark Young3eda5882016-12-01 10:42:21 -0700930 *pSurface = (VkSurfaceKHR)pIcdSurface;
Ian Elliott7c352552015-11-19 13:14:05 -0700931
Mark Young5467d672016-06-28 10:52:43 -0600932out:
933
934 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
935 if (NULL != pIcdSurface->real_icd_surfaces) {
Mark Young573a7a12016-11-02 09:37:08 -0600936 i = 0;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700937 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
Mark Youngd4e5ba42017-02-28 09:58:04 -0700938 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
939 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
Mark Young5467d672016-06-28 10:52:43 -0600940 }
941 }
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700942 loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces);
Mark Young5467d672016-06-28 10:52:43 -0600943 }
944 loader_instance_heap_free(ptr_instance, pIcdSurface);
945 }
946
947 return vkRes;
Ian Elliott7c352552015-11-19 13:14:05 -0700948}
Ian Elliotte851dd62015-11-24 15:39:10 -0700949
Mark Young573a7a12016-11-02 09:37:08 -0600950// This is the trampoline entrypoint for
951// GetPhysicalDeviceXlibPresentationSupportKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700952LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
953 uint32_t queueFamilyIndex, Display *dpy,
954 VisualID visualID) {
955 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Ian Elliotte851dd62015-11-24 15:39:10 -0700956 const VkLayerInstanceDispatchTable *disp;
Mark Young274e4bc2017-01-19 21:10:49 -0700957 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700958 VkBool32 res = disp->GetPhysicalDeviceXlibPresentationSupportKHR(unwrapped_phys_dev, queueFamilyIndex, dpy, visualID);
Ian Elliotte851dd62015-11-24 15:39:10 -0700959 return res;
960}
961
Mark Lobodzinskib16da052016-08-31 09:31:29 -0600962// This is the instance chain terminator function for
963// GetPhysicalDeviceXlibPresentationSupportKHR
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700964VKAPI_ATTR VkBool32 VKAPI_CALL terminator_GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
965 uint32_t queueFamilyIndex, Display *dpy,
966 VisualID visualID) {
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600967 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700968 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young26c19372016-11-03 14:27:13 -0600969 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski91c10752017-01-26 12:16:30 -0700970 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600971 if (!ptr_instance->wsi_xlib_surface_enabled) {
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -0700972 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Youngd4e5ba42017-02-28 09:58:04 -0700973 "VK_KHR_xlib_surface extension not enabled. vkGetPhysicalDeviceXlibPresentationSupportKHR not executed!\n");
Ian Elliott0d4ffa32016-03-24 13:59:22 -0600974 return VK_SUCCESS;
975 }
976
Mark Youngd4e5ba42017-02-28 09:58:04 -0700977 if (NULL == icd_term->dispatch.GetPhysicalDeviceXlibPresentationSupportKHR) {
978 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
979 "ICD for selected physical device is not exporting vkGetPhysicalDeviceXlibPresentationSupportKHR!\n");
980 assert(false && "loader: null GetPhysicalDeviceXlibPresentationSupportKHR ICD pointer");
981 }
Ian Elliotte851dd62015-11-24 15:39:10 -0700982
Mark Youngd4e5ba42017-02-28 09:58:04 -0700983 return icd_term->dispatch.GetPhysicalDeviceXlibPresentationSupportKHR(phys_dev_term->phys_dev, queueFamilyIndex, dpy, visualID);
Ian Elliotte851dd62015-11-24 15:39:10 -0700984}
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -0700985#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott7c352552015-11-19 13:14:05 -0700986
Nicolas Caramellifa696ca2020-07-04 22:53:59 +0200987#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
988
989// Functions for the VK_EXT_directfb_surface extension:
990
991// This is the trampoline entrypoint for CreateDirectFBSurfaceEXT
992LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDirectFBSurfaceEXT(VkInstance instance,
993 const VkDirectFBSurfaceCreateInfoEXT *pCreateInfo,
994 const VkAllocationCallbacks *pAllocator,
995 VkSurfaceKHR *pSurface) {
996 const VkLayerInstanceDispatchTable *disp;
997 disp = loader_get_instance_layer_dispatch(instance);
998 VkResult res;
999
1000 res = disp->CreateDirectFBSurfaceEXT(instance, pCreateInfo, pAllocator, pSurface);
1001 return res;
1002}
1003
1004// This is the instance chain terminator function for CreateDirectFBSurfaceEXT
1005VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateDirectFBSurfaceEXT(VkInstance instance,
1006 const VkDirectFBSurfaceCreateInfoEXT *pCreateInfo,
1007 const VkAllocationCallbacks *pAllocator,
1008 VkSurfaceKHR *pSurface) {
1009 VkResult vkRes = VK_SUCCESS;
1010 VkIcdSurface *pIcdSurface = NULL;
1011 uint32_t i = 0;
1012
1013 // First, check to ensure the appropriate extension was enabled:
1014 struct loader_instance *ptr_instance = loader_get_instance(instance);
1015 if (!ptr_instance->wsi_directfb_surface_enabled) {
1016 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1017 "VK_EXT_directfb_surface extension not enabled. vkCreateDirectFBSurfaceEXT not executed!\n");
1018 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
1019 goto out;
1020 }
1021
1022 // Next, if so, proceed with the implementation of this function:
1023 pIcdSurface =
1024 AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->directfb_surf.base), sizeof(pIcdSurface->directfb_surf));
1025 if (pIcdSurface == NULL) {
1026 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
1027 goto out;
1028 }
1029
1030 pIcdSurface->directfb_surf.base.platform = VK_ICD_WSI_PLATFORM_DIRECTFB;
1031 pIcdSurface->directfb_surf.dfb = pCreateInfo->dfb;
1032 pIcdSurface->directfb_surf.surface = pCreateInfo->surface;
1033
1034 // Loop through each ICD and determine if they need to create a surface
1035 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
1036 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
1037 if (NULL != icd_term->dispatch.CreateDirectFBSurfaceEXT) {
1038 vkRes = icd_term->dispatch.CreateDirectFBSurfaceEXT(icd_term->instance, pCreateInfo, pAllocator,
1039 &pIcdSurface->real_icd_surfaces[i]);
1040 if (VK_SUCCESS != vkRes) {
1041 goto out;
1042 }
1043 }
1044 }
1045 }
1046
1047 *pSurface = (VkSurfaceKHR)pIcdSurface;
1048
1049out:
1050
1051 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
1052 if (NULL != pIcdSurface->real_icd_surfaces) {
1053 i = 0;
1054 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
1055 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
1056 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
1057 }
1058 }
1059 loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces);
1060 }
1061 loader_instance_heap_free(ptr_instance, pIcdSurface);
1062 }
1063
1064 return vkRes;
1065}
1066
1067// This is the trampoline entrypoint for
1068// GetPhysicalDeviceDirectFBPresentationSupportEXT
1069LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceDirectFBPresentationSupportEXT(VkPhysicalDevice physicalDevice,
1070 uint32_t queueFamilyIndex,
1071 IDirectFB *dfb) {
1072 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
1073 const VkLayerInstanceDispatchTable *disp;
1074 disp = loader_get_instance_layer_dispatch(physicalDevice);
1075 VkBool32 res = disp->GetPhysicalDeviceDirectFBPresentationSupportEXT(unwrapped_phys_dev, queueFamilyIndex, dfb);
1076 return res;
1077}
1078
1079// This is the instance chain terminator function for
1080// GetPhysicalDeviceDirectFBPresentationSupportEXT
1081VKAPI_ATTR VkBool32 VKAPI_CALL terminator_GetPhysicalDeviceDirectFBPresentationSupportEXT(VkPhysicalDevice physicalDevice,
1082 uint32_t queueFamilyIndex,
1083 IDirectFB *dfb) {
1084 // First, check to ensure the appropriate extension was enabled:
1085 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
1086 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
1087 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
1088 if (!ptr_instance->wsi_directfb_surface_enabled) {
1089 loader_log(
1090 ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1091 "VK_EXT_directfb_surface extension not enabled. vkGetPhysicalDeviceWaylandPresentationSupportKHR not executed!\n");
1092 return VK_SUCCESS;
1093 }
1094
1095 if (NULL == icd_term->dispatch.GetPhysicalDeviceDirectFBPresentationSupportEXT) {
1096 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1097 "ICD for selected physical device is not exporting vkGetPhysicalDeviceDirectFBPresentationSupportEXT!\n");
1098 assert(false && "loader: null GetPhysicalDeviceDirectFBPresentationSupportEXT ICD pointer");
1099 }
1100
1101 return icd_term->dispatch.GetPhysicalDeviceDirectFBPresentationSupportEXT(phys_dev_term->phys_dev, queueFamilyIndex, dfb);
1102}
1103#endif // VK_USE_PLATFORM_DIRECTFB_EXT
1104
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -07001105#ifdef VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott7c352552015-11-19 13:14:05 -07001106
Mark Lobodzinskib16da052016-08-31 09:31:29 -06001107// Functions for the VK_KHR_android_surface extension:
1108
1109// This is the trampoline entrypoint for CreateAndroidSurfaceKHR
Kévin Petit41901f92021-01-28 20:15:51 +00001110LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001111 const VkAllocationCallbacks *pAllocator,
1112 VkSurfaceKHR *pSurface) {
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -07001113 const VkLayerInstanceDispatchTable *disp;
Mark Young274e4bc2017-01-19 21:10:49 -07001114 disp = loader_get_instance_layer_dispatch(instance);
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -07001115 VkResult res;
1116
Kévin Petit41901f92021-01-28 20:15:51 +00001117 res = disp->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -07001118 return res;
1119}
1120
Mark Lobodzinskib16da052016-08-31 09:31:29 -06001121// This is the instance chain terminator function for CreateAndroidSurfaceKHR
Kévin Petit41901f92021-01-28 20:15:51 +00001122VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001123 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001124 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -07001125 struct loader_instance *ptr_instance = loader_get_instance(instance);
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001126 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -07001127 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Youngd4e5ba42017-02-28 09:58:04 -07001128 "VK_KHR_display extension not enabled. vkCreateAndroidSurfaceKHR not executed!\n");
Jeremy Hayes0231e1c2016-06-14 11:50:02 -06001129 return VK_ERROR_EXTENSION_NOT_PRESENT;
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001130 }
1131
1132 // Next, if so, proceed with the implementation of this function:
Mark Young5467d672016-06-28 10:52:43 -06001133 VkIcdSurfaceAndroid *pIcdSurface =
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001134 loader_instance_heap_alloc(ptr_instance, sizeof(VkIcdSurfaceAndroid), VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -07001135 if (pIcdSurface == NULL) {
1136 return VK_ERROR_OUT_OF_HOST_MEMORY;
1137 }
1138
1139 pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_ANDROID;
Kévin Petit41901f92021-01-28 20:15:51 +00001140 pIcdSurface->window = pCreateInfo->window;
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -07001141
Jon Ashburn1c75aec2016-02-02 17:47:28 -07001142 *pSurface = (VkSurfaceKHR)pIcdSurface;
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -07001143
1144 return VK_SUCCESS;
1145}
1146
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -07001147#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott7c352552015-11-19 13:14:05 -07001148
Bryan Law-Smith57305692019-04-01 09:45:55 +01001149// Functions for the VK_EXT_headless_surface extension:
1150
1151VKAPI_ATTR VkResult VKAPI_CALL vkCreateHeadlessSurfaceEXT(VkInstance instance, const VkHeadlessSurfaceCreateInfoEXT *pCreateInfo,
1152 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
1153 const VkLayerInstanceDispatchTable *disp;
1154 disp = loader_get_instance_layer_dispatch(instance);
1155 VkResult res;
1156
1157 res = disp->CreateHeadlessSurfaceEXT(instance, pCreateInfo, pAllocator, pSurface);
1158 return res;
1159}
1160
1161VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateHeadlessSurfaceEXT(VkInstance instance,
1162 const VkHeadlessSurfaceCreateInfoEXT *pCreateInfo,
1163 const VkAllocationCallbacks *pAllocator,
1164 VkSurfaceKHR *pSurface) {
1165 struct loader_instance *inst = loader_get_instance(instance);
1166 VkIcdSurface *pIcdSurface = NULL;
1167 VkResult vkRes = VK_SUCCESS;
1168 uint32_t i = 0;
1169
1170 if (!inst->wsi_headless_surface_enabled) {
1171 loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1172 "VK_EXT_headless_surface extension not enabled. "
1173 "vkCreateHeadlessSurfaceEXT not executed!\n");
1174 return VK_SUCCESS;
1175 }
1176
1177 // Next, if so, proceed with the implementation of this function:
1178 pIcdSurface = AllocateIcdSurfaceStruct(inst, sizeof(pIcdSurface->headless_surf.base), sizeof(pIcdSurface->headless_surf));
1179 if (pIcdSurface == NULL) {
1180 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
1181 goto out;
1182 }
1183
1184 pIcdSurface->headless_surf.base.platform = VK_ICD_WSI_PLATFORM_HEADLESS;
1185 // Loop through each ICD and determine if they need to create a surface
1186 for (struct loader_icd_term *icd_term = inst->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
1187 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
1188 if (NULL != icd_term->dispatch.CreateHeadlessSurfaceEXT) {
1189 vkRes = icd_term->dispatch.CreateHeadlessSurfaceEXT(icd_term->instance, pCreateInfo, pAllocator,
1190 &pIcdSurface->real_icd_surfaces[i]);
1191 if (VK_SUCCESS != vkRes) {
1192 goto out;
1193 }
1194 }
1195 }
1196 }
1197
1198 *pSurface = (VkSurfaceKHR)pIcdSurface;
1199
1200out:
1201
1202 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
1203 if (NULL != pIcdSurface->real_icd_surfaces) {
1204 i = 0;
1205 for (struct loader_icd_term *icd_term = inst->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
1206 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
1207 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
1208 }
1209 }
1210 loader_instance_heap_free(inst, pIcdSurface->real_icd_surfaces);
1211 }
1212 loader_instance_heap_free(inst, pIcdSurface);
1213 }
1214
1215 return vkRes;
1216}
1217
Karl Schultzd81ebfb2017-12-12 10:33:01 -05001218#ifdef VK_USE_PLATFORM_MACOS_MVK
1219
1220// Functions for the VK_MVK_macos_surface extension:
1221
1222// This is the trampoline entrypoint for CreateMacOSSurfaceMVK
1223LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateMacOSSurfaceMVK(VkInstance instance,
1224 const VkMacOSSurfaceCreateInfoMVK *pCreateInfo,
1225 const VkAllocationCallbacks *pAllocator,
1226 VkSurfaceKHR *pSurface) {
1227 const VkLayerInstanceDispatchTable *disp;
1228 disp = loader_get_instance_layer_dispatch(instance);
1229 VkResult res;
1230
1231 res = disp->CreateMacOSSurfaceMVK(instance, pCreateInfo, pAllocator, pSurface);
1232 return res;
1233}
1234
1235// This is the instance chain terminator function for CreateMacOSSurfaceKHR
1236VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateMacOSSurfaceMVK(VkInstance instance, const VkMacOSSurfaceCreateInfoMVK *pCreateInfo,
1237 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
1238 VkResult vkRes = VK_SUCCESS;
1239 VkIcdSurface *pIcdSurface = NULL;
1240 uint32_t i = 0;
1241
1242 // First, check to ensure the appropriate extension was enabled:
1243 struct loader_instance *ptr_instance = loader_get_instance(instance);
1244 if (!ptr_instance->wsi_macos_surface_enabled) {
1245 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1246 "VK_MVK_macos_surface extension not enabled. vkCreateMacOSSurfaceMVK not executed!\n");
1247 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
1248 goto out;
1249 }
1250
1251 // Next, if so, proceed with the implementation of this function:
1252 pIcdSurface = AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->macos_surf.base), sizeof(pIcdSurface->macos_surf));
1253 if (pIcdSurface == NULL) {
1254 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
1255 goto out;
1256 }
1257
1258 pIcdSurface->macos_surf.base.platform = VK_ICD_WSI_PLATFORM_MACOS;
1259 pIcdSurface->macos_surf.pView = pCreateInfo->pView;
1260
1261 // Loop through each ICD and determine if they need to create a surface
1262 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
1263 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
1264 if (NULL != icd_term->dispatch.CreateMacOSSurfaceMVK) {
1265 vkRes = icd_term->dispatch.CreateMacOSSurfaceMVK(icd_term->instance, pCreateInfo, pAllocator,
1266 &pIcdSurface->real_icd_surfaces[i]);
1267 if (VK_SUCCESS != vkRes) {
1268 goto out;
1269 }
1270 }
1271 }
1272 }
1273
1274 *pSurface = (VkSurfaceKHR)pIcdSurface;
1275
1276out:
1277
1278 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
1279 if (NULL != pIcdSurface->real_icd_surfaces) {
1280 i = 0;
1281 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
1282 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
1283 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
1284 }
1285 }
1286 loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces);
1287 }
1288 loader_instance_heap_free(ptr_instance, pIcdSurface);
1289 }
1290
1291 return vkRes;
1292}
1293
1294#endif // VK_USE_PLATFORM_MACOS_MVK
1295
1296#ifdef VK_USE_PLATFORM_IOS_MVK
1297
1298// Functions for the VK_MVK_ios_surface extension:
1299
1300// This is the trampoline entrypoint for CreateIOSSurfaceMVK
1301LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateIOSSurfaceMVK(VkInstance instance,
1302 const VkIOSSurfaceCreateInfoMVK *pCreateInfo,
1303 const VkAllocationCallbacks *pAllocator,
1304 VkSurfaceKHR *pSurface) {
1305 const VkLayerInstanceDispatchTable *disp;
1306 disp = loader_get_instance_layer_dispatch(instance);
1307 VkResult res;
1308
1309 res = disp->CreateIOSSurfaceMVK(instance, pCreateInfo, pAllocator, pSurface);
1310 return res;
1311}
1312
1313// This is the instance chain terminator function for CreateIOSSurfaceKHR
1314VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateIOSSurfaceMVK(VkInstance instance, const VkIOSSurfaceCreateInfoMVK *pCreateInfo,
1315 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
1316 // First, check to ensure the appropriate extension was enabled:
1317 struct loader_instance *ptr_instance = loader_get_instance(instance);
1318 if (!ptr_instance->wsi_ios_surface_enabled) {
1319 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1320 "VK_MVK_ios_surface extension not enabled. vkCreateIOSSurfaceMVK not executed!\n");
1321 return VK_ERROR_EXTENSION_NOT_PRESENT;
1322 }
1323
1324 // Next, if so, proceed with the implementation of this function:
1325 VkIcdSurfaceIOS *pIcdSurface =
1326 loader_instance_heap_alloc(ptr_instance, sizeof(VkIcdSurfaceIOS), VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
1327 if (pIcdSurface == NULL) {
1328 return VK_ERROR_OUT_OF_HOST_MEMORY;
1329 }
1330
1331 pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_IOS;
1332 pIcdSurface->pView = pCreateInfo->pView;
1333
1334 *pSurface = (VkSurfaceKHR)pIcdSurface;
1335
1336 return VK_SUCCESS;
1337}
1338
1339#endif // VK_USE_PLATFORM_IOS_MVK
1340
J.D. Rouand7928a12020-11-16 15:36:42 -08001341#ifdef VK_USE_PLATFORM_GGP
1342
1343// Functions for the VK_GGP_stream_descriptor_surface extension:
1344
1345// This is the trampoline entrypoint for CreateStreamDescriptorSurfaceGGP
1346LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1347vkCreateStreamDescriptorSurfaceGGP(VkInstance instance, const VkStreamDescriptorSurfaceCreateInfoGGP *pCreateInfo,
1348 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
1349 const VkLayerInstanceDispatchTable *disp;
1350 disp = loader_get_instance_layer_dispatch(instance);
1351 VkResult res;
1352
1353 res = disp->CreateStreamDescriptorSurfaceGGP(instance, pCreateInfo, pAllocator, pSurface);
1354 return res;
1355}
1356
1357// This is the instance chain terminator function for CreateStreamDescriptorSurfaceGGP
1358VKAPI_ATTR VkResult VKAPI_CALL
1359terminator_CreateStreamDescriptorSurfaceGGP(VkInstance instance, const VkStreamDescriptorSurfaceCreateInfoGGP *pCreateInfo,
1360 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
1361 VkResult vkRes = VK_SUCCESS;
1362 VkIcdSurface *pIcdSurface = NULL;
1363 uint32_t i = 0;
1364
1365 // First, check to ensure the appropriate extension was enabled:
1366 struct loader_instance *ptr_instance = loader_get_instance(instance);
1367 if (!ptr_instance->wsi_ggp_surface_enabled) {
1368 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1369 "VK_GGP_stream_descriptor_surface extension not enabled. vkCreateStreamDescriptorSurfaceGGP not executed!\n");
1370 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
1371 goto out;
1372 }
1373
1374 // Next, if so, proceed with the implementation of this function:
1375 pIcdSurface = AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->ggp_surf.base), sizeof(pIcdSurface->ggp_surf));
1376 if (pIcdSurface == NULL) {
1377 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
1378 goto out;
1379 }
1380
1381 pIcdSurface->ggp_surf.base.platform = VK_ICD_WSI_PLATFORM_GGP;
1382 pIcdSurface->ggp_surf.streamDescriptor = pCreateInfo->streamDescriptor;
1383
1384 // Loop through each ICD and determine if they need to create a surface
1385 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
1386 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
1387 if (NULL != icd_term->dispatch.CreateStreamDescriptorSurfaceGGP) {
1388 vkRes = icd_term->dispatch.CreateStreamDescriptorSurfaceGGP(icd_term->instance, pCreateInfo, pAllocator,
1389 &pIcdSurface->real_icd_surfaces[i]);
1390 if (VK_SUCCESS != vkRes) {
1391 goto out;
1392 }
1393 }
1394 }
1395 }
1396
1397 *pSurface = (VkSurfaceKHR)pIcdSurface;
1398
1399out:
1400
1401 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
1402 if (NULL != pIcdSurface->real_icd_surfaces) {
1403 i = 0;
1404 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
1405 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
1406 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
1407 }
1408 }
1409 loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces);
1410 }
1411 loader_instance_heap_free(ptr_instance, pIcdSurface);
1412 }
1413 return vkRes;
1414}
1415
1416#endif // VK_USE_PLATFORM_GGP
1417
Lenny Komowa1b5e442019-09-16 16:14:36 -06001418#if defined(VK_USE_PLATFORM_METAL_EXT)
1419
1420LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateMetalSurfaceEXT(VkInstance instance,
1421 const VkMetalSurfaceCreateInfoEXT *pCreateInfo,
1422 const VkAllocationCallbacks *pAllocator,
1423 VkSurfaceKHR *pSurface) {
1424 const VkLayerInstanceDispatchTable *disp = loader_get_instance_layer_dispatch(instance);
1425 return disp->CreateMetalSurfaceEXT(instance, pCreateInfo, pAllocator, pSurface);
1426}
1427
1428VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateMetalSurfaceEXT(VkInstance instance, const VkMetalSurfaceCreateInfoEXT *pCreateInfo,
1429 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
1430 VkResult result = VK_SUCCESS;
1431 VkIcdSurface *icd_surface = NULL;
1432 uint32_t i;
1433
1434 // First, check to ensure the appropriate extension was enabled:
1435 struct loader_instance *ptr_instance = loader_get_instance(instance);
1436 if (!ptr_instance->wsi_metal_surface_enabled) {
1437 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1438 "VK_EXT_metal_surface extension not enabled. vkCreateMetalSurfaceEXT will not be executed.\n");
1439 }
1440
1441 // Next, if so, proceed with the implementation of this function:
1442 icd_surface = AllocateIcdSurfaceStruct(ptr_instance, sizeof(icd_surface->metal_surf.base), sizeof(icd_surface->metal_surf));
1443 if (icd_surface == NULL) {
1444 result = VK_ERROR_OUT_OF_HOST_MEMORY;
1445 goto out;
1446 }
1447
1448 icd_surface->metal_surf.base.platform = VK_ICD_WSI_PLATFORM_METAL;
1449 icd_surface->metal_surf.pLayer = pCreateInfo->pLayer;
1450
1451 // Loop through each ICD and determine if they need to create a surface
1452 i = 0;
1453 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, ++i) {
1454 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
1455 if (icd_term->dispatch.CreateMetalSurfaceEXT != NULL) {
1456 result = icd_term->dispatch.CreateMetalSurfaceEXT(icd_term->instance, pCreateInfo, pAllocator,
1457 &icd_surface->real_icd_surfaces[i]);
1458 if (result != VK_SUCCESS) {
1459 goto out;
1460 }
1461 }
1462 }
1463 }
1464 *pSurface = (VkSurfaceKHR)icd_surface;
1465
1466out:
1467 if (result != VK_SUCCESS && icd_surface != NULL) {
1468 if (icd_surface->real_icd_surfaces != NULL) {
1469 i = 0;
1470 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, ++i) {
1471 if (icd_surface->real_icd_surfaces[i] == VK_NULL_HANDLE && icd_term->dispatch.DestroySurfaceKHR != NULL) {
1472 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, icd_surface->real_icd_surfaces[i], pAllocator);
1473 }
1474 }
1475 loader_instance_heap_free(ptr_instance, icd_surface->real_icd_surfaces);
1476 }
1477 loader_instance_heap_free(ptr_instance, icd_surface);
1478 }
1479 return result;
1480}
1481
1482#endif
1483
Mike Gorchak684c2a62021-03-10 22:17:20 -05001484#ifdef VK_USE_PLATFORM_SCREEN_QNX
1485
1486// This is the trampoline entrypoint for CreateScrenSurfaceQNX
1487LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateScreenSurfaceQNX(VkInstance instance,
1488 const VkScreenSurfaceCreateInfoQNX *pCreateInfo,
1489 const VkAllocationCallbacks *pAllocator,
1490 VkSurfaceKHR *pSurface) {
1491 const VkLayerInstanceDispatchTable *disp;
1492 disp = loader_get_instance_layer_dispatch(instance);
1493 VkResult res;
1494
1495 res = disp->CreateScreenSurfaceQNX(instance, pCreateInfo, pAllocator, pSurface);
1496 return res;
1497}
1498
1499// This is the instance chain terminator function for CreateScreenSurfaceQNX
1500VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateScreenSurfaceQNX(VkInstance instance,
1501 const VkScreenSurfaceCreateInfoQNX *pCreateInfo,
1502 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
1503 VkResult vkRes = VK_SUCCESS;
1504 VkIcdSurface *pIcdSurface = NULL;
1505 uint32_t i = 0;
1506
1507 // First, check to ensure the appropriate extension was enabled:
1508 struct loader_instance *ptr_instance = loader_get_instance(instance);
1509 if (!ptr_instance->wsi_screen_surface_enabled) {
1510 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1511 "VK_QNX_screen_surface extension not enabled. vkCreateScreenSurfaceQNX not executed!\n");
1512 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
1513 goto out;
1514 }
1515
1516 // Next, if so, proceed with the implementation of this function:
1517 pIcdSurface = AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->screen_surf.base), sizeof(pIcdSurface->screen_surf));
1518 if (pIcdSurface == NULL) {
1519 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
1520 goto out;
1521 }
1522
1523 pIcdSurface->screen_surf.base.platform = VK_ICD_WSI_PLATFORM_SCREEN;
1524 pIcdSurface->screen_surf.context = pCreateInfo->context;
1525 pIcdSurface->screen_surf.window = pCreateInfo->window;
1526
1527 // Loop through each ICD and determine if they need to create a surface
1528 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
1529 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
1530 if (NULL != icd_term->dispatch.CreateScreenSurfaceQNX) {
1531 vkRes = icd_term->dispatch.CreateScreenSurfaceQNX(icd_term->instance, pCreateInfo, pAllocator,
1532 &pIcdSurface->real_icd_surfaces[i]);
1533 if (VK_SUCCESS != vkRes) {
1534 goto out;
1535 }
1536 }
1537 }
1538 }
1539
1540 *pSurface = (VkSurfaceKHR)pIcdSurface;
1541
1542out:
1543
1544 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
1545 if (NULL != pIcdSurface->real_icd_surfaces) {
1546 i = 0;
1547 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
1548 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
1549 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
1550 }
1551 }
1552 loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces);
1553 }
1554 loader_instance_heap_free(ptr_instance, pIcdSurface);
1555 }
1556
1557 return vkRes;
1558}
1559
1560// This is the trampoline entrypoint for
1561// GetPhysicalDeviceScreenPresentationSupportQNX
1562LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceScreenPresentationSupportQNX(VkPhysicalDevice physicalDevice,
1563 uint32_t queueFamilyIndex,
1564 struct _screen_window *window) {
1565 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
1566 const VkLayerInstanceDispatchTable *disp;
1567 disp = loader_get_instance_layer_dispatch(physicalDevice);
1568 VkBool32 res = disp->GetPhysicalDeviceScreenPresentationSupportQNX(unwrapped_phys_dev, queueFamilyIndex, window);
1569 return res;
1570}
1571
1572// This is the instance chain terminator function for
1573// GetPhysicalDeviceScreenPresentationSupportQNX
1574VKAPI_ATTR VkBool32 VKAPI_CALL terminator_GetPhysicalDeviceScreenPresentationSupportQNX(VkPhysicalDevice physicalDevice,
1575 uint32_t queueFamilyIndex,
1576 struct _screen_window *window) {
1577 // First, check to ensure the appropriate extension was enabled:
1578 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
1579 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
1580 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
1581 if (!ptr_instance->wsi_screen_surface_enabled) {
1582 loader_log(
1583 ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1584 "VK_QNX_screen_surface extension not enabled. vkGetPhysicalDeviceScreenPresentationSupportQNX not executed!\n");
1585 return VK_SUCCESS;
1586 }
1587
1588 if (NULL == icd_term->dispatch.GetPhysicalDeviceScreenPresentationSupportQNX) {
1589 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1590 "ICD for selected physical device is not exporting vkGetPhysicalDeviceScreenPresentationSupportQNX!\n");
1591 assert(false && "loader: null GetPhysicalDeviceScreenPresentationSupportQNX ICD pointer");
1592 }
1593
1594 return icd_term->dispatch.GetPhysicalDeviceScreenPresentationSupportQNX(phys_dev_term->phys_dev, queueFamilyIndex, window);
1595}
1596#endif // VK_USE_PLATFORM_SCREEN_QNX
1597
Mark Lobodzinskib16da052016-08-31 09:31:29 -06001598// Functions for the VK_KHR_display instance extension:
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001599LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice,
1600 uint32_t *pPropertyCount,
1601 VkDisplayPropertiesKHR *pProperties) {
1602 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Jon Ashburncc370d02016-03-08 09:30:30 -07001603 const VkLayerInstanceDispatchTable *disp;
Mark Young274e4bc2017-01-19 21:10:49 -07001604 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001605 VkResult res = disp->GetPhysicalDeviceDisplayPropertiesKHR(unwrapped_phys_dev, pPropertyCount, pProperties);
Jon Ashburncc370d02016-03-08 09:30:30 -07001606 return res;
1607}
1608
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001609VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice,
1610 uint32_t *pPropertyCount,
1611 VkDisplayPropertiesKHR *pProperties) {
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001612 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001613 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young26c19372016-11-03 14:27:13 -06001614 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001615 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001616 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -07001617 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Youngd4e5ba42017-02-28 09:58:04 -07001618 "VK_KHR_display extension not enabled. vkGetPhysicalDeviceDisplayPropertiesKHR not executed!\n");
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001619 return VK_SUCCESS;
1620 }
1621
Mark Youngd4e5ba42017-02-28 09:58:04 -07001622 if (NULL == icd_term->dispatch.GetPhysicalDeviceDisplayPropertiesKHR) {
Lenny Komowbb8231f2021-04-27 15:25:09 -06001623 *pPropertyCount = 0;
1624 return VK_SUCCESS;
Mark Youngd4e5ba42017-02-28 09:58:04 -07001625 }
Jon Ashburncc370d02016-03-08 09:30:30 -07001626
Mark Youngd4e5ba42017-02-28 09:58:04 -07001627 return icd_term->dispatch.GetPhysicalDeviceDisplayPropertiesKHR(phys_dev_term->phys_dev, pPropertyCount, pProperties);
Jon Ashburncc370d02016-03-08 09:30:30 -07001628}
1629
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001630LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
1631 VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkDisplayPlanePropertiesKHR *pProperties) {
1632 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Jon Ashburncc370d02016-03-08 09:30:30 -07001633 const VkLayerInstanceDispatchTable *disp;
Mark Young274e4bc2017-01-19 21:10:49 -07001634 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001635 VkResult res = disp->GetPhysicalDeviceDisplayPlanePropertiesKHR(unwrapped_phys_dev, pPropertyCount, pProperties);
Jon Ashburncc370d02016-03-08 09:30:30 -07001636 return res;
1637}
1638
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001639VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice,
1640 uint32_t *pPropertyCount,
1641 VkDisplayPlanePropertiesKHR *pProperties) {
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001642 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001643 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young26c19372016-11-03 14:27:13 -06001644 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001645 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001646 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -07001647 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Youngd4e5ba42017-02-28 09:58:04 -07001648 "VK_KHR_display extension not enabled. vkGetPhysicalDeviceDisplayPlanePropertiesKHR not executed!\n");
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001649 return VK_SUCCESS;
1650 }
1651
Mark Youngd4e5ba42017-02-28 09:58:04 -07001652 if (NULL == icd_term->dispatch.GetPhysicalDeviceDisplayPlanePropertiesKHR) {
Lenny Komowbb8231f2021-04-27 15:25:09 -06001653 *pPropertyCount = 0;
1654 return VK_SUCCESS;
Mark Youngd4e5ba42017-02-28 09:58:04 -07001655 }
Jon Ashburncc370d02016-03-08 09:30:30 -07001656
Mark Youngd4e5ba42017-02-28 09:58:04 -07001657 return icd_term->dispatch.GetPhysicalDeviceDisplayPlanePropertiesKHR(phys_dev_term->phys_dev, pPropertyCount, pProperties);
Jon Ashburncc370d02016-03-08 09:30:30 -07001658}
1659
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001660LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice,
1661 uint32_t planeIndex, uint32_t *pDisplayCount,
1662 VkDisplayKHR *pDisplays) {
1663 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Jon Ashburncc370d02016-03-08 09:30:30 -07001664 const VkLayerInstanceDispatchTable *disp;
Mark Young274e4bc2017-01-19 21:10:49 -07001665 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001666 VkResult res = disp->GetDisplayPlaneSupportedDisplaysKHR(unwrapped_phys_dev, planeIndex, pDisplayCount, pDisplays);
Jon Ashburncc370d02016-03-08 09:30:30 -07001667 return res;
1668}
1669
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001670VKAPI_ATTR VkResult VKAPI_CALL terminator_GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
1671 uint32_t *pDisplayCount, VkDisplayKHR *pDisplays) {
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001672 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001673 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young26c19372016-11-03 14:27:13 -06001674 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001675 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001676 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -07001677 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Youngd4e5ba42017-02-28 09:58:04 -07001678 "VK_KHR_display extension not enabled. vkGetDisplayPlaneSupportedDisplaysKHR not executed!\n");
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001679 return VK_SUCCESS;
1680 }
1681
Mark Youngd4e5ba42017-02-28 09:58:04 -07001682 if (NULL == icd_term->dispatch.GetDisplayPlaneSupportedDisplaysKHR) {
1683 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1684 "ICD for selected physical device is not exporting vkGetDisplayPlaneSupportedDisplaysKHR!\n");
1685 assert(false && "loader: null GetDisplayPlaneSupportedDisplaysKHR ICD pointer");
1686 }
Jon Ashburncc370d02016-03-08 09:30:30 -07001687
Mark Youngd4e5ba42017-02-28 09:58:04 -07001688 return icd_term->dispatch.GetDisplayPlaneSupportedDisplaysKHR(phys_dev_term->phys_dev, planeIndex, pDisplayCount, pDisplays);
Jon Ashburncc370d02016-03-08 09:30:30 -07001689}
1690
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001691LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
1692 uint32_t *pPropertyCount,
1693 VkDisplayModePropertiesKHR *pProperties) {
1694 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Jon Ashburncc370d02016-03-08 09:30:30 -07001695 const VkLayerInstanceDispatchTable *disp;
Mark Young274e4bc2017-01-19 21:10:49 -07001696 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001697 VkResult res = disp->GetDisplayModePropertiesKHR(unwrapped_phys_dev, display, pPropertyCount, pProperties);
Jon Ashburncc370d02016-03-08 09:30:30 -07001698 return res;
1699}
1700
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001701VKAPI_ATTR VkResult VKAPI_CALL terminator_GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
1702 uint32_t *pPropertyCount,
1703 VkDisplayModePropertiesKHR *pProperties) {
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001704 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001705 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young26c19372016-11-03 14:27:13 -06001706 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001707 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001708 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -07001709 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Youngd4e5ba42017-02-28 09:58:04 -07001710 "VK_KHR_display extension not enabled. vkGetDisplayModePropertiesKHR not executed!\n");
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001711 return VK_SUCCESS;
1712 }
1713
Mark Youngd4e5ba42017-02-28 09:58:04 -07001714 if (NULL == icd_term->dispatch.GetDisplayModePropertiesKHR) {
1715 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1716 "ICD for selected physical device is not exporting vkGetDisplayModePropertiesKHR!\n");
1717 assert(false && "loader: null GetDisplayModePropertiesKHR ICD pointer");
1718 }
Jon Ashburncc370d02016-03-08 09:30:30 -07001719
Mark Youngd4e5ba42017-02-28 09:58:04 -07001720 return icd_term->dispatch.GetDisplayModePropertiesKHR(phys_dev_term->phys_dev, display, pPropertyCount, pProperties);
Jon Ashburncc370d02016-03-08 09:30:30 -07001721}
1722
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001723LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
1724 const VkDisplayModeCreateInfoKHR *pCreateInfo,
1725 const VkAllocationCallbacks *pAllocator,
1726 VkDisplayModeKHR *pMode) {
1727 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Jon Ashburncc370d02016-03-08 09:30:30 -07001728 const VkLayerInstanceDispatchTable *disp;
Mark Young274e4bc2017-01-19 21:10:49 -07001729 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001730 VkResult res = disp->CreateDisplayModeKHR(unwrapped_phys_dev, display, pCreateInfo, pAllocator, pMode);
Jon Ashburncc370d02016-03-08 09:30:30 -07001731 return res;
1732}
1733
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001734VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
1735 const VkDisplayModeCreateInfoKHR *pCreateInfo,
1736 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode) {
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001737 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001738 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young26c19372016-11-03 14:27:13 -06001739 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001740 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001741 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -07001742 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Youngd4e5ba42017-02-28 09:58:04 -07001743 "VK_KHR_display extension not enabled. vkCreateDisplayModeKHR not executed!\n");
Jeremy Hayes0231e1c2016-06-14 11:50:02 -06001744 return VK_ERROR_EXTENSION_NOT_PRESENT;
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001745 }
1746
Mark Youngd4e5ba42017-02-28 09:58:04 -07001747 if (NULL == icd_term->dispatch.CreateDisplayModeKHR) {
1748 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1749 "ICD for selected physical device is not exporting vkCreateDisplayModeKHR!\n");
1750 assert(false && "loader: null CreateDisplayModeKHR ICD pointer");
1751 }
Jon Ashburncc370d02016-03-08 09:30:30 -07001752
Mark Youngd4e5ba42017-02-28 09:58:04 -07001753 return icd_term->dispatch.CreateDisplayModeKHR(phys_dev_term->phys_dev, display, pCreateInfo, pAllocator, pMode);
Jon Ashburncc370d02016-03-08 09:30:30 -07001754}
1755
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001756LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice,
1757 VkDisplayModeKHR mode, uint32_t planeIndex,
1758 VkDisplayPlaneCapabilitiesKHR *pCapabilities) {
1759 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Jon Ashburncc370d02016-03-08 09:30:30 -07001760 const VkLayerInstanceDispatchTable *disp;
Mark Young274e4bc2017-01-19 21:10:49 -07001761 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001762 VkResult res = disp->GetDisplayPlaneCapabilitiesKHR(unwrapped_phys_dev, mode, planeIndex, pCapabilities);
Jon Ashburncc370d02016-03-08 09:30:30 -07001763 return res;
1764}
1765
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001766VKAPI_ATTR VkResult VKAPI_CALL terminator_GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode,
1767 uint32_t planeIndex,
1768 VkDisplayPlaneCapabilitiesKHR *pCapabilities) {
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001769 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001770 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young26c19372016-11-03 14:27:13 -06001771 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001772 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001773 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -07001774 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Youngd4e5ba42017-02-28 09:58:04 -07001775 "VK_KHR_display extension not enabled. vkGetDisplayPlaneCapabilitiesKHR not executed!\n");
Ian Elliott0d4ffa32016-03-24 13:59:22 -06001776 return VK_SUCCESS;
1777 }
1778
Mark Youngd4e5ba42017-02-28 09:58:04 -07001779 if (NULL == icd_term->dispatch.GetDisplayPlaneCapabilitiesKHR) {
1780 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1781 "ICD for selected physical device is not exporting vkGetDisplayPlaneCapabilitiesKHR!\n");
1782 assert(false && "loader: null GetDisplayPlaneCapabilitiesKHR ICD pointer");
1783 }
Jon Ashburncc370d02016-03-08 09:30:30 -07001784
Mark Youngd4e5ba42017-02-28 09:58:04 -07001785 return icd_term->dispatch.GetDisplayPlaneCapabilitiesKHR(phys_dev_term->phys_dev, mode, planeIndex, pCapabilities);
Jon Ashburncc370d02016-03-08 09:30:30 -07001786}
1787
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001788LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDisplayPlaneSurfaceKHR(VkInstance instance,
1789 const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
1790 const VkAllocationCallbacks *pAllocator,
1791 VkSurfaceKHR *pSurface) {
Jon Ashburncc370d02016-03-08 09:30:30 -07001792 const VkLayerInstanceDispatchTable *disp;
Mark Young274e4bc2017-01-19 21:10:49 -07001793 disp = loader_get_instance_layer_dispatch(instance);
Jon Ashburncc370d02016-03-08 09:30:30 -07001794 VkResult res;
1795
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001796 res = disp->CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburncc370d02016-03-08 09:30:30 -07001797 return res;
1798}
1799
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001800VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateDisplayPlaneSurfaceKHR(VkInstance instance,
1801 const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
1802 const VkAllocationCallbacks *pAllocator,
1803 VkSurfaceKHR *pSurface) {
Jon Ashburncc370d02016-03-08 09:30:30 -07001804 struct loader_instance *inst = loader_get_instance(instance);
Mark Young5467d672016-06-28 10:52:43 -06001805 VkIcdSurface *pIcdSurface = NULL;
Mark Youngf06def92016-11-01 19:20:41 -06001806 VkResult vkRes = VK_SUCCESS;
Mark Young573a7a12016-11-02 09:37:08 -06001807 uint32_t i = 0;
Jon Ashburncc370d02016-03-08 09:30:30 -07001808
Mark Youngf06def92016-11-01 19:20:41 -06001809 if (!inst->wsi_display_enabled) {
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -07001810 loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Youngd4e5ba42017-02-28 09:58:04 -07001811 "VK_KHR_surface extension not enabled. vkCreateDisplayPlaneSurfaceKHR not executed!\n");
Mark Youngf06def92016-11-01 19:20:41 -06001812 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
1813 goto out;
Petros Bantolasf3095862016-04-14 12:50:42 +01001814 }
1815
Piers Daniellc21fde52016-12-13 16:51:49 -07001816 // Next, if so, proceed with the implementation of this function:
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001817 pIcdSurface = AllocateIcdSurfaceStruct(inst, sizeof(pIcdSurface->display_surf.base), sizeof(pIcdSurface->display_surf));
Jon Ashburncc370d02016-03-08 09:30:30 -07001818 if (pIcdSurface == NULL) {
Mark Youngf06def92016-11-01 19:20:41 -06001819 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
1820 goto out;
Jon Ashburncc370d02016-03-08 09:30:30 -07001821 }
1822
Mark Young5467d672016-06-28 10:52:43 -06001823 pIcdSurface->display_surf.base.platform = VK_ICD_WSI_PLATFORM_DISPLAY;
1824 pIcdSurface->display_surf.displayMode = pCreateInfo->displayMode;
1825 pIcdSurface->display_surf.planeIndex = pCreateInfo->planeIndex;
1826 pIcdSurface->display_surf.planeStackIndex = pCreateInfo->planeStackIndex;
1827 pIcdSurface->display_surf.transform = pCreateInfo->transform;
1828 pIcdSurface->display_surf.globalAlpha = pCreateInfo->globalAlpha;
1829 pIcdSurface->display_surf.alphaMode = pCreateInfo->alphaMode;
1830 pIcdSurface->display_surf.imageExtent = pCreateInfo->imageExtent;
1831
Mark Youngf06def92016-11-01 19:20:41 -06001832 // Loop through each ICD and determine if they need to create a surface
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001833 for (struct loader_icd_term *icd_term = inst->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
1834 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
Mark Youngd4e5ba42017-02-28 09:58:04 -07001835 if (NULL != icd_term->dispatch.CreateDisplayPlaneSurfaceKHR) {
1836 vkRes = icd_term->dispatch.CreateDisplayPlaneSurfaceKHR(icd_term->instance, pCreateInfo, pAllocator,
1837 &pIcdSurface->real_icd_surfaces[i]);
Mark Youngf06def92016-11-01 19:20:41 -06001838 if (VK_SUCCESS != vkRes) {
1839 goto out;
1840 }
1841 }
1842 }
1843 }
1844
Mark Young3eda5882016-12-01 10:42:21 -07001845 *pSurface = (VkSurfaceKHR)pIcdSurface;
Jon Ashburncc370d02016-03-08 09:30:30 -07001846
Mark Youngf06def92016-11-01 19:20:41 -06001847out:
1848
1849 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
1850 if (NULL != pIcdSurface->real_icd_surfaces) {
Mark Young573a7a12016-11-02 09:37:08 -06001851 i = 0;
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001852 for (struct loader_icd_term *icd_term = inst->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
Mark Youngd4e5ba42017-02-28 09:58:04 -07001853 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
1854 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
Mark Youngf06def92016-11-01 19:20:41 -06001855 }
1856 }
1857 loader_instance_heap_free(inst, pIcdSurface->real_icd_surfaces);
1858 }
1859 loader_instance_heap_free(inst, pIcdSurface);
1860 }
1861
1862 return vkRes;
Jon Ashburncc370d02016-03-08 09:30:30 -07001863}
1864
Mark Young274e4bc2017-01-19 21:10:49 -07001865// EXT_display_swapchain Extension command
1866
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001867LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
1868 const VkSwapchainCreateInfoKHR *pCreateInfos,
1869 const VkAllocationCallbacks *pAllocator,
1870 VkSwapchainKHR *pSwapchains) {
Mark Young2a2122f2016-09-08 18:36:32 -06001871 const VkLayerDispatchTable *disp;
1872 disp = loader_get_dispatch(device);
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001873 return disp->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
Mark Youngf2eabea2016-07-01 15:18:27 -06001874}
1875
Mark Youngd4e5ba42017-02-28 09:58:04 -07001876VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
1877 const VkSwapchainCreateInfoKHR *pCreateInfos,
1878 const VkAllocationCallbacks *pAllocator,
1879 VkSwapchainKHR *pSwapchains) {
Mark Young274e4bc2017-01-19 21:10:49 -07001880 uint32_t icd_index = 0;
1881 struct loader_device *dev;
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001882 struct loader_icd_term *icd_term = loader_get_icd_and_device(device, &dev, &icd_index);
Mark Youngd4e5ba42017-02-28 09:58:04 -07001883 if (NULL != icd_term && NULL != icd_term->dispatch.CreateSharedSwapchainsKHR) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001884 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)pCreateInfos->surface;
Mark Young274e4bc2017-01-19 21:10:49 -07001885 if (NULL != icd_surface->real_icd_surfaces) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001886 if ((VkSurfaceKHR)NULL != icd_surface->real_icd_surfaces[icd_index]) {
Mark Young274e4bc2017-01-19 21:10:49 -07001887 // We found the ICD, and there is an ICD KHR surface
1888 // associated with it, so copy the CreateInfo struct
1889 // and point it at the ICD's surface.
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001890 VkSwapchainCreateInfoKHR *pCreateCopy = loader_stack_alloc(sizeof(VkSwapchainCreateInfoKHR) * swapchainCount);
Mark Young274e4bc2017-01-19 21:10:49 -07001891 if (NULL == pCreateCopy) {
1892 return VK_ERROR_OUT_OF_HOST_MEMORY;
1893 }
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001894 memcpy(pCreateCopy, pCreateInfos, sizeof(VkSwapchainCreateInfoKHR) * swapchainCount);
Mark Young274e4bc2017-01-19 21:10:49 -07001895 for (uint32_t sc = 0; sc < swapchainCount; sc++) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07001896 pCreateCopy[sc].surface = icd_surface->real_icd_surfaces[icd_index];
Mark Young274e4bc2017-01-19 21:10:49 -07001897 }
Mark Youngd4e5ba42017-02-28 09:58:04 -07001898 return icd_term->dispatch.CreateSharedSwapchainsKHR(device, swapchainCount, pCreateCopy, pAllocator, pSwapchains);
Mark Young274e4bc2017-01-19 21:10:49 -07001899 }
1900 }
Mark Youngd4e5ba42017-02-28 09:58:04 -07001901 return icd_term->dispatch.CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
Mark Young274e4bc2017-01-19 21:10:49 -07001902 }
1903 return VK_SUCCESS;
1904}
1905
Lenny Komowdbaaad62017-10-02 15:08:53 -06001906LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceGroupPresentCapabilitiesKHR(
1907 VkDevice device,
1908 VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities) {
1909 const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1910 return disp->GetDeviceGroupPresentCapabilitiesKHR(device, pDeviceGroupPresentCapabilities);
1911}
Lenny Komow31217432017-10-02 15:08:53 -06001912
Lenny Komowdbaaad62017-10-02 15:08:53 -06001913LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceGroupSurfacePresentModesKHR(
1914 VkDevice device,
1915 VkSurfaceKHR surface,
1916 VkDeviceGroupPresentModeFlagsKHR* pModes) {
1917 const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1918 return disp->GetDeviceGroupSurfacePresentModesKHR(device, surface, pModes);
1919}
1920
Lenny Komow7871f782017-10-11 15:39:38 -06001921VKAPI_ATTR VkResult VKAPI_CALL terminator_GetDeviceGroupSurfacePresentModesKHR(
1922 VkDevice device,
1923 VkSurfaceKHR surface,
1924 VkDeviceGroupPresentModeFlagsKHR* pModes) {
1925 uint32_t icd_index = 0;
1926 struct loader_device *dev;
1927 struct loader_icd_term *icd_term = loader_get_icd_and_device(device, &dev, &icd_index);
1928 if (NULL != icd_term && NULL != icd_term->dispatch.GetDeviceGroupSurfacePresentModesKHR) {
1929 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)surface;
1930 if (NULL != icd_surface->real_icd_surfaces && (VkSurfaceKHR)NULL != icd_surface->real_icd_surfaces[icd_index]) {
1931 return icd_term->dispatch.GetDeviceGroupSurfacePresentModesKHR(device, icd_surface->real_icd_surfaces[icd_index], pModes);
1932 }
1933 return icd_term->dispatch.GetDeviceGroupSurfacePresentModesKHR(device, surface, pModes);
1934 }
1935 return VK_SUCCESS;
1936}
1937
Lenny Komowdbaaad62017-10-02 15:08:53 -06001938LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDevicePresentRectanglesKHR(
Lenny Komow31217432017-10-02 15:08:53 -06001939 VkPhysicalDevice physicalDevice,
1940 VkSurfaceKHR surface,
1941 uint32_t* pRectCount,
1942 VkRect2D* pRects) {
1943 const VkLayerInstanceDispatchTable *disp;
1944 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
1945 disp = loader_get_instance_layer_dispatch(physicalDevice);
1946 return disp->GetPhysicalDevicePresentRectanglesKHR(unwrapped_phys_dev, surface, pRectCount, pRects);
1947}
1948
1949VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDevicePresentRectanglesKHR(
1950 VkPhysicalDevice physicalDevice,
1951 VkSurfaceKHR surface,
1952 uint32_t* pRectCount,
1953 VkRect2D* pRects) {
1954 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
1955 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
1956 if (NULL == icd_term->dispatch.GetPhysicalDevicePresentRectanglesKHR) {
1957 loader_log(icd_term->this_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1958 "ICD associated with VkPhysicalDevice does not support GetPhysicalDevicePresentRectanglesKHX");
1959 }
1960 VkIcdSurface *icd_surface = (VkIcdSurface *)(surface);
1961 uint8_t icd_index = phys_dev_term->icd_index;
1962 if (NULL != icd_surface->real_icd_surfaces && NULL != (void *)icd_surface->real_icd_surfaces[icd_index]) {
1963 return icd_term->dispatch.GetPhysicalDevicePresentRectanglesKHR(phys_dev_term->phys_dev, icd_surface->real_icd_surfaces[icd_index], pRectCount, pRects);
1964 }
1965 return icd_term->dispatch.GetPhysicalDevicePresentRectanglesKHR(phys_dev_term->phys_dev, surface, pRectCount, pRects);
1966}
1967
Lenny Komowdbaaad62017-10-02 15:08:53 -06001968LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImage2KHR(
1969 VkDevice device,
1970 const VkAcquireNextImageInfoKHR* pAcquireInfo,
1971 uint32_t* pImageIndex) {
1972 const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1973 return disp->AcquireNextImage2KHR(device, pAcquireInfo, pImageIndex);
1974}
1975
Lenny Komow61139782018-05-31 11:32:31 -06001976// ---- VK_KHR_get_display_properties2 extension trampoline/terminators
1977
1978LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayProperties2KHR(VkPhysicalDevice physicalDevice,
1979 uint32_t *pPropertyCount,
1980 VkDisplayProperties2KHR *pProperties) {
1981 const VkLayerInstanceDispatchTable *disp;
1982 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
1983 disp = loader_get_instance_layer_dispatch(physicalDevice);
1984 return disp->GetPhysicalDeviceDisplayProperties2KHR(unwrapped_phys_dev, pPropertyCount, pProperties);
1985}
1986
1987VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceDisplayProperties2KHR(VkPhysicalDevice physicalDevice,
1988 uint32_t *pPropertyCount,
1989 VkDisplayProperties2KHR *pProperties) {
1990 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
1991 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
1992
1993 // If the function is available in the driver, just call into it
1994 if (icd_term->dispatch.GetPhysicalDeviceDisplayProperties2KHR != NULL) {
1995 return icd_term->dispatch.GetPhysicalDeviceDisplayProperties2KHR(phys_dev_term->phys_dev, pPropertyCount, pProperties);
1996 }
1997
1998 // We have to emulate the function.
1999 loader_log(icd_term->this_instance, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, 0,
2000 "vkGetPhysicalDeviceDisplayProperties2KHR: Emulating call in ICD \"%s\"", icd_term->scanned_icd->lib_name);
2001
2002 // If the icd doesn't support VK_KHR_display, then no properties are available
2003 if (icd_term->dispatch.GetPhysicalDeviceDisplayPropertiesKHR == NULL) {
2004 *pPropertyCount = 0;
2005 return VK_SUCCESS;
2006 }
2007
2008 // If we aren't writing to pProperties, then emulation is straightforward
2009 if (pProperties == NULL || *pPropertyCount == 0) {
2010 return icd_term->dispatch.GetPhysicalDeviceDisplayPropertiesKHR(phys_dev_term->phys_dev, pPropertyCount, NULL);
2011 }
2012
2013 // If we do have to write to pProperties, then we need to write to a temporary array of VkDisplayPropertiesKHR and copy it
2014 VkDisplayPropertiesKHR *properties = loader_stack_alloc(*pPropertyCount * sizeof(VkDisplayPropertiesKHR));
2015 if (properties == NULL) {
2016 return VK_ERROR_OUT_OF_HOST_MEMORY;
2017 }
2018 VkResult res = icd_term->dispatch.GetPhysicalDeviceDisplayPropertiesKHR(phys_dev_term->phys_dev, pPropertyCount, properties);
2019 if (res < 0) {
2020 return res;
2021 }
2022 for (uint32_t i = 0; i < *pPropertyCount; ++i) {
2023 memcpy(&pProperties[i].displayProperties, &properties[i], sizeof(VkDisplayPropertiesKHR));
2024 }
2025 return res;
2026}
2027
2028LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPlaneProperties2KHR(
2029 VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkDisplayPlaneProperties2KHR *pProperties) {
2030 const VkLayerInstanceDispatchTable *disp;
2031 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
2032 disp = loader_get_instance_layer_dispatch(physicalDevice);
2033 return disp->GetPhysicalDeviceDisplayPlaneProperties2KHR(unwrapped_phys_dev, pPropertyCount, pProperties);
2034}
2035
2036VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceDisplayPlaneProperties2KHR(VkPhysicalDevice physicalDevice,
2037 uint32_t *pPropertyCount,
2038 VkDisplayPlaneProperties2KHR *pProperties) {
2039 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
2040 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
2041
2042 // If the function is available in the driver, just call into it
2043 if (icd_term->dispatch.GetPhysicalDeviceDisplayPlaneProperties2KHR != NULL) {
2044 return icd_term->dispatch.GetPhysicalDeviceDisplayPlaneProperties2KHR(phys_dev_term->phys_dev, pPropertyCount, pProperties);
2045 }
2046
2047 // We have to emulate the function.
2048 loader_log(icd_term->this_instance, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, 0,
2049 "vkGetPhysicalDeviceDisplayPlaneProperties2KHR: Emulating call in ICD \"%s\"", icd_term->scanned_icd->lib_name);
2050
2051 // If the icd doesn't support VK_KHR_display, then no properties are available
2052 if (icd_term->dispatch.GetPhysicalDeviceDisplayPlanePropertiesKHR == NULL) {
2053 *pPropertyCount = 0;
2054 return VK_SUCCESS;
2055 }
2056
2057 // If we aren't writing to pProperties, then emulation is straightforward
2058 if (pProperties == NULL || *pPropertyCount == 0) {
2059 return icd_term->dispatch.GetPhysicalDeviceDisplayPlanePropertiesKHR(phys_dev_term->phys_dev, pPropertyCount, NULL);
2060 }
2061
2062 // If we do have to write to pProperties, then we need to write to a temporary array of VkDisplayPlanePropertiesKHR and copy it
2063 VkDisplayPlanePropertiesKHR *properties = loader_stack_alloc(*pPropertyCount * sizeof(VkDisplayPlanePropertiesKHR));
2064 if (properties == NULL) {
2065 return VK_ERROR_OUT_OF_HOST_MEMORY;
2066 }
2067 VkResult res =
2068 icd_term->dispatch.GetPhysicalDeviceDisplayPlanePropertiesKHR(phys_dev_term->phys_dev, pPropertyCount, properties);
2069 if (res < 0) {
2070 return res;
2071 }
2072 for (uint32_t i = 0; i < *pPropertyCount; ++i) {
2073 memcpy(&pProperties[i].displayPlaneProperties, &properties[i], sizeof(VkDisplayPlanePropertiesKHR));
2074 }
2075 return res;
2076}
2077
2078LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayModeProperties2KHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
2079 uint32_t *pPropertyCount,
2080 VkDisplayModeProperties2KHR *pProperties) {
2081 const VkLayerInstanceDispatchTable *disp;
2082 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
2083 disp = loader_get_instance_layer_dispatch(physicalDevice);
2084 return disp->GetDisplayModeProperties2KHR(unwrapped_phys_dev, display, pPropertyCount, pProperties);
2085}
2086
2087VKAPI_ATTR VkResult VKAPI_CALL terminator_GetDisplayModeProperties2KHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
2088 uint32_t *pPropertyCount,
2089 VkDisplayModeProperties2KHR *pProperties) {
2090 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
2091 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
2092
2093 // If the function is available in the driver, just call into it
2094 if (icd_term->dispatch.GetDisplayModeProperties2KHR != NULL) {
2095 return icd_term->dispatch.GetDisplayModeProperties2KHR(phys_dev_term->phys_dev, display, pPropertyCount, pProperties);
2096 }
2097
2098 // We have to emulate the function.
2099 loader_log(icd_term->this_instance, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, 0,
2100 "vkGetDisplayModeProperties2KHR: Emulating call in ICD \"%s\"", icd_term->scanned_icd->lib_name);
2101
2102 // If the icd doesn't support VK_KHR_display, then no properties are available
2103 if (icd_term->dispatch.GetDisplayModePropertiesKHR == NULL) {
2104 *pPropertyCount = 0;
2105 return VK_SUCCESS;
2106 }
2107
2108 // If we aren't writing to pProperties, then emulation is straightforward
2109 if (pProperties == NULL || *pPropertyCount == 0) {
2110 return icd_term->dispatch.GetDisplayModePropertiesKHR(phys_dev_term->phys_dev, display, pPropertyCount, NULL);
2111 }
2112
2113 // If we do have to write to pProperties, then we need to write to a temporary array of VkDisplayModePropertiesKHR and copy it
2114 VkDisplayModePropertiesKHR *properties = loader_stack_alloc(*pPropertyCount * sizeof(VkDisplayModePropertiesKHR));
2115 if (properties == NULL) {
2116 return VK_ERROR_OUT_OF_HOST_MEMORY;
2117 }
2118 VkResult res = icd_term->dispatch.GetDisplayModePropertiesKHR(phys_dev_term->phys_dev, display, pPropertyCount, properties);
2119 if (res < 0) {
2120 return res;
2121 }
2122 for (uint32_t i = 0; i < *pPropertyCount; ++i) {
2123 memcpy(&pProperties[i].displayModeProperties, &properties[i], sizeof(VkDisplayModePropertiesKHR));
2124 }
2125 return res;
2126}
2127
2128LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayPlaneCapabilities2KHR(VkPhysicalDevice physicalDevice,
2129 const VkDisplayPlaneInfo2KHR *pDisplayPlaneInfo,
2130 VkDisplayPlaneCapabilities2KHR *pCapabilities) {
2131 const VkLayerInstanceDispatchTable *disp;
2132 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
2133 disp = loader_get_instance_layer_dispatch(physicalDevice);
2134 return disp->GetDisplayPlaneCapabilities2KHR(unwrapped_phys_dev, pDisplayPlaneInfo, pCapabilities);
2135}
2136
2137VKAPI_ATTR VkResult VKAPI_CALL terminator_GetDisplayPlaneCapabilities2KHR(VkPhysicalDevice physicalDevice,
2138 const VkDisplayPlaneInfo2KHR *pDisplayPlaneInfo,
2139 VkDisplayPlaneCapabilities2KHR *pCapabilities) {
2140 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
2141 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
2142
2143 // If the function is abailable in the driver, just call into it
2144 if (icd_term->dispatch.GetDisplayPlaneCapabilities2KHR != NULL) {
2145 return icd_term->dispatch.GetDisplayPlaneCapabilities2KHR(phys_dev_term->phys_dev, pDisplayPlaneInfo, pCapabilities);
2146 }
2147
2148 // We have to emulate the function.
2149 loader_log(icd_term->this_instance, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, 0,
2150 "vkGetDisplayPlaneCapabilities2KHR: Emulating call in ICD \"%s\"", icd_term->scanned_icd->lib_name);
2151
2152 // Just call into the old version of the function.
2153 // If the icd doesn't support VK_KHR_display, there are zero planes and this call is invalid (and will crash)
2154 return icd_term->dispatch.GetDisplayPlaneCapabilitiesKHR(phys_dev_term->phys_dev, pDisplayPlaneInfo->mode,
2155 pDisplayPlaneInfo->planeIndex, &pCapabilities->capabilities);
2156}
2157
Craig Stoutf3b74dc2020-10-26 12:05:15 -07002158#ifdef VK_USE_PLATFORM_FUCHSIA
2159
2160// This is the trampoline entrypoint for CreateImagePipeSurfaceFUCHSIA
2161LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImagePipeSurfaceFUCHSIA(VkInstance instance,
2162 const VkImagePipeSurfaceCreateInfoFUCHSIA *pCreateInfo,
2163 const VkAllocationCallbacks *pAllocator,
2164 VkSurfaceKHR *pSurface) {
2165 const VkLayerInstanceDispatchTable *disp;
2166 disp = loader_get_instance_layer_dispatch(instance);
2167 VkResult res;
2168
2169 res = disp->CreateImagePipeSurfaceFUCHSIA(instance, pCreateInfo, pAllocator, pSurface);
2170 return res;
2171}
2172
2173// This is the instance chain terminator function for CreateImagePipeSurfaceFUCHSIA
2174VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateImagePipeSurfaceFUCHSIA(VkInstance instance,
2175 const VkImagePipeSurfaceCreateInfoFUCHSIA *pCreateInfo,
2176 const VkAllocationCallbacks *pAllocator,
2177 VkSurfaceKHR *pSurface) {
2178 VkResult vkRes = VK_SUCCESS;
2179 VkIcdSurface *pIcdSurface = NULL;
2180 uint32_t i = 0;
2181
2182 // Initialize pSurface to NULL just to be safe.
2183 *pSurface = VK_NULL_HANDLE;
2184 // First, check to ensure the appropriate extension was enabled:
2185 struct loader_instance *ptr_instance = loader_get_instance(instance);
2186 if (!ptr_instance->wsi_imagepipe_surface_enabled) {
2187 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
2188 "VK_FUCHSIA_imagepipe_surface extension not enabled. "
2189 "vkCreateImagePipeSurfaceFUCHSIA not executed!\n");
2190 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
2191 goto out;
2192 }
2193
2194 // Next, if so, proceed with the implementation of this function:
2195 pIcdSurface =
2196 AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->imagepipe_surf.base), sizeof(pIcdSurface->imagepipe_surf));
2197 if (pIcdSurface == NULL) {
2198 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
2199 goto out;
2200 }
2201
2202 pIcdSurface->imagepipe_surf.base.platform = VK_ICD_WSI_PLATFORM_FUCHSIA;
2203
2204 // Loop through each ICD and determine if they need to create a surface
2205 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
2206 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
2207 if (NULL != icd_term->dispatch.CreateImagePipeSurfaceFUCHSIA) {
2208 vkRes = icd_term->dispatch.CreateImagePipeSurfaceFUCHSIA(icd_term->instance, pCreateInfo, pAllocator,
2209 &pIcdSurface->real_icd_surfaces[i]);
2210 if (VK_SUCCESS != vkRes) {
2211 goto out;
2212 }
2213 }
2214 }
2215 }
2216
2217 *pSurface = (VkSurfaceKHR)(pIcdSurface);
2218
2219out:
2220
2221 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
2222 if (NULL != pIcdSurface->real_icd_surfaces) {
2223 i = 0;
2224 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
2225 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
2226 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
2227 }
2228 }
2229 loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces);
2230 }
2231 loader_instance_heap_free(ptr_instance, pIcdSurface);
2232 }
2233
2234 return vkRes;
2235}
2236#endif // VK_USE_PLATFORM_FUCHSIA
2237
Joshua Ashton03cc64b2020-03-12 04:42:26 +00002238LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2239vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
2240 VkSurfaceCapabilities2KHR *pSurfaceCapabilities) {
2241 const VkLayerInstanceDispatchTable *disp;
2242 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
2243 disp = loader_get_instance_layer_dispatch(physicalDevice);
2244 return disp->GetPhysicalDeviceSurfaceCapabilities2KHR(unwrapped_phys_dev, pSurfaceInfo, pSurfaceCapabilities);
2245}
2246
2247VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfaceCapabilities2KHR(
2248 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
2249 VkSurfaceCapabilities2KHR *pSurfaceCapabilities) {
2250 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
2251 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Joshua Ashton64c36932020-03-12 22:57:49 +00002252 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
2253
2254 if (!ptr_instance->wsi_surface_enabled) {
2255 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
2256 "VK_KHR_surface extension not enabled. vkGetPhysicalDeviceSurfaceCapabilities2KHR not executed!\n");
2257 return VK_SUCCESS;
2258 }
Joshua Ashton03cc64b2020-03-12 04:42:26 +00002259
2260 VkIcdSurface *icd_surface = (VkIcdSurface *)(pSurfaceInfo->surface);
2261 uint8_t icd_index = phys_dev_term->icd_index;
2262
2263 if (icd_term->dispatch.GetPhysicalDeviceSurfaceCapabilities2KHR != NULL) {
2264 VkBaseOutStructure *pNext = (VkBaseOutStructure *)pSurfaceCapabilities->pNext;
2265 while (pNext != NULL) {
2266 if ((int)pNext->sType == VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR) {
2267 // Not all ICDs may be supporting VK_KHR_surface_protected_capabilities
2268 // Initialize VkSurfaceProtectedCapabilitiesKHR.supportsProtected to false and
2269 // if an ICD supports protected surfaces, it will reset it to true accordingly.
2270 ((VkSurfaceProtectedCapabilitiesKHR *)pNext)->supportsProtected = VK_FALSE;
2271 }
2272 pNext = (VkBaseOutStructure *)pNext->pNext;
2273 }
2274
2275 // Pass the call to the driver, possibly unwrapping the ICD surface
2276 if (icd_surface->real_icd_surfaces != NULL && (void *)icd_surface->real_icd_surfaces[icd_index] != NULL) {
2277 VkPhysicalDeviceSurfaceInfo2KHR info_copy = *pSurfaceInfo;
2278 info_copy.surface = icd_surface->real_icd_surfaces[icd_index];
2279 return icd_term->dispatch.GetPhysicalDeviceSurfaceCapabilities2KHR(phys_dev_term->phys_dev, &info_copy,
2280 pSurfaceCapabilities);
2281 } else {
2282 return icd_term->dispatch.GetPhysicalDeviceSurfaceCapabilities2KHR(phys_dev_term->phys_dev, pSurfaceInfo,
2283 pSurfaceCapabilities);
2284 }
2285 } else {
2286 // Emulate the call
2287 loader_log(icd_term->this_instance, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, 0,
2288 "vkGetPhysicalDeviceSurfaceCapabilities2KHR: Emulating call in ICD \"%s\" using "
2289 "vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
2290 icd_term->scanned_icd->lib_name);
2291
2292 if (pSurfaceInfo->pNext != NULL) {
2293 loader_log(icd_term->this_instance, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0,
2294 "vkGetPhysicalDeviceSurfaceCapabilities2KHR: Emulation found unrecognized structure type in "
2295 "pSurfaceInfo->pNext - this struct will be ignored");
2296 }
2297
2298 // Write to the VkSurfaceCapabilities2KHR struct
2299 VkSurfaceKHR surface = pSurfaceInfo->surface;
2300 if (icd_surface->real_icd_surfaces != NULL && (void *)icd_surface->real_icd_surfaces[icd_index] != NULL) {
2301 surface = icd_surface->real_icd_surfaces[icd_index];
2302 }
2303 VkResult res = icd_term->dispatch.GetPhysicalDeviceSurfaceCapabilitiesKHR(phys_dev_term->phys_dev, surface,
2304 &pSurfaceCapabilities->surfaceCapabilities);
2305
2306 if (pSurfaceCapabilities->pNext != NULL) {
2307 loader_log(icd_term->this_instance, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0,
2308 "vkGetPhysicalDeviceSurfaceCapabilities2KHR: Emulation found unrecognized structure type in "
2309 "pSurfaceCapabilities->pNext - this struct will be ignored");
2310 }
2311 return res;
2312 }
2313}
2314
2315LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2316vkGetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
2317 uint32_t *pSurfaceFormatCount, VkSurfaceFormat2KHR *pSurfaceFormats) {
2318 const VkLayerInstanceDispatchTable *disp;
2319 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
2320 disp = loader_get_instance_layer_dispatch(physicalDevice);
2321 return disp->GetPhysicalDeviceSurfaceFormats2KHR(unwrapped_phys_dev, pSurfaceInfo, pSurfaceFormatCount, pSurfaceFormats);
2322}
2323
2324VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice physicalDevice,
2325 const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
2326 uint32_t *pSurfaceFormatCount,
2327 VkSurfaceFormat2KHR *pSurfaceFormats) {
2328 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
2329 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Joshua Ashton64c36932020-03-12 22:57:49 +00002330 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
2331
2332 if (!ptr_instance->wsi_surface_enabled) {
2333 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
2334 "VK_KHR_surface extension not enabled. vkGetPhysicalDeviceSurfaceFormats2KHR not executed!\n");
2335 return VK_SUCCESS;
2336 }
Joshua Ashton03cc64b2020-03-12 04:42:26 +00002337
2338 VkIcdSurface *icd_surface = (VkIcdSurface *)(pSurfaceInfo->surface);
2339 uint8_t icd_index = phys_dev_term->icd_index;
2340
2341 if (icd_term->dispatch.GetPhysicalDeviceSurfaceFormats2KHR != NULL) {
2342 // Pass the call to the driver, possibly unwrapping the ICD surface
2343 if (icd_surface->real_icd_surfaces != NULL && (void *)icd_surface->real_icd_surfaces[icd_index] != NULL) {
2344 VkPhysicalDeviceSurfaceInfo2KHR info_copy = *pSurfaceInfo;
2345 info_copy.surface = icd_surface->real_icd_surfaces[icd_index];
2346 return icd_term->dispatch.GetPhysicalDeviceSurfaceFormats2KHR(phys_dev_term->phys_dev, &info_copy, pSurfaceFormatCount,
2347 pSurfaceFormats);
2348 } else {
2349 return icd_term->dispatch.GetPhysicalDeviceSurfaceFormats2KHR(phys_dev_term->phys_dev, pSurfaceInfo,
2350 pSurfaceFormatCount, pSurfaceFormats);
2351 }
2352 } else {
2353 // Emulate the call
2354 loader_log(icd_term->this_instance, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, 0,
2355 "vkGetPhysicalDeviceSurfaceFormats2KHR: Emulating call in ICD \"%s\" using vkGetPhysicalDeviceSurfaceFormatsKHR",
2356 icd_term->scanned_icd->lib_name);
2357
2358 if (pSurfaceInfo->pNext != NULL) {
2359 loader_log(icd_term->this_instance, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0,
2360 "vkGetPhysicalDeviceSurfaceFormats2KHR: Emulation found unrecognized structure type in pSurfaceInfo->pNext "
2361 "- this struct will be ignored");
2362 }
2363
2364 VkSurfaceKHR surface = pSurfaceInfo->surface;
2365 if (icd_surface->real_icd_surfaces != NULL && (void *)icd_surface->real_icd_surfaces[icd_index] != NULL) {
2366 surface = icd_surface->real_icd_surfaces[icd_index];
2367 }
2368
2369 if (*pSurfaceFormatCount == 0 || pSurfaceFormats == NULL) {
2370 // Write to pSurfaceFormatCount
2371 return icd_term->dispatch.GetPhysicalDeviceSurfaceFormatsKHR(phys_dev_term->phys_dev, surface, pSurfaceFormatCount,
2372 NULL);
2373 } else {
2374 // Allocate a temporary array for the output of the old function
2375 VkSurfaceFormatKHR *formats = loader_stack_alloc(*pSurfaceFormatCount * sizeof(VkSurfaceFormatKHR));
2376 if (formats == NULL) {
2377 return VK_ERROR_OUT_OF_HOST_MEMORY;
2378 }
2379
2380 VkResult res = icd_term->dispatch.GetPhysicalDeviceSurfaceFormatsKHR(phys_dev_term->phys_dev, surface,
2381 pSurfaceFormatCount, formats);
2382 for (uint32_t i = 0; i < *pSurfaceFormatCount; ++i) {
2383 pSurfaceFormats[i].surfaceFormat = formats[i];
2384 if (pSurfaceFormats[i].pNext != NULL) {
2385 loader_log(icd_term->this_instance, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0,
2386 "vkGetPhysicalDeviceSurfaceFormats2KHR: Emulation found unrecognized structure type in "
2387 "pSurfaceFormats[%d].pNext - this struct will be ignored",
2388 i);
2389 }
2390 }
2391 return res;
2392 }
2393 }
2394}
2395
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002396bool wsi_swapchain_instance_gpa(struct loader_instance *ptr_instance, const char *name, void **addr) {
Ian Elliott54cea232015-10-30 15:28:23 -06002397 *addr = NULL;
2398
Mark Lobodzinskib16da052016-08-31 09:31:29 -06002399 // Functions for the VK_KHR_surface extension:
Ian Elliott7c352552015-11-19 13:14:05 -07002400 if (!strcmp("vkDestroySurfaceKHR", name)) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002401 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkDestroySurfaceKHR : NULL;
Ian Elliott7c352552015-11-19 13:14:05 -07002402 return true;
2403 }
Ian Elliott54cea232015-10-30 15:28:23 -06002404 if (!strcmp("vkGetPhysicalDeviceSurfaceSupportKHR", name)) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002405 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkGetPhysicalDeviceSurfaceSupportKHR : NULL;
Ian Elliott54cea232015-10-30 15:28:23 -06002406 return true;
2407 }
Ian Elliottea666b22015-11-19 16:05:09 -07002408 if (!strcmp("vkGetPhysicalDeviceSurfaceCapabilitiesKHR", name)) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002409 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkGetPhysicalDeviceSurfaceCapabilitiesKHR : NULL;
Ian Elliottea666b22015-11-19 16:05:09 -07002410 return true;
2411 }
2412 if (!strcmp("vkGetPhysicalDeviceSurfaceFormatsKHR", name)) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002413 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkGetPhysicalDeviceSurfaceFormatsKHR : NULL;
Ian Elliottea666b22015-11-19 16:05:09 -07002414 return true;
2415 }
2416 if (!strcmp("vkGetPhysicalDeviceSurfacePresentModesKHR", name)) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002417 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkGetPhysicalDeviceSurfacePresentModesKHR : NULL;
Ian Elliottea666b22015-11-19 16:05:09 -07002418 return true;
2419 }
Ian Elliott9b89a472015-11-19 16:39:21 -07002420
Lenny Komowdbaaad62017-10-02 15:08:53 -06002421 if (!strcmp("vkGetDeviceGroupPresentCapabilitiesKHR", name)) {
2422 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkGetDeviceGroupPresentCapabilitiesKHR : NULL;
2423 return true;
2424 }
2425
2426 if (!strcmp("vkGetDeviceGroupSurfacePresentModesKHR", name)) {
2427 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkGetDeviceGroupSurfacePresentModesKHR : NULL;
2428 return true;
2429 }
2430
2431 if (!strcmp("vkGetPhysicalDevicePresentRectanglesKHR", name)) {
2432 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkGetPhysicalDevicePresentRectanglesKHR : NULL;
2433 return true;
2434 }
2435
Joshua Ashton03cc64b2020-03-12 04:42:26 +00002436 // Functions for VK_KHR_get_surface_capabilities2 extension:
2437 if (!strcmp("vkGetPhysicalDeviceSurfaceCapabilities2KHR", name)) {
2438 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkGetPhysicalDeviceSurfaceCapabilities2KHR : NULL;
2439 return true;
2440 }
2441
2442 if (!strcmp("vkGetPhysicalDeviceSurfaceFormats2KHR", name)) {
2443 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkGetPhysicalDeviceSurfaceFormats2KHR : NULL;
2444 return true;
2445 }
2446
Mark Lobodzinskib16da052016-08-31 09:31:29 -06002447 // Functions for the VK_KHR_swapchain extension:
2448
2449 // Note: This is a device extension, and its functions are statically
2450 // exported from the loader. Per Khronos decisions, the loader's GIPA
2451 // function will return the trampoline function for such device-extension
2452 // functions, regardless of whether the extension has been enabled.
Ian Elliott9b89a472015-11-19 16:39:21 -07002453 if (!strcmp("vkCreateSwapchainKHR", name)) {
Lenny Komowf1872d82018-02-23 11:28:38 -07002454 *addr = (void *)vkCreateSwapchainKHR;
Ian Elliott9b89a472015-11-19 16:39:21 -07002455 return true;
2456 }
2457 if (!strcmp("vkDestroySwapchainKHR", name)) {
Lenny Komowf1872d82018-02-23 11:28:38 -07002458 *addr = (void *)vkDestroySwapchainKHR;
Ian Elliott9b89a472015-11-19 16:39:21 -07002459 return true;
2460 }
2461 if (!strcmp("vkGetSwapchainImagesKHR", name)) {
Lenny Komowf1872d82018-02-23 11:28:38 -07002462 *addr = (void *)vkGetSwapchainImagesKHR;
Ian Elliott9b89a472015-11-19 16:39:21 -07002463 return true;
2464 }
2465 if (!strcmp("vkAcquireNextImageKHR", name)) {
Lenny Komowf1872d82018-02-23 11:28:38 -07002466 *addr = (void *)vkAcquireNextImageKHR;
Ian Elliott9b89a472015-11-19 16:39:21 -07002467 return true;
2468 }
2469 if (!strcmp("vkQueuePresentKHR", name)) {
Lenny Komowf1872d82018-02-23 11:28:38 -07002470 *addr = (void *)vkQueuePresentKHR;
Ian Elliott9b89a472015-11-19 16:39:21 -07002471 return true;
2472 }
Lenny Komowdbaaad62017-10-02 15:08:53 -06002473 if (!strcmp("vkAcquireNextImage2KHR", name)) {
Lenny Komowf1872d82018-02-23 11:28:38 -07002474 *addr = (void *)vkAcquireNextImage2KHR;
Lenny Komowdbaaad62017-10-02 15:08:53 -06002475 return true;
2476 }
Ian Elliott9b89a472015-11-19 16:39:21 -07002477
Ian Elliott7c352552015-11-19 13:14:05 -07002478#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib16da052016-08-31 09:31:29 -06002479
2480 // Functions for the VK_KHR_win32_surface extension:
Ian Elliott7c352552015-11-19 13:14:05 -07002481 if (!strcmp("vkCreateWin32SurfaceKHR", name)) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002482 *addr = ptr_instance->wsi_win32_surface_enabled ? (void *)vkCreateWin32SurfaceKHR : NULL;
Ian Elliott7c352552015-11-19 13:14:05 -07002483 return true;
2484 }
Ian Elliotte851dd62015-11-24 15:39:10 -07002485 if (!strcmp("vkGetPhysicalDeviceWin32PresentationSupportKHR", name)) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002486 *addr = ptr_instance->wsi_win32_surface_enabled ? (void *)vkGetPhysicalDeviceWin32PresentationSupportKHR : NULL;
Ian Elliotte851dd62015-11-24 15:39:10 -07002487 return true;
2488 }
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -07002489#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott7c352552015-11-19 13:14:05 -07002490#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinskib16da052016-08-31 09:31:29 -06002491
2492 // Functions for the VK_KHR_wayland_surface extension:
Jon Ashburnc4e9ae62016-02-26 13:14:27 -07002493 if (!strcmp("vkCreateWaylandSurfaceKHR", name)) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002494 *addr = ptr_instance->wsi_wayland_surface_enabled ? (void *)vkCreateWaylandSurfaceKHR : NULL;
Jon Ashburnc4e9ae62016-02-26 13:14:27 -07002495 return true;
2496 }
2497 if (!strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name)) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002498 *addr = ptr_instance->wsi_wayland_surface_enabled ? (void *)vkGetPhysicalDeviceWaylandPresentationSupportKHR : NULL;
Jon Ashburnc4e9ae62016-02-26 13:14:27 -07002499 return true;
2500 }
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -07002501#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott7c352552015-11-19 13:14:05 -07002502#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinskib16da052016-08-31 09:31:29 -06002503
2504 // Functions for the VK_KHR_xcb_surface extension:
Jon Ashburnc4e9ae62016-02-26 13:14:27 -07002505 if (!strcmp("vkCreateXcbSurfaceKHR", name)) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002506 *addr = ptr_instance->wsi_xcb_surface_enabled ? (void *)vkCreateXcbSurfaceKHR : NULL;
Jon Ashburnc4e9ae62016-02-26 13:14:27 -07002507 return true;
2508 }
2509 if (!strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name)) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002510 *addr = ptr_instance->wsi_xcb_surface_enabled ? (void *)vkGetPhysicalDeviceXcbPresentationSupportKHR : NULL;
Jon Ashburnc4e9ae62016-02-26 13:14:27 -07002511 return true;
2512 }
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -07002513#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott7c352552015-11-19 13:14:05 -07002514#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinskib16da052016-08-31 09:31:29 -06002515
2516 // Functions for the VK_KHR_xlib_surface extension:
Jon Ashburnc4e9ae62016-02-26 13:14:27 -07002517 if (!strcmp("vkCreateXlibSurfaceKHR", name)) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002518 *addr = ptr_instance->wsi_xlib_surface_enabled ? (void *)vkCreateXlibSurfaceKHR : NULL;
Jon Ashburnc4e9ae62016-02-26 13:14:27 -07002519 return true;
2520 }
2521 if (!strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name)) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002522 *addr = ptr_instance->wsi_xlib_surface_enabled ? (void *)vkGetPhysicalDeviceXlibPresentationSupportKHR : NULL;
Jon Ashburnc4e9ae62016-02-26 13:14:27 -07002523 return true;
2524 }
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -07002525#endif // VK_USE_PLATFORM_XLIB_KHR
Nicolas Caramellifa696ca2020-07-04 22:53:59 +02002526#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
2527
2528 // Functions for the VK_EXT_directfb_surface extension:
2529 if (!strcmp("vkCreateDirectFBSurfaceEXT", name)) {
2530 *addr = ptr_instance->wsi_directfb_surface_enabled ? (void *)vkCreateDirectFBSurfaceEXT : NULL;
2531 return true;
2532 }
2533 if (!strcmp("vkGetPhysicalDeviceDirectFBPresentationSupportEXT", name)) {
2534 *addr = ptr_instance->wsi_directfb_surface_enabled ? (void *)vkGetPhysicalDeviceDirectFBPresentationSupportEXT : NULL;
2535 return true;
2536 }
2537#endif // VK_USE_PLATFORM_DIRECTFB_EXT
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -07002538#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinskib16da052016-08-31 09:31:29 -06002539
2540 // Functions for the VK_KHR_android_surface extension:
Jon Ashburnc4e9ae62016-02-26 13:14:27 -07002541 if (!strcmp("vkCreateAndroidSurfaceKHR", name)) {
Karl Schultzd81ebfb2017-12-12 10:33:01 -05002542 *addr = ptr_instance->wsi_android_surface_enabled ? (void *)vkCreateAndroidSurfaceKHR : NULL;
Jon Ashburnc4e9ae62016-02-26 13:14:27 -07002543 return true;
2544 }
Mark Lobodzinskie2859eb2017-01-26 13:34:13 -07002545#endif // VK_USE_PLATFORM_ANDROID_KHR
Bryan Law-Smith57305692019-04-01 09:45:55 +01002546
Karl Schultzd81ebfb2017-12-12 10:33:01 -05002547#ifdef VK_USE_PLATFORM_MACOS_MVK
2548
2549 // Functions for the VK_MVK_macos_surface extension:
2550 if (!strcmp("vkCreateMacOSSurfaceMVK", name)) {
2551 *addr = ptr_instance->wsi_macos_surface_enabled ? (void *)vkCreateMacOSSurfaceMVK : NULL;
2552 return true;
2553 }
2554#endif // VK_USE_PLATFORM_MACOS_MVK
2555#ifdef VK_USE_PLATFORM_IOS_MVK
2556
2557 // Functions for the VK_MVK_ios_surface extension:
2558 if (!strcmp("vkCreateIOSSurfaceMVK", name)) {
2559 *addr = ptr_instance->wsi_ios_surface_enabled ? (void *)vkCreateIOSSurfaceMVK : NULL;
2560 return true;
2561 }
2562#endif // VK_USE_PLATFORM_IOS_MVK
J.D. Rouand7928a12020-11-16 15:36:42 -08002563#ifdef VK_USE_PLATFORM_GGP
2564
2565 // Functions for the VK_GGP_stream_descriptor_surface extension:
2566 if (!strcmp("vkCreateStreamDescriptorSurfaceGGP", name)) {
2567 *addr = ptr_instance->wsi_ggp_surface_enabled ? (void *)vkCreateStreamDescriptorSurfaceGGP : NULL;
2568 return true;
2569 }
2570#endif // VK_USE_PLATFORM_GGP
Craig Stoutf3b74dc2020-10-26 12:05:15 -07002571#ifdef VK_USE_PLATFORM_FUCHSIA
2572
2573 // Functions for the VK_FUCHSIA_imagepipe_surface extension:
2574 if (!strcmp("vkCreateImagePipeSurfaceFUCHSIA", name)) {
2575 *addr = ptr_instance->wsi_imagepipe_surface_enabled ? (void *)vkCreateImagePipeSurfaceFUCHSIA : NULL;
2576 return true;
2577 }
2578
2579#endif // VK_USE_PLATFORM_FUCHSIA
Ian Elliott7c352552015-11-19 13:14:05 -07002580
Bryan Law-Smith57305692019-04-01 09:45:55 +01002581 // Functions for the VK_EXT_headless_surface extension:
2582 if (!strcmp("vkCreateHeadlessSurfaceEXT", name)) {
2583 *addr = ptr_instance->wsi_headless_surface_enabled ? (void *)vkCreateHeadlessSurfaceEXT : NULL;
2584 return true;
2585 }
2586
Lenny Komowa1b5e442019-09-16 16:14:36 -06002587#if defined(VK_USE_PLATFORM_METAL_EXT)
2588 // Functions for the VK_MVK_macos_surface extension:
2589 if (!strcmp("vkCreateMetalSurfaceEXT", name)) {
2590 *addr = ptr_instance->wsi_metal_surface_enabled ? (void *)vkCreateMetalSurfaceEXT : NULL;
2591 return true;
2592 }
2593#endif // VK_USE_PLATFORM_METAL_EXT
2594
Mike Gorchak684c2a62021-03-10 22:17:20 -05002595#ifdef VK_USE_PLATFORM_SCREEN_QNX
2596
2597 // Functions for the VK_QNX_screen_surface extension:
2598 if (!strcmp("vkCreateScreenSurfaceQNX", name)) {
2599 *addr = ptr_instance->wsi_screen_surface_enabled ? (void *)vkCreateScreenSurfaceQNX : NULL;
2600 return true;
2601 }
2602 if (!strcmp("vkGetPhysicalDeviceScreenPresentationSupportQNX", name)) {
2603 *addr = ptr_instance->wsi_screen_surface_enabled ? (void *)vkGetPhysicalDeviceScreenPresentationSupportQNX : NULL;
2604 return true;
2605 }
2606#endif // VK_USE_PLATFORM_SCREEN_QNX
2607
Mark Lobodzinskib16da052016-08-31 09:31:29 -06002608 // Functions for VK_KHR_display extension:
Jon Ashburncc370d02016-03-08 09:30:30 -07002609 if (!strcmp("vkGetPhysicalDeviceDisplayPropertiesKHR", name)) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002610 *addr = ptr_instance->wsi_display_enabled ? (void *)vkGetPhysicalDeviceDisplayPropertiesKHR : NULL;
Jon Ashburncc370d02016-03-08 09:30:30 -07002611 return true;
2612 }
2613 if (!strcmp("vkGetPhysicalDeviceDisplayPlanePropertiesKHR", name)) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002614 *addr = ptr_instance->wsi_display_enabled ? (void *)vkGetPhysicalDeviceDisplayPlanePropertiesKHR : NULL;
Jon Ashburncc370d02016-03-08 09:30:30 -07002615 return true;
2616 }
2617 if (!strcmp("vkGetDisplayPlaneSupportedDisplaysKHR", name)) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002618 *addr = ptr_instance->wsi_display_enabled ? (void *)vkGetDisplayPlaneSupportedDisplaysKHR : NULL;
Jon Ashburncc370d02016-03-08 09:30:30 -07002619 return true;
2620 }
2621 if (!strcmp("vkGetDisplayModePropertiesKHR", name)) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002622 *addr = ptr_instance->wsi_display_enabled ? (void *)vkGetDisplayModePropertiesKHR : NULL;
Jon Ashburncc370d02016-03-08 09:30:30 -07002623 return true;
2624 }
2625 if (!strcmp("vkCreateDisplayModeKHR", name)) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002626 *addr = ptr_instance->wsi_display_enabled ? (void *)vkCreateDisplayModeKHR : NULL;
Jon Ashburncc370d02016-03-08 09:30:30 -07002627 return true;
2628 }
2629 if (!strcmp("vkGetDisplayPlaneCapabilitiesKHR", name)) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002630 *addr = ptr_instance->wsi_display_enabled ? (void *)vkGetDisplayPlaneCapabilitiesKHR : NULL;
Jon Ashburncc370d02016-03-08 09:30:30 -07002631 return true;
2632 }
2633 if (!strcmp("vkCreateDisplayPlaneSurfaceKHR", name)) {
Mark Lobodzinski91c10752017-01-26 12:16:30 -07002634 *addr = ptr_instance->wsi_display_enabled ? (void *)vkCreateDisplayPlaneSurfaceKHR : NULL;
Jon Ashburncc370d02016-03-08 09:30:30 -07002635 return true;
2636 }
Mark Youngf2eabea2016-07-01 15:18:27 -06002637
2638 // Functions for KHR_display_swapchain extension:
2639 if (!strcmp("vkCreateSharedSwapchainsKHR", name)) {
Lenny Komowf1872d82018-02-23 11:28:38 -07002640 *addr = (void *)vkCreateSharedSwapchainsKHR;
Mark Youngf2eabea2016-07-01 15:18:27 -06002641 return true;
2642 }
2643
Lenny Komow61139782018-05-31 11:32:31 -06002644 // Functions for KHR_get_display_properties2
2645 if (!strcmp("vkGetPhysicalDeviceDisplayProperties2KHR", name)) {
2646 *addr = ptr_instance->wsi_display_props2_enabled ? (void *)vkGetPhysicalDeviceDisplayProperties2KHR : NULL;
2647 return true;
2648 }
2649 if (!strcmp("vkGetPhysicalDeviceDisplayPlaneProperties2KHR", name)) {
2650 *addr = ptr_instance->wsi_display_props2_enabled ? (void *)vkGetPhysicalDeviceDisplayPlaneProperties2KHR : NULL;
2651 return true;
2652 }
2653 if (!strcmp("vkGetDisplayModeProperties2KHR", name)) {
2654 *addr = ptr_instance->wsi_display_props2_enabled ? (void *)vkGetDisplayModeProperties2KHR : NULL;
2655 return true;
2656 }
2657 if (!strcmp("vkGetDisplayPlaneCapabilities2KHR", name)) {
2658 *addr = ptr_instance->wsi_display_props2_enabled ? (void *)vkGetDisplayPlaneCapabilities2KHR : NULL;
2659 return true;
2660 }
2661
Jon Ashburnc4e9ae62016-02-26 13:14:27 -07002662 return false;
Ian Elliott0d4ffa32016-03-24 13:59:22 -06002663}