blob: 4098b56ff7ac393a0e00a2dd4f554c675de61eb5 [file] [log] [blame]
Ian Elliott954fa342015-10-30 15:28:23 -06001/*
Jon Ashburn23d36b12016-02-02 17:47:28 -07002 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Ian Elliott954fa342015-10-30 15:28:23 -06005 *
Jon Ashburn3ebf1252016-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 Elliott954fa342015-10-30 15:28:23 -06009 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060010 * http://www.apache.org/licenses/LICENSE-2.0
Ian Elliott954fa342015-10-30 15:28:23 -060011 *
Jon Ashburn3ebf1252016-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 Elliott954fa342015-10-30 15:28:23 -060017 *
18 * Author: Ian Elliott <ian@lunarg.com>
Jon Ashburn23d36b12016-02-02 17:47:28 -070019 * Author: Jon Ashburn <jon@lunarg.com>
Ian Elliottc2e9aee2015-11-19 11:58:08 -070020 * Author: Ian Elliott <ianelliott@google.com>
Jon Ashburn23d36b12016-02-02 17:47:28 -070021 * Author: Mark Lobodzinski <mark@lunarg.com>
Ian Elliott954fa342015-10-30 15:28:23 -060022 */
23
Ian Elliott954fa342015-10-30 15:28:23 -060024#define _GNU_SOURCE
Ian Elliott2b8965a2016-03-24 13:59:22 -060025#include <stdio.h>
Ian Elliott954fa342015-10-30 15:28:23 -060026#include <stdlib.h>
27#include <string.h>
28#include "vk_loader_platform.h"
29#include "loader.h"
30#include "wsi.h"
Ian Elliott2c05e222015-11-19 13:14:05 -070031#include <vulkan/vk_icd.h>
Ian Elliott954fa342015-10-30 15:28:23 -060032
Mark Young16573c72016-06-28 10:52:43 -060033// The first ICD/Loader interface that support querying the SurfaceKHR from
34// the ICDs.
35#define ICD_VER_SUPPORTS_ICD_SURFACE_KHR 3
36
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070037void wsi_create_instance(struct loader_instance *ptr_instance, const VkInstanceCreateInfo *pCreateInfo) {
Ian Elliottaf7d6362015-10-30 17:45:05 -060038 ptr_instance->wsi_surface_enabled = false;
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -070039
40#ifdef VK_USE_PLATFORM_WIN32_KHR
Jon Ashburnc7d3e732016-03-08 09:30:30 -070041 ptr_instance->wsi_win32_surface_enabled = false;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070042#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -070043#ifdef VK_USE_PLATFORM_MIR_KHR
Ian Elliott954fa342015-10-30 15:28:23 -060044 ptr_instance->wsi_mir_surface_enabled = false;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070045#endif // VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -070046#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott954fa342015-10-30 15:28:23 -060047 ptr_instance->wsi_wayland_surface_enabled = false;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070048#endif // VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -070049#ifdef VK_USE_PLATFORM_XCB_KHR
Ian Elliott954fa342015-10-30 15:28:23 -060050 ptr_instance->wsi_xcb_surface_enabled = false;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070051#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -070052#ifdef VK_USE_PLATFORM_XLIB_KHR
Ian Elliott954fa342015-10-30 15:28:23 -060053 ptr_instance->wsi_xlib_surface_enabled = false;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070054#endif // VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -070055#ifdef VK_USE_PLATFORM_ANDROID_KHR
56 ptr_instance->wsi_android_surface_enabled = false;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070057#endif // VK_USE_PLATFORM_ANDROID_KHR
Karl Schultz2e5ed332017-12-12 10:33:01 -050058#ifdef VK_USE_PLATFORM_MACOS_MVK
59 ptr_instance->wsi_macos_surface_enabled = false;
60#endif // VK_USE_PLATFORM_MACOS_MVK
61#ifdef VK_USE_PLATFORM_IOS_MVK
62 ptr_instance->wsi_ios_surface_enabled = false;
63#endif // VK_USE_PLATFORM_IOS_MVK
Ian Elliott954fa342015-10-30 15:28:23 -060064
Jon Ashburnc7d3e732016-03-08 09:30:30 -070065 ptr_instance->wsi_display_enabled = false;
66
Jon Ashburnf19916e2016-01-11 13:12:43 -070067 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070068 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
Ian Elliott954fa342015-10-30 15:28:23 -060069 ptr_instance->wsi_surface_enabled = true;
Ian Elliottc2e9aee2015-11-19 11:58:08 -070070 continue;
Ian Elliott954fa342015-10-30 15:28:23 -060071 }
Ian Elliottc2e9aee2015-11-19 11:58:08 -070072#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070073 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
Ian Elliottdb4300a2015-11-23 10:17:23 -070074 ptr_instance->wsi_win32_surface_enabled = true;
Ian Elliottc2e9aee2015-11-19 11:58:08 -070075 continue;
Ian Elliott954fa342015-10-30 15:28:23 -060076 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070077#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliottaf7d6362015-10-30 17:45:05 -060078#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070079 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
Ian Elliott954fa342015-10-30 15:28:23 -060080 ptr_instance->wsi_mir_surface_enabled = true;
Ian Elliottc2e9aee2015-11-19 11:58:08 -070081 continue;
Ian Elliott954fa342015-10-30 15:28:23 -060082 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070083#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliottaf7d6362015-10-30 17:45:05 -060084#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070085 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
Ian Elliott954fa342015-10-30 15:28:23 -060086 ptr_instance->wsi_wayland_surface_enabled = true;
Ian Elliottc2e9aee2015-11-19 11:58:08 -070087 continue;
Ian Elliott954fa342015-10-30 15:28:23 -060088 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070089#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliottaf7d6362015-10-30 17:45:05 -060090#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070091 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
Ian Elliott954fa342015-10-30 15:28:23 -060092 ptr_instance->wsi_xcb_surface_enabled = true;
Ian Elliottc2e9aee2015-11-19 11:58:08 -070093 continue;
Ian Elliott954fa342015-10-30 15:28:23 -060094 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070095#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliottaf7d6362015-10-30 17:45:05 -060096#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070097 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
Ian Elliott954fa342015-10-30 15:28:23 -060098 ptr_instance->wsi_xlib_surface_enabled = true;
Ian Elliottc2e9aee2015-11-19 11:58:08 -070099 continue;
Ian Elliott954fa342015-10-30 15:28:23 -0600100 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700101#endif // VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -0700102#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700103 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -0700104 ptr_instance->wsi_android_surface_enabled = true;
105 continue;
106 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700107#endif // VK_USE_PLATFORM_ANDROID_KHR
Karl Schultz2e5ed332017-12-12 10:33:01 -0500108#ifdef VK_USE_PLATFORM_MACOS_MVK
109 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_MVK_MACOS_SURFACE_EXTENSION_NAME) == 0) {
110 ptr_instance->wsi_macos_surface_enabled = true;
111 continue;
112 }
113#endif // VK_USE_PLATFORM_MACOS_MVK
114#ifdef VK_USE_PLATFORM_IOS_MVK
115 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_MVK_IOS_SURFACE_EXTENSION_NAME) == 0) {
116 ptr_instance->wsi_ios_surface_enabled = true;
117 continue;
118 }
119#endif // VK_USE_PLATFORM_IOS_MVK
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700120 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
Jon Ashburnc7d3e732016-03-08 09:30:30 -0700121 ptr_instance->wsi_display_enabled = true;
122 continue;
123 }
Ian Elliott954fa342015-10-30 15:28:23 -0600124 }
125}
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600126
127// Linux WSI surface extensions are not always compiled into the loader. (Assume
128// for Windows the KHR_win32_surface is always compiled into loader). A given
129// Linux build environment might not have the headers required for building one
130// of the four extensions (Xlib, Xcb, Mir, Wayland). Thus, need to check if
131// the built loader actually supports the particular Linux surface extension.
132// If not supported by the built loader it will not be included in the list of
133// enumerated instance extensions. This solves the issue where an ICD or layer
134// advertises support for a given Linux surface extension but the loader was not
135// built to support the extension.
Jon Ashburn6fa520f2016-03-25 12:49:35 -0600136bool wsi_unsupported_instance_extension(const VkExtensionProperties *ext_prop) {
137#ifndef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700138 if (!strcmp(ext_prop->extensionName, "VK_KHR_mir_surface")) return true;
139#endif // VK_USE_PLATFORM_MIR_KHR
Jon Ashburn6fa520f2016-03-25 12:49:35 -0600140#ifndef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700141 if (!strcmp(ext_prop->extensionName, "VK_KHR_wayland_surface")) return true;
142#endif // VK_USE_PLATFORM_WAYLAND_KHR
Jon Ashburn6fa520f2016-03-25 12:49:35 -0600143#ifndef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700144 if (!strcmp(ext_prop->extensionName, "VK_KHR_xcb_surface")) return true;
145#endif // VK_USE_PLATFORM_XCB_KHR
Jon Ashburn6fa520f2016-03-25 12:49:35 -0600146#ifndef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700147 if (!strcmp(ext_prop->extensionName, "VK_KHR_xlib_surface")) return true;
148#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott954fa342015-10-30 15:28:23 -0600149
Jon Ashburn6fa520f2016-03-25 12:49:35 -0600150 return false;
151}
Ian Elliott2c05e222015-11-19 13:14:05 -0700152
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600153// Functions for the VK_KHR_surface extension:
154
155// This is the trampoline entrypoint for DestroySurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700156LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface,
157 const VkAllocationCallbacks *pAllocator) {
Ian Elliottfb42cd72015-11-25 14:43:02 -0700158 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700159 disp = loader_get_instance_layer_dispatch(instance);
Ian Elliottfb42cd72015-11-25 14:43:02 -0700160 disp->DestroySurfaceKHR(instance, surface, pAllocator);
161}
162
Jon Ashburnc7d3e732016-03-08 09:30:30 -0700163// TODO probably need to lock around all the loader_get_instance() calls.
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600164
165// This is the instance chain terminator function for DestroySurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700166VKAPI_ATTR void VKAPI_CALL terminator_DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface,
167 const VkAllocationCallbacks *pAllocator) {
Ian Elliottdb4300a2015-11-23 10:17:23 -0700168 struct loader_instance *ptr_instance = loader_get_instance(instance);
169
Karl Schultz94971292016-11-19 09:02:27 -0700170 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)surface;
Mark Young4a62fa32016-10-17 12:27:36 -0600171 if (NULL != icd_surface) {
172 if (NULL != icd_surface->real_icd_surfaces) {
Mark Young49f39db2016-11-02 09:37:08 -0600173 uint32_t i = 0;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700174 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
175 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
Mark Young0f183a82017-02-28 09:58:04 -0700176 if (NULL != icd_term->dispatch.DestroySurfaceKHR && (VkSurfaceKHR)NULL != icd_surface->real_icd_surfaces[i]) {
177 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, icd_surface->real_icd_surfaces[i], pAllocator);
Mark Young786fb102016-12-01 10:42:21 -0700178 icd_surface->real_icd_surfaces[i] = (VkSurfaceKHR)NULL;
Mark Young4a62fa32016-10-17 12:27:36 -0600179 }
180 } else {
181 // The real_icd_surface for any ICD not supporting the
182 // proper interface version should be NULL. If not, then
183 // we have a problem.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700184 assert((VkSurfaceKHR)NULL == icd_surface->real_icd_surfaces[i]);
Mark Young16573c72016-06-28 10:52:43 -0600185 }
Mark Young16573c72016-06-28 10:52:43 -0600186 }
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700187 loader_instance_heap_free(ptr_instance, icd_surface->real_icd_surfaces);
Mark Young16573c72016-06-28 10:52:43 -0600188 }
Mark Young16573c72016-06-28 10:52:43 -0600189
Karl Schultz94971292016-11-19 09:02:27 -0700190 loader_instance_heap_free(ptr_instance, (void *)(uintptr_t)surface);
Mark Young4a62fa32016-10-17 12:27:36 -0600191 }
Ian Elliott2c05e222015-11-19 13:14:05 -0700192}
193
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600194// This is the trampoline entrypoint for GetPhysicalDeviceSurfaceSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700195LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
196 uint32_t queueFamilyIndex, VkSurfaceKHR surface,
197 VkBool32 *pSupported) {
Ian Elliott954fa342015-10-30 15:28:23 -0600198 const VkLayerInstanceDispatchTable *disp;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700199 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Mark Young39389872017-01-19 21:10:49 -0700200 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700201 VkResult res = disp->GetPhysicalDeviceSurfaceSupportKHR(unwrapped_phys_dev, queueFamilyIndex, surface, pSupported);
Ian Elliott954fa342015-10-30 15:28:23 -0600202 return res;
203}
204
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600205// This is the instance chain terminator function for
206// GetPhysicalDeviceSurfaceSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700207VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
208 uint32_t queueFamilyIndex, VkSurfaceKHR surface,
209 VkBool32 *pSupported) {
Ian Elliott2b8965a2016-03-24 13:59:22 -0600210 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700211 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -0600212 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700213 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600214 if (!ptr_instance->wsi_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700215 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700216 "VK_KHR_surface extension not enabled. vkGetPhysicalDeviceSurfaceSupportKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -0600217 return VK_SUCCESS;
218 }
219
Mark Young0f183a82017-02-28 09:58:04 -0700220 if (NULL == pSupported) {
221 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
222 "NULL pointer passed into vkGetPhysicalDeviceSurfaceSupportKHR for pSupported!\n");
223 assert(false && "GetPhysicalDeviceSurfaceSupportKHR: Error, null pSupported");
224 }
Ian Elliott954fa342015-10-30 15:28:23 -0600225 *pSupported = false;
226
Mark Young0f183a82017-02-28 09:58:04 -0700227 if (NULL == icd_term->dispatch.GetPhysicalDeviceSurfaceSupportKHR) {
228 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
229 "ICD for selected physical device is not exporting vkGetPhysicalDeviceSurfaceSupportKHR!\n");
230 assert(false && "loader: null GetPhysicalDeviceSurfaceSupportKHR ICD pointer");
231 }
Ian Elliott954fa342015-10-30 15:28:23 -0600232
Karl Schultz94971292016-11-19 09:02:27 -0700233 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)surface;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700234 if (NULL != icd_surface->real_icd_surfaces && (VkSurfaceKHR)NULL != icd_surface->real_icd_surfaces[phys_dev_term->icd_index]) {
Mark Young0f183a82017-02-28 09:58:04 -0700235 return icd_term->dispatch.GetPhysicalDeviceSurfaceSupportKHR(
236 phys_dev_term->phys_dev, queueFamilyIndex, icd_surface->real_icd_surfaces[phys_dev_term->icd_index], pSupported);
Mark Young16573c72016-06-28 10:52:43 -0600237 }
Mark Young16573c72016-06-28 10:52:43 -0600238
Mark Young0f183a82017-02-28 09:58:04 -0700239 return icd_term->dispatch.GetPhysicalDeviceSurfaceSupportKHR(phys_dev_term->phys_dev, queueFamilyIndex, surface, pSupported);
Ian Elliott954fa342015-10-30 15:28:23 -0600240}
241
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600242// This is the trampoline entrypoint for GetPhysicalDeviceSurfaceCapabilitiesKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700243LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
244 VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
Ian Elliott486c5502015-11-19 16:05:09 -0700245 const VkLayerInstanceDispatchTable *disp;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700246 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Mark Young39389872017-01-19 21:10:49 -0700247 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700248 VkResult res = disp->GetPhysicalDeviceSurfaceCapabilitiesKHR(unwrapped_phys_dev, surface, pSurfaceCapabilities);
Ian Elliott486c5502015-11-19 16:05:09 -0700249 return res;
250}
251
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600252// This is the instance chain terminator function for
253// GetPhysicalDeviceSurfaceCapabilitiesKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700254VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice,
255 VkSurfaceKHR surface,
256 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
Ian Elliott2b8965a2016-03-24 13:59:22 -0600257 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700258 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -0600259 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700260 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600261 if (!ptr_instance->wsi_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700262 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700263 "VK_KHR_surface extension not enabled. vkGetPhysicalDeviceSurfaceCapabilitiesKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -0600264 return VK_SUCCESS;
265 }
266
Mark Young0f183a82017-02-28 09:58:04 -0700267 if (NULL == pSurfaceCapabilities) {
268 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
269 "NULL pointer passed into vkGetPhysicalDeviceSurfaceCapabilitiesKHR for pSurfaceCapabilities!\n");
270 assert(false && "GetPhysicalDeviceSurfaceCapabilitiesKHR: Error, null pSurfaceCapabilities");
271 }
Ian Elliott486c5502015-11-19 16:05:09 -0700272
Mark Young0f183a82017-02-28 09:58:04 -0700273 if (NULL == icd_term->dispatch.GetPhysicalDeviceSurfaceCapabilitiesKHR) {
274 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
275 "ICD for selected physical device is not exporting vkGetPhysicalDeviceSurfaceCapabilitiesKHR!\n");
276 assert(false && "loader: null GetPhysicalDeviceSurfaceCapabilitiesKHR ICD pointer");
277 }
Ian Elliott486c5502015-11-19 16:05:09 -0700278
Karl Schultz94971292016-11-19 09:02:27 -0700279 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)surface;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700280 if (NULL != icd_surface->real_icd_surfaces && (VkSurfaceKHR)NULL != icd_surface->real_icd_surfaces[phys_dev_term->icd_index]) {
Mark Young0f183a82017-02-28 09:58:04 -0700281 return icd_term->dispatch.GetPhysicalDeviceSurfaceCapabilitiesKHR(
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700282 phys_dev_term->phys_dev, icd_surface->real_icd_surfaces[phys_dev_term->icd_index], pSurfaceCapabilities);
Mark Young16573c72016-06-28 10:52:43 -0600283 }
Mark Young16573c72016-06-28 10:52:43 -0600284
Mark Young0f183a82017-02-28 09:58:04 -0700285 return icd_term->dispatch.GetPhysicalDeviceSurfaceCapabilitiesKHR(phys_dev_term->phys_dev, surface, pSurfaceCapabilities);
Ian Elliott486c5502015-11-19 16:05:09 -0700286}
287
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600288// This is the trampoline entrypoint for GetPhysicalDeviceSurfaceFormatsKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700289LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice,
290 VkSurfaceKHR surface,
291 uint32_t *pSurfaceFormatCount,
292 VkSurfaceFormatKHR *pSurfaceFormats) {
293 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Ian Elliott486c5502015-11-19 16:05:09 -0700294 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700295 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700296 VkResult res = disp->GetPhysicalDeviceSurfaceFormatsKHR(unwrapped_phys_dev, surface, pSurfaceFormatCount, pSurfaceFormats);
Ian Elliott486c5502015-11-19 16:05:09 -0700297 return res;
298}
299
Mark Young49f39db2016-11-02 09:37:08 -0600300// This is the instance chain terminator function for
301// GetPhysicalDeviceSurfaceFormatsKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700302VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
303 uint32_t *pSurfaceFormatCount,
304 VkSurfaceFormatKHR *pSurfaceFormats) {
Ian Elliott2b8965a2016-03-24 13:59:22 -0600305 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700306 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -0600307 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700308 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600309 if (!ptr_instance->wsi_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700310 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700311 "VK_KHR_surface extension not enabled. vkGetPhysicalDeviceSurfaceFormatsKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -0600312 return VK_SUCCESS;
313 }
314
Mark Young0f183a82017-02-28 09:58:04 -0700315 if (NULL == pSurfaceFormatCount) {
316 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
317 "NULL pointer passed into vkGetPhysicalDeviceSurfaceFormatsKHR for pSurfaceFormatCount!\n");
318 assert(false && "GetPhysicalDeviceSurfaceFormatsKHR(: Error, null pSurfaceFormatCount");
319 }
Ian Elliott486c5502015-11-19 16:05:09 -0700320
Mark Young0f183a82017-02-28 09:58:04 -0700321 if (NULL == icd_term->dispatch.GetPhysicalDeviceSurfaceFormatsKHR) {
322 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
323 "ICD for selected physical device is not exporting vkGetPhysicalDeviceSurfaceCapabilitiesKHR!\n");
324 assert(false && "loader: null GetPhysicalDeviceSurfaceFormatsKHR ICD pointer");
325 }
Ian Elliott486c5502015-11-19 16:05:09 -0700326
Karl Schultz94971292016-11-19 09:02:27 -0700327 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)surface;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700328 if (NULL != icd_surface->real_icd_surfaces && (VkSurfaceKHR)NULL != icd_surface->real_icd_surfaces[phys_dev_term->icd_index]) {
Mark Young0f183a82017-02-28 09:58:04 -0700329 return icd_term->dispatch.GetPhysicalDeviceSurfaceFormatsKHR(phys_dev_term->phys_dev,
330 icd_surface->real_icd_surfaces[phys_dev_term->icd_index],
331 pSurfaceFormatCount, pSurfaceFormats);
Mark Young16573c72016-06-28 10:52:43 -0600332 }
Mark Young16573c72016-06-28 10:52:43 -0600333
Mark Young0f183a82017-02-28 09:58:04 -0700334 return icd_term->dispatch.GetPhysicalDeviceSurfaceFormatsKHR(phys_dev_term->phys_dev, surface, pSurfaceFormatCount,
335 pSurfaceFormats);
Ian Elliott486c5502015-11-19 16:05:09 -0700336}
337
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600338// This is the trampoline entrypoint for GetPhysicalDeviceSurfacePresentModesKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700339LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice,
340 VkSurfaceKHR surface,
341 uint32_t *pPresentModeCount,
342 VkPresentModeKHR *pPresentModes) {
343 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Ian Elliott486c5502015-11-19 16:05:09 -0700344 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700345 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700346 VkResult res = disp->GetPhysicalDeviceSurfacePresentModesKHR(unwrapped_phys_dev, surface, pPresentModeCount, pPresentModes);
Ian Elliott486c5502015-11-19 16:05:09 -0700347 return res;
348}
349
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600350// This is the instance chain terminator function for
351// GetPhysicalDeviceSurfacePresentModesKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700352VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice,
353 VkSurfaceKHR surface, uint32_t *pPresentModeCount,
354 VkPresentModeKHR *pPresentModes) {
Ian Elliott2b8965a2016-03-24 13:59:22 -0600355 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700356 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -0600357 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700358 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600359 if (!ptr_instance->wsi_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700360 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700361 "VK_KHR_surface extension not enabled. vkGetPhysicalDeviceSurfacePresentModesKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -0600362 return VK_SUCCESS;
363 }
364
Mark Young0f183a82017-02-28 09:58:04 -0700365 if (NULL == pPresentModeCount) {
366 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
367 "NULL pointer passed into vkGetPhysicalDeviceSurfacePresentModesKHR for pPresentModeCount!\n");
368 assert(false && "GetPhysicalDeviceSurfacePresentModesKHR(: Error, null pPresentModeCount");
369 }
Ian Elliott486c5502015-11-19 16:05:09 -0700370
Mark Young0f183a82017-02-28 09:58:04 -0700371 if (NULL == icd_term->dispatch.GetPhysicalDeviceSurfacePresentModesKHR) {
372 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
373 "ICD for selected physical device is not exporting vkGetPhysicalDeviceSurfacePresentModesKHR!\n");
374 assert(false && "loader: null GetPhysicalDeviceSurfacePresentModesKHR ICD pointer");
375 }
Ian Elliott486c5502015-11-19 16:05:09 -0700376
Karl Schultz94971292016-11-19 09:02:27 -0700377 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)surface;
Mark Lobodzinski729a8d32017-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 Young0f183a82017-02-28 09:58:04 -0700379 return icd_term->dispatch.GetPhysicalDeviceSurfacePresentModesKHR(
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700380 phys_dev_term->phys_dev, icd_surface->real_icd_surfaces[phys_dev_term->icd_index], pPresentModeCount, pPresentModes);
Mark Young16573c72016-06-28 10:52:43 -0600381 }
Mark Young16573c72016-06-28 10:52:43 -0600382
Mark Young0f183a82017-02-28 09:58:04 -0700383 return icd_term->dispatch.GetPhysicalDeviceSurfacePresentModesKHR(phys_dev_term->phys_dev, surface, pPresentModeCount,
384 pPresentModes);
Ian Elliott486c5502015-11-19 16:05:09 -0700385}
386
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600387// Functions for the VK_KHR_swapchain extension:
Ian Elliott2c05e222015-11-19 13:14:05 -0700388
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600389// This is the trampoline entrypoint for CreateSwapchainKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700390LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
391 const VkAllocationCallbacks *pAllocator,
392 VkSwapchainKHR *pSwapchain) {
Ian Elliott934d0d52015-11-19 16:39:21 -0700393 const VkLayerDispatchTable *disp;
394 disp = loader_get_dispatch(device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700395 return disp->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
Ian Elliott934d0d52015-11-19 16:39:21 -0700396}
Ian Elliott2c05e222015-11-19 13:14:05 -0700397
Mark Young0f183a82017-02-28 09:58:04 -0700398VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Karl Schultz2e5ed332017-12-12 10:33:01 -0500399 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Young16573c72016-06-28 10:52:43 -0600400 uint32_t icd_index = 0;
401 struct loader_device *dev;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700402 struct loader_icd_term *icd_term = loader_get_icd_and_device(device, &dev, &icd_index);
Mark Young0f183a82017-02-28 09:58:04 -0700403 if (NULL != icd_term && NULL != icd_term->dispatch.CreateSwapchainKHR) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700404 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)pCreateInfo->surface;
Mark Young16573c72016-06-28 10:52:43 -0600405 if (NULL != icd_surface->real_icd_surfaces) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700406 if ((VkSurfaceKHR)NULL != icd_surface->real_icd_surfaces[icd_index]) {
Mark Young16573c72016-06-28 10:52:43 -0600407 // We found the ICD, and there is an ICD KHR surface
408 // associated with it, so copy the CreateInfo struct
409 // and point it at the ICD's surface.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700410 VkSwapchainCreateInfoKHR *pCreateCopy = loader_stack_alloc(sizeof(VkSwapchainCreateInfoKHR));
Mark Young16573c72016-06-28 10:52:43 -0600411 if (NULL == pCreateCopy) {
412 return VK_ERROR_OUT_OF_HOST_MEMORY;
413 }
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700414 memcpy(pCreateCopy, pCreateInfo, sizeof(VkSwapchainCreateInfoKHR));
415 pCreateCopy->surface = icd_surface->real_icd_surfaces[icd_index];
Mark Young0f183a82017-02-28 09:58:04 -0700416 return icd_term->dispatch.CreateSwapchainKHR(device, pCreateCopy, pAllocator, pSwapchain);
Mark Young16573c72016-06-28 10:52:43 -0600417 }
418 }
Mark Young0f183a82017-02-28 09:58:04 -0700419 return icd_term->dispatch.CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
Mark Young16573c72016-06-28 10:52:43 -0600420 }
421 return VK_SUCCESS;
422}
423
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600424// This is the trampoline entrypoint for DestroySwapchainKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700425LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain,
426 const VkAllocationCallbacks *pAllocator) {
Ian Elliott934d0d52015-11-19 16:39:21 -0700427 const VkLayerDispatchTable *disp;
428 disp = loader_get_dispatch(device);
429 disp->DestroySwapchainKHR(device, swapchain, pAllocator);
430}
Ian Elliott2c05e222015-11-19 13:14:05 -0700431
Mark Young0f183a82017-02-28 09:58:04 -0700432// This is the trampoline entrypoint for GetSwapchainImagesKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700433LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain,
434 uint32_t *pSwapchainImageCount, VkImage *pSwapchainImages) {
Ian Elliott934d0d52015-11-19 16:39:21 -0700435 const VkLayerDispatchTable *disp;
436 disp = loader_get_dispatch(device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700437 return disp->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
Ian Elliott934d0d52015-11-19 16:39:21 -0700438}
439
Mark Young0f183a82017-02-28 09:58:04 -0700440// This is the trampoline entrypoint for AcquireNextImageKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700441LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
442 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Ian Elliott934d0d52015-11-19 16:39:21 -0700443 const VkLayerDispatchTable *disp;
444 disp = loader_get_dispatch(device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700445 return disp->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Ian Elliott934d0d52015-11-19 16:39:21 -0700446}
447
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600448// This is the trampoline entrypoint for QueuePresentKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700449LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
Ian Elliott934d0d52015-11-19 16:39:21 -0700450 const VkLayerDispatchTable *disp;
451 disp = loader_get_dispatch(queue);
Mark Youngead9b932016-09-08 12:28:38 -0600452 return disp->QueuePresentKHR(queue, pPresentInfo);
Ian Elliott934d0d52015-11-19 16:39:21 -0700453}
Ian Elliott2c05e222015-11-19 13:14:05 -0700454
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700455static VkIcdSurface *AllocateIcdSurfaceStruct(struct loader_instance *instance, size_t base_size, size_t platform_size) {
Mark Younga7c51fd2016-09-16 10:18:42 -0600456 // Next, if so, proceed with the implementation of this function:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700457 VkIcdSurface *pIcdSurface = loader_instance_heap_alloc(instance, sizeof(VkIcdSurface), VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
Mark Younga7c51fd2016-09-16 10:18:42 -0600458 if (pIcdSurface != NULL) {
459 // Setup the new sizes and offsets so we can grow the structures in the
460 // future without having problems
461 pIcdSurface->base_size = (uint32_t)base_size;
462 pIcdSurface->platform_size = (uint32_t)platform_size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700463 pIcdSurface->non_platform_offset = (uint32_t)((uint8_t *)(&pIcdSurface->base_size) - (uint8_t *)pIcdSurface);
Mark Younga7c51fd2016-09-16 10:18:42 -0600464 pIcdSurface->entire_size = sizeof(VkIcdSurface);
465
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700466 pIcdSurface->real_icd_surfaces = loader_instance_heap_alloc(instance, sizeof(VkSurfaceKHR) * instance->total_icd_count,
467 VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
Mark Younga60f1342016-12-13 17:19:32 -0700468 if (pIcdSurface->real_icd_surfaces == NULL) {
469 loader_instance_heap_free(instance, pIcdSurface);
470 pIcdSurface = NULL;
Mark Younga7c51fd2016-09-16 10:18:42 -0600471 } else {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700472 memset(pIcdSurface->real_icd_surfaces, 0, sizeof(VkSurfaceKHR) * instance->total_icd_count);
Mark Younga7c51fd2016-09-16 10:18:42 -0600473 }
474 }
475 return pIcdSurface;
476}
477
Ian Elliott2c05e222015-11-19 13:14:05 -0700478#ifdef VK_USE_PLATFORM_WIN32_KHR
479
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600480// Functions for the VK_KHR_win32_surface extension:
481
482// This is the trampoline entrypoint for CreateWin32SurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700483LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateWin32SurfaceKHR(VkInstance instance,
484 const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
485 const VkAllocationCallbacks *pAllocator,
486 VkSurfaceKHR *pSurface) {
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700487 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700488 disp = loader_get_instance_layer_dispatch(instance);
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700489 VkResult res;
490
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700491 res = disp->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700492 return res;
493}
494
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600495// This is the instance chain terminator function for CreateWin32SurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700496VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
497 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Young16573c72016-06-28 10:52:43 -0600498 VkResult vkRes = VK_SUCCESS;
Mark Youngad46cec2016-10-12 14:18:44 -0600499 VkIcdSurface *pIcdSurface = NULL;
Mark Young49f39db2016-11-02 09:37:08 -0600500 uint32_t i = 0;
501
Mark Younga7c51fd2016-09-16 10:18:42 -0600502 // Initialize pSurface to NULL just to be safe.
503 *pSurface = VK_NULL_HANDLE;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600504 // First, check to ensure the appropriate extension was enabled:
Ian Elliottdb4300a2015-11-23 10:17:23 -0700505 struct loader_instance *ptr_instance = loader_get_instance(instance);
Ian Elliott2b8965a2016-03-24 13:59:22 -0600506 if (!ptr_instance->wsi_win32_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700507 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700508 "VK_KHR_win32_surface extension not enabled. vkCreateWin32SurfaceKHR not executed!\n");
Mark Young16573c72016-06-28 10:52:43 -0600509 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
510 goto out;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600511 }
512
513 // Next, if so, proceed with the implementation of this function:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700514 pIcdSurface = AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->win_surf.base), sizeof(pIcdSurface->win_surf));
Ian Elliott2c05e222015-11-19 13:14:05 -0700515 if (pIcdSurface == NULL) {
Mark Young16573c72016-06-28 10:52:43 -0600516 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
517 goto out;
Ian Elliott2c05e222015-11-19 13:14:05 -0700518 }
519
Mark Young16573c72016-06-28 10:52:43 -0600520 pIcdSurface->win_surf.base.platform = VK_ICD_WSI_PLATFORM_WIN32;
521 pIcdSurface->win_surf.hinstance = pCreateInfo->hinstance;
522 pIcdSurface->win_surf.hwnd = pCreateInfo->hwnd;
Ian Elliott2c05e222015-11-19 13:14:05 -0700523
Mark Young16573c72016-06-28 10:52:43 -0600524 // Loop through each ICD and determine if they need to create a surface
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700525 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
526 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
Mark Young0f183a82017-02-28 09:58:04 -0700527 if (NULL != icd_term->dispatch.CreateWin32SurfaceKHR) {
528 vkRes = icd_term->dispatch.CreateWin32SurfaceKHR(icd_term->instance, pCreateInfo, pAllocator,
529 &pIcdSurface->real_icd_surfaces[i]);
Mark Young16573c72016-06-28 10:52:43 -0600530 if (VK_SUCCESS != vkRes) {
531 goto out;
532 }
533 }
534 }
535 }
536
537 *pSurface = (VkSurfaceKHR)(pIcdSurface);
538
539out:
540
541 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
542 if (NULL != pIcdSurface->real_icd_surfaces) {
Mark Young49f39db2016-11-02 09:37:08 -0600543 i = 0;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700544 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
Mark Young0f183a82017-02-28 09:58:04 -0700545 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
546 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
Mark Young16573c72016-06-28 10:52:43 -0600547 }
548 }
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700549 loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces);
Mark Young16573c72016-06-28 10:52:43 -0600550 }
551 loader_instance_heap_free(ptr_instance, pIcdSurface);
552 }
553
554 return vkRes;
Ian Elliott2c05e222015-11-19 13:14:05 -0700555}
Ian Elliott919fa302015-11-24 15:39:10 -0700556
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600557// This is the trampoline entrypoint for
558// GetPhysicalDeviceWin32PresentationSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700559LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
560 uint32_t queueFamilyIndex) {
561 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Ian Elliott919fa302015-11-24 15:39:10 -0700562 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700563 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700564 VkBool32 res = disp->GetPhysicalDeviceWin32PresentationSupportKHR(unwrapped_phys_dev, queueFamilyIndex);
Ian Elliott919fa302015-11-24 15:39:10 -0700565 return res;
566}
567
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600568// This is the instance chain terminator function for
569// GetPhysicalDeviceWin32PresentationSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700570VKAPI_ATTR VkBool32 VKAPI_CALL terminator_GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
571 uint32_t queueFamilyIndex) {
Ian Elliott2b8965a2016-03-24 13:59:22 -0600572 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700573 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -0600574 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700575 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600576 if (!ptr_instance->wsi_win32_surface_enabled) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700577 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700578 "VK_KHR_win32_surface extension not enabled. vkGetPhysicalDeviceWin32PresentationSupportKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -0600579 return VK_SUCCESS;
580 }
581
Mark Young0f183a82017-02-28 09:58:04 -0700582 if (NULL == icd_term->dispatch.GetPhysicalDeviceWin32PresentationSupportKHR) {
583 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
584 "ICD for selected physical device is not exporting vkGetPhysicalDeviceWin32PresentationSupportKHR!\n");
585 assert(false && "loader: null GetPhysicalDeviceWin32PresentationSupportKHR ICD pointer");
586 }
Ian Elliott919fa302015-11-24 15:39:10 -0700587
Mark Young0f183a82017-02-28 09:58:04 -0700588 return icd_term->dispatch.GetPhysicalDeviceWin32PresentationSupportKHR(phys_dev_term->phys_dev, queueFamilyIndex);
Ian Elliott919fa302015-11-24 15:39:10 -0700589}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700590#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -0700591
592#ifdef VK_USE_PLATFORM_MIR_KHR
593
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600594// Functions for the VK_KHR_mir_surface extension:
Ian Elliott2c05e222015-11-19 13:14:05 -0700595
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600596// This is the trampoline entrypoint for CreateMirSurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700597LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateMirSurfaceKHR(VkInstance instance,
598 const VkMirSurfaceCreateInfoKHR *pCreateInfo,
599 const VkAllocationCallbacks *pAllocator,
600 VkSurfaceKHR *pSurface) {
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700601 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700602 disp = loader_get_instance_layer_dispatch(instance);
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700603 VkResult res;
604
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700605 res = disp->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700606 return res;
607}
608
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600609// This is the instance chain terminator function for CreateMirSurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700610VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
611 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Young16573c72016-06-28 10:52:43 -0600612 VkResult vkRes = VK_SUCCESS;
Mark Youngad46cec2016-10-12 14:18:44 -0600613 VkIcdSurface *pIcdSurface = NULL;
Mark Young49f39db2016-11-02 09:37:08 -0600614 uint32_t i = 0;
615
Ian Elliott2b8965a2016-03-24 13:59:22 -0600616 // First, check to ensure the appropriate extension was enabled:
Ian Elliottdb4300a2015-11-23 10:17:23 -0700617 struct loader_instance *ptr_instance = loader_get_instance(instance);
Ian Elliott2b8965a2016-03-24 13:59:22 -0600618 if (!ptr_instance->wsi_mir_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700619 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700620 "VK_KHR_mir_surface extension not enabled. vkCreateMirSurfaceKHR not executed!\n");
Mark Young16573c72016-06-28 10:52:43 -0600621 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
622 goto out;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600623 }
624
625 // Next, if so, proceed with the implementation of this function:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700626 pIcdSurface = AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->mir_surf.base), sizeof(pIcdSurface->mir_surf));
Ian Elliott2c05e222015-11-19 13:14:05 -0700627 if (pIcdSurface == NULL) {
Mark Young16573c72016-06-28 10:52:43 -0600628 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
629 goto out;
Ian Elliott2c05e222015-11-19 13:14:05 -0700630 }
631
Mark Young16573c72016-06-28 10:52:43 -0600632 pIcdSurface->mir_surf.base.platform = VK_ICD_WSI_PLATFORM_MIR;
633 pIcdSurface->mir_surf.connection = pCreateInfo->connection;
634 pIcdSurface->mir_surf.mirSurface = pCreateInfo->mirSurface;
635
Mark Young16573c72016-06-28 10:52:43 -0600636 // Loop through each ICD and determine if they need to create a surface
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700637 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
638 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
Mark Young0f183a82017-02-28 09:58:04 -0700639 if (NULL != icd_term->dispatch.CreateMirSurfaceKHR) {
640 vkRes = icd_term->dispatch.CreateMirSurfaceKHR(icd_term->instance, pCreateInfo, pAllocator,
641 &pIcdSurface->real_icd_surfaces[i]);
Mark Young16573c72016-06-28 10:52:43 -0600642 if (VK_SUCCESS != vkRes) {
643 goto out;
644 }
645 }
646 }
647 }
Ian Elliott2c05e222015-11-19 13:14:05 -0700648
Jon Ashburn23d36b12016-02-02 17:47:28 -0700649 *pSurface = (VkSurfaceKHR)pIcdSurface;
Ian Elliott2c05e222015-11-19 13:14:05 -0700650
Mark Young16573c72016-06-28 10:52:43 -0600651out:
652
653 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
654 if (NULL != pIcdSurface->real_icd_surfaces) {
Mark Young49f39db2016-11-02 09:37:08 -0600655 i = 0;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700656 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
Mark Young0f183a82017-02-28 09:58:04 -0700657 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
658 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
Mark Young16573c72016-06-28 10:52:43 -0600659 }
660 }
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700661 loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces);
Mark Young16573c72016-06-28 10:52:43 -0600662 }
663 loader_instance_heap_free(ptr_instance, pIcdSurface);
664 }
665
666 return vkRes;
Ian Elliott2c05e222015-11-19 13:14:05 -0700667}
Ian Elliott919fa302015-11-24 15:39:10 -0700668
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600669// This is the trampoline entrypoint for
670// GetPhysicalDeviceMirPresentationSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700671LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
672 uint32_t queueFamilyIndex,
673 MirConnection *connection) {
674 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Ian Elliott919fa302015-11-24 15:39:10 -0700675 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700676 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700677 VkBool32 res = disp->GetPhysicalDeviceMirPresentationSupportKHR(unwrapped_phys_dev, queueFamilyIndex, connection);
Ian Elliott919fa302015-11-24 15:39:10 -0700678 return res;
679}
680
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600681// This is the instance chain terminator function for
682// GetPhysicalDeviceMirPresentationSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700683VKAPI_ATTR VkBool32 VKAPI_CALL terminator_GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
684 uint32_t queueFamilyIndex,
685 MirConnection *connection) {
Ian Elliott2b8965a2016-03-24 13:59:22 -0600686 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700687 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -0600688 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700689 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600690 if (!ptr_instance->wsi_mir_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700691 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700692 "VK_KHR_mir_surface extension not enabled. vkGetPhysicalDeviceMirPresentationSupportKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -0600693 return VK_SUCCESS;
694 }
695
Mark Young0f183a82017-02-28 09:58:04 -0700696 if (NULL == icd_term->dispatch.GetPhysicalDeviceMirPresentationSupportKHR) {
697 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
698 "ICD for selected physical device is not exporting vkGetPhysicalDeviceMirPresentationSupportKHR!\n");
699 assert(false && "loader: null GetPhysicalDeviceMirPresentationSupportKHR ICD pointer");
700 }
Ian Elliott919fa302015-11-24 15:39:10 -0700701
Mark Young0f183a82017-02-28 09:58:04 -0700702 return icd_term->dispatch.GetPhysicalDeviceMirPresentationSupportKHR(phys_dev_term->phys_dev, queueFamilyIndex, connection);
Ian Elliott919fa302015-11-24 15:39:10 -0700703}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700704#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -0700705
706#ifdef VK_USE_PLATFORM_WAYLAND_KHR
707
Mark Young0f183a82017-02-28 09:58:04 -0700708// This is the trampoline entrypoint for CreateWaylandSurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700709LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateWaylandSurfaceKHR(VkInstance instance,
710 const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
711 const VkAllocationCallbacks *pAllocator,
712 VkSurfaceKHR *pSurface) {
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700713 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700714 disp = loader_get_instance_layer_dispatch(instance);
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700715 VkResult res;
716
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700717 res = disp->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700718 return res;
719}
720
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600721// This is the instance chain terminator function for CreateWaylandSurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700722VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateWaylandSurfaceKHR(VkInstance instance,
723 const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
724 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Young16573c72016-06-28 10:52:43 -0600725 VkResult vkRes = VK_SUCCESS;
Mark Youngad46cec2016-10-12 14:18:44 -0600726 VkIcdSurface *pIcdSurface = NULL;
Mark Young49f39db2016-11-02 09:37:08 -0600727 uint32_t i = 0;
728
Ian Elliott2b8965a2016-03-24 13:59:22 -0600729 // First, check to ensure the appropriate extension was enabled:
Ian Elliottdb4300a2015-11-23 10:17:23 -0700730 struct loader_instance *ptr_instance = loader_get_instance(instance);
Jon Ashburnd76b51c2016-03-24 17:26:59 -0600731 if (!ptr_instance->wsi_wayland_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700732 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700733 "VK_KHR_wayland_surface extension not enabled. vkCreateWaylandSurfaceKHR not executed!\n");
Mark Young16573c72016-06-28 10:52:43 -0600734 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
735 goto out;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600736 }
737
738 // Next, if so, proceed with the implementation of this function:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700739 pIcdSurface = AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->wayland_surf.base), sizeof(pIcdSurface->wayland_surf));
Ian Elliott2c05e222015-11-19 13:14:05 -0700740 if (pIcdSurface == NULL) {
Mark Young16573c72016-06-28 10:52:43 -0600741 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
742 goto out;
Ian Elliott2c05e222015-11-19 13:14:05 -0700743 }
744
Mark Young16573c72016-06-28 10:52:43 -0600745 pIcdSurface->wayland_surf.base.platform = VK_ICD_WSI_PLATFORM_WAYLAND;
746 pIcdSurface->wayland_surf.display = pCreateInfo->display;
747 pIcdSurface->wayland_surf.surface = pCreateInfo->surface;
748
Mark Young16573c72016-06-28 10:52:43 -0600749 // Loop through each ICD and determine if they need to create a surface
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700750 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
751 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
Mark Young0f183a82017-02-28 09:58:04 -0700752 if (NULL != icd_term->dispatch.CreateWaylandSurfaceKHR) {
753 vkRes = icd_term->dispatch.CreateWaylandSurfaceKHR(icd_term->instance, pCreateInfo, pAllocator,
754 &pIcdSurface->real_icd_surfaces[i]);
Mark Young16573c72016-06-28 10:52:43 -0600755 if (VK_SUCCESS != vkRes) {
756 goto out;
757 }
758 }
759 }
760 }
Ian Elliott2c05e222015-11-19 13:14:05 -0700761
Jon Ashburn23d36b12016-02-02 17:47:28 -0700762 *pSurface = (VkSurfaceKHR)pIcdSurface;
Ian Elliott2c05e222015-11-19 13:14:05 -0700763
Mark Young16573c72016-06-28 10:52:43 -0600764out:
765
766 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
767 if (NULL != pIcdSurface->real_icd_surfaces) {
Mark Young49f39db2016-11-02 09:37:08 -0600768 i = 0;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700769 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
Mark Young0f183a82017-02-28 09:58:04 -0700770 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
771 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
Mark Young16573c72016-06-28 10:52:43 -0600772 }
773 }
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700774 loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces);
Mark Young16573c72016-06-28 10:52:43 -0600775 }
776 loader_instance_heap_free(ptr_instance, pIcdSurface);
777 }
778
779 return vkRes;
Ian Elliott2c05e222015-11-19 13:14:05 -0700780}
Ian Elliott919fa302015-11-24 15:39:10 -0700781
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600782// This is the trampoline entrypoint for
783// GetPhysicalDeviceWaylandPresentationSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700784LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
785 uint32_t queueFamilyIndex,
786 struct wl_display *display) {
787 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Ian Elliott919fa302015-11-24 15:39:10 -0700788 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700789 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700790 VkBool32 res = disp->GetPhysicalDeviceWaylandPresentationSupportKHR(unwrapped_phys_dev, queueFamilyIndex, display);
Ian Elliott919fa302015-11-24 15:39:10 -0700791 return res;
792}
793
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600794// This is the instance chain terminator function for
795// GetPhysicalDeviceWaylandPresentationSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700796VKAPI_ATTR VkBool32 VKAPI_CALL terminator_GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
797 uint32_t queueFamilyIndex,
798 struct wl_display *display) {
Ian Elliott2b8965a2016-03-24 13:59:22 -0600799 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700800 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -0600801 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700802 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Jon Ashburnd76b51c2016-03-24 17:26:59 -0600803 if (!ptr_instance->wsi_wayland_surface_enabled) {
Mark Young0f183a82017-02-28 09:58:04 -0700804 loader_log(
805 ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
806 "VK_KHR_wayland_surface extension not enabled. vkGetPhysicalDeviceWaylandPresentationSupportKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -0600807 return VK_SUCCESS;
808 }
809
Mark Young0f183a82017-02-28 09:58:04 -0700810 if (NULL == icd_term->dispatch.GetPhysicalDeviceWaylandPresentationSupportKHR) {
811 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
812 "ICD for selected physical device is not exporting vkGetPhysicalDeviceWaylandPresentationSupportKHR!\n");
813 assert(false && "loader: null GetPhysicalDeviceWaylandPresentationSupportKHR ICD pointer");
814 }
Ian Elliott919fa302015-11-24 15:39:10 -0700815
Mark Young0f183a82017-02-28 09:58:04 -0700816 return icd_term->dispatch.GetPhysicalDeviceWaylandPresentationSupportKHR(phys_dev_term->phys_dev, queueFamilyIndex, display);
Ian Elliott919fa302015-11-24 15:39:10 -0700817}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700818#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -0700819
820#ifdef VK_USE_PLATFORM_XCB_KHR
821
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600822// Functions for the VK_KHR_xcb_surface extension:
823
824// This is the trampoline entrypoint for CreateXcbSurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700825LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateXcbSurfaceKHR(VkInstance instance,
826 const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
827 const VkAllocationCallbacks *pAllocator,
828 VkSurfaceKHR *pSurface) {
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700829 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700830 disp = loader_get_instance_layer_dispatch(instance);
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700831 VkResult res;
832
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700833 res = disp->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700834 return res;
835}
836
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600837// This is the instance chain terminator function for CreateXcbSurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700838VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
839 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Young16573c72016-06-28 10:52:43 -0600840 VkResult vkRes = VK_SUCCESS;
Mark Youngad46cec2016-10-12 14:18:44 -0600841 VkIcdSurface *pIcdSurface = NULL;
Mark Young49f39db2016-11-02 09:37:08 -0600842 uint32_t i = 0;
843
Ian Elliott2b8965a2016-03-24 13:59:22 -0600844 // First, check to ensure the appropriate extension was enabled:
Ian Elliottdb4300a2015-11-23 10:17:23 -0700845 struct loader_instance *ptr_instance = loader_get_instance(instance);
Ian Elliott2b8965a2016-03-24 13:59:22 -0600846 if (!ptr_instance->wsi_xcb_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700847 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700848 "VK_KHR_xcb_surface extension not enabled. vkCreateXcbSurfaceKHR not executed!\n");
Mark Young16573c72016-06-28 10:52:43 -0600849 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
850 goto out;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600851 }
852
853 // Next, if so, proceed with the implementation of this function:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700854 pIcdSurface = AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->xcb_surf.base), sizeof(pIcdSurface->xcb_surf));
Ian Elliott2c05e222015-11-19 13:14:05 -0700855 if (pIcdSurface == NULL) {
Mark Young16573c72016-06-28 10:52:43 -0600856 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
857 goto out;
Ian Elliott2c05e222015-11-19 13:14:05 -0700858 }
859
Mark Young16573c72016-06-28 10:52:43 -0600860 pIcdSurface->xcb_surf.base.platform = VK_ICD_WSI_PLATFORM_XCB;
861 pIcdSurface->xcb_surf.connection = pCreateInfo->connection;
862 pIcdSurface->xcb_surf.window = pCreateInfo->window;
863
Mark Young16573c72016-06-28 10:52:43 -0600864 // Loop through each ICD and determine if they need to create a surface
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700865 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
866 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
Mark Young0f183a82017-02-28 09:58:04 -0700867 if (NULL != icd_term->dispatch.CreateXcbSurfaceKHR) {
868 vkRes = icd_term->dispatch.CreateXcbSurfaceKHR(icd_term->instance, pCreateInfo, pAllocator,
869 &pIcdSurface->real_icd_surfaces[i]);
Mark Young16573c72016-06-28 10:52:43 -0600870 if (VK_SUCCESS != vkRes) {
871 goto out;
872 }
873 }
874 }
875 }
Ian Elliott2c05e222015-11-19 13:14:05 -0700876
Mark Young786fb102016-12-01 10:42:21 -0700877 *pSurface = (VkSurfaceKHR)pIcdSurface;
Ian Elliott2c05e222015-11-19 13:14:05 -0700878
Mark Young16573c72016-06-28 10:52:43 -0600879out:
880
881 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
882 if (NULL != pIcdSurface->real_icd_surfaces) {
Mark Young49f39db2016-11-02 09:37:08 -0600883 i = 0;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700884 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
Mark Young0f183a82017-02-28 09:58:04 -0700885 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
886 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
Mark Young16573c72016-06-28 10:52:43 -0600887 }
888 }
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700889 loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces);
Mark Young16573c72016-06-28 10:52:43 -0600890 }
891 loader_instance_heap_free(ptr_instance, pIcdSurface);
892 }
893
894 return vkRes;
Ian Elliott2c05e222015-11-19 13:14:05 -0700895}
Ian Elliott919fa302015-11-24 15:39:10 -0700896
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600897// This is the trampoline entrypoint for
898// GetPhysicalDeviceXcbPresentationSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700899LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
900 uint32_t queueFamilyIndex,
901 xcb_connection_t *connection,
902 xcb_visualid_t visual_id) {
903 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Ian Elliott919fa302015-11-24 15:39:10 -0700904 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700905 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700906 VkBool32 res = disp->GetPhysicalDeviceXcbPresentationSupportKHR(unwrapped_phys_dev, queueFamilyIndex, connection, visual_id);
Ian Elliott919fa302015-11-24 15:39:10 -0700907 return res;
908}
909
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600910// This is the instance chain terminator function for
911// GetPhysicalDeviceXcbPresentationSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700912VKAPI_ATTR VkBool32 VKAPI_CALL terminator_GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
913 uint32_t queueFamilyIndex,
914 xcb_connection_t *connection,
915 xcb_visualid_t visual_id) {
Ian Elliott2b8965a2016-03-24 13:59:22 -0600916 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700917 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -0600918 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700919 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600920 if (!ptr_instance->wsi_xcb_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700921 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700922 "VK_KHR_xcb_surface extension not enabled. vkGetPhysicalDeviceXcbPresentationSupportKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -0600923 return VK_SUCCESS;
924 }
925
Mark Young0f183a82017-02-28 09:58:04 -0700926 if (NULL == icd_term->dispatch.GetPhysicalDeviceXcbPresentationSupportKHR) {
927 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
928 "ICD for selected physical device is not exporting vkGetPhysicalDeviceXcbPresentationSupportKHR!\n");
929 assert(false && "loader: null GetPhysicalDeviceXcbPresentationSupportKHR ICD pointer");
930 }
Ian Elliott919fa302015-11-24 15:39:10 -0700931
Mark Young0f183a82017-02-28 09:58:04 -0700932 return icd_term->dispatch.GetPhysicalDeviceXcbPresentationSupportKHR(phys_dev_term->phys_dev, queueFamilyIndex, connection,
933 visual_id);
Ian Elliott919fa302015-11-24 15:39:10 -0700934}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700935#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -0700936
937#ifdef VK_USE_PLATFORM_XLIB_KHR
938
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600939// Functions for the VK_KHR_xlib_surface extension:
Ian Elliott2c05e222015-11-19 13:14:05 -0700940
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600941// This is the trampoline entrypoint for CreateXlibSurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700942LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateXlibSurfaceKHR(VkInstance instance,
943 const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
944 const VkAllocationCallbacks *pAllocator,
945 VkSurfaceKHR *pSurface) {
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700946 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700947 disp = loader_get_instance_layer_dispatch(instance);
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700948 VkResult res;
949
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700950 res = disp->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700951 return res;
952}
953
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600954// This is the instance chain terminator function for CreateXlibSurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700955VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
956 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Young16573c72016-06-28 10:52:43 -0600957 VkResult vkRes = VK_SUCCESS;
Mark Youngad46cec2016-10-12 14:18:44 -0600958 VkIcdSurface *pIcdSurface = NULL;
Mark Young49f39db2016-11-02 09:37:08 -0600959 uint32_t i = 0;
960
Ian Elliott2b8965a2016-03-24 13:59:22 -0600961 // First, check to ensure the appropriate extension was enabled:
Ian Elliottdb4300a2015-11-23 10:17:23 -0700962 struct loader_instance *ptr_instance = loader_get_instance(instance);
Ian Elliott2b8965a2016-03-24 13:59:22 -0600963 if (!ptr_instance->wsi_xlib_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700964 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700965 "VK_KHR_xlib_surface extension not enabled. vkCreateXlibSurfaceKHR not executed!\n");
Mark Young16573c72016-06-28 10:52:43 -0600966 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
967 goto out;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600968 }
969
970 // Next, if so, proceed with the implementation of this function:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700971 pIcdSurface = AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->xlib_surf.base), sizeof(pIcdSurface->xlib_surf));
Ian Elliott2c05e222015-11-19 13:14:05 -0700972 if (pIcdSurface == NULL) {
Mark Young16573c72016-06-28 10:52:43 -0600973 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
974 goto out;
Ian Elliott2c05e222015-11-19 13:14:05 -0700975 }
976
Mark Young16573c72016-06-28 10:52:43 -0600977 pIcdSurface->xlib_surf.base.platform = VK_ICD_WSI_PLATFORM_XLIB;
978 pIcdSurface->xlib_surf.dpy = pCreateInfo->dpy;
979 pIcdSurface->xlib_surf.window = pCreateInfo->window;
980
Mark Young16573c72016-06-28 10:52:43 -0600981 // Loop through each ICD and determine if they need to create a surface
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700982 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
983 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
Mark Young0f183a82017-02-28 09:58:04 -0700984 if (NULL != icd_term->dispatch.CreateXlibSurfaceKHR) {
985 vkRes = icd_term->dispatch.CreateXlibSurfaceKHR(icd_term->instance, pCreateInfo, pAllocator,
986 &pIcdSurface->real_icd_surfaces[i]);
Mark Young16573c72016-06-28 10:52:43 -0600987 if (VK_SUCCESS != vkRes) {
988 goto out;
989 }
990 }
991 }
992 }
Ian Elliott2c05e222015-11-19 13:14:05 -0700993
Mark Young786fb102016-12-01 10:42:21 -0700994 *pSurface = (VkSurfaceKHR)pIcdSurface;
Ian Elliott2c05e222015-11-19 13:14:05 -0700995
Mark Young16573c72016-06-28 10:52:43 -0600996out:
997
998 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
999 if (NULL != pIcdSurface->real_icd_surfaces) {
Mark Young49f39db2016-11-02 09:37:08 -06001000 i = 0;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001001 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
Mark Young0f183a82017-02-28 09:58:04 -07001002 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
1003 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
Mark Young16573c72016-06-28 10:52:43 -06001004 }
1005 }
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001006 loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces);
Mark Young16573c72016-06-28 10:52:43 -06001007 }
1008 loader_instance_heap_free(ptr_instance, pIcdSurface);
1009 }
1010
1011 return vkRes;
Ian Elliott2c05e222015-11-19 13:14:05 -07001012}
Ian Elliott919fa302015-11-24 15:39:10 -07001013
Mark Young49f39db2016-11-02 09:37:08 -06001014// This is the trampoline entrypoint for
1015// GetPhysicalDeviceXlibPresentationSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001016LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
1017 uint32_t queueFamilyIndex, Display *dpy,
1018 VisualID visualID) {
1019 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Ian Elliott919fa302015-11-24 15:39:10 -07001020 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -07001021 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001022 VkBool32 res = disp->GetPhysicalDeviceXlibPresentationSupportKHR(unwrapped_phys_dev, queueFamilyIndex, dpy, visualID);
Ian Elliott919fa302015-11-24 15:39:10 -07001023 return res;
1024}
1025
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001026// This is the instance chain terminator function for
1027// GetPhysicalDeviceXlibPresentationSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001028VKAPI_ATTR VkBool32 VKAPI_CALL terminator_GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
1029 uint32_t queueFamilyIndex, Display *dpy,
1030 VisualID visualID) {
Ian Elliott2b8965a2016-03-24 13:59:22 -06001031 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001032 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -06001033 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001034 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -06001035 if (!ptr_instance->wsi_xlib_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001036 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -07001037 "VK_KHR_xlib_surface extension not enabled. vkGetPhysicalDeviceXlibPresentationSupportKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -06001038 return VK_SUCCESS;
1039 }
1040
Mark Young0f183a82017-02-28 09:58:04 -07001041 if (NULL == icd_term->dispatch.GetPhysicalDeviceXlibPresentationSupportKHR) {
1042 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1043 "ICD for selected physical device is not exporting vkGetPhysicalDeviceXlibPresentationSupportKHR!\n");
1044 assert(false && "loader: null GetPhysicalDeviceXlibPresentationSupportKHR ICD pointer");
1045 }
Ian Elliott919fa302015-11-24 15:39:10 -07001046
Mark Young0f183a82017-02-28 09:58:04 -07001047 return icd_term->dispatch.GetPhysicalDeviceXlibPresentationSupportKHR(phys_dev_term->phys_dev, queueFamilyIndex, dpy, visualID);
Ian Elliott919fa302015-11-24 15:39:10 -07001048}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001049#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -07001050
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -07001051#ifdef VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -07001052
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001053// Functions for the VK_KHR_android_surface extension:
1054
1055// This is the trampoline entrypoint for CreateAndroidSurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001056LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateAndroidSurfaceKHR(VkInstance instance, ANativeWindow *window,
1057 const VkAllocationCallbacks *pAllocator,
1058 VkSurfaceKHR *pSurface) {
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -07001059 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -07001060 disp = loader_get_instance_layer_dispatch(instance);
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -07001061 VkResult res;
1062
1063 res = disp->CreateAndroidSurfaceKHR(instance, window, pAllocator, pSurface);
1064 return res;
1065}
1066
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001067// This is the instance chain terminator function for CreateAndroidSurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001068VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateAndroidSurfaceKHR(VkInstance instance, Window window,
1069 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Ian Elliott2b8965a2016-03-24 13:59:22 -06001070 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -07001071 struct loader_instance *ptr_instance = loader_get_instance(instance);
Ian Elliott2b8965a2016-03-24 13:59:22 -06001072 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001073 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -07001074 "VK_KHR_display extension not enabled. vkCreateAndroidSurfaceKHR not executed!\n");
Jeremy Hayes9f1d0b62016-06-14 11:50:02 -06001075 return VK_ERROR_EXTENSION_NOT_PRESENT;
Ian Elliott2b8965a2016-03-24 13:59:22 -06001076 }
1077
1078 // Next, if so, proceed with the implementation of this function:
Mark Young16573c72016-06-28 10:52:43 -06001079 VkIcdSurfaceAndroid *pIcdSurface =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001080 loader_instance_heap_alloc(ptr_instance, sizeof(VkIcdSurfaceAndroid), VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -07001081 if (pIcdSurface == NULL) {
1082 return VK_ERROR_OUT_OF_HOST_MEMORY;
1083 }
1084
1085 pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_ANDROID;
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -07001086 pIcdSurface->window = window;
1087
Jon Ashburn23d36b12016-02-02 17:47:28 -07001088 *pSurface = (VkSurfaceKHR)pIcdSurface;
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -07001089
1090 return VK_SUCCESS;
1091}
1092
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001093#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -07001094
Karl Schultz2e5ed332017-12-12 10:33:01 -05001095#ifdef VK_USE_PLATFORM_MACOS_MVK
1096
1097// Functions for the VK_MVK_macos_surface extension:
1098
1099// This is the trampoline entrypoint for CreateMacOSSurfaceMVK
1100LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateMacOSSurfaceMVK(VkInstance instance,
1101 const VkMacOSSurfaceCreateInfoMVK *pCreateInfo,
1102 const VkAllocationCallbacks *pAllocator,
1103 VkSurfaceKHR *pSurface) {
1104 const VkLayerInstanceDispatchTable *disp;
1105 disp = loader_get_instance_layer_dispatch(instance);
1106 VkResult res;
1107
1108 res = disp->CreateMacOSSurfaceMVK(instance, pCreateInfo, pAllocator, pSurface);
1109 return res;
1110}
1111
1112// This is the instance chain terminator function for CreateMacOSSurfaceKHR
1113VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateMacOSSurfaceMVK(VkInstance instance, const VkMacOSSurfaceCreateInfoMVK *pCreateInfo,
1114 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
1115 VkResult vkRes = VK_SUCCESS;
1116 VkIcdSurface *pIcdSurface = NULL;
1117 uint32_t i = 0;
1118
1119 // First, check to ensure the appropriate extension was enabled:
1120 struct loader_instance *ptr_instance = loader_get_instance(instance);
1121 if (!ptr_instance->wsi_macos_surface_enabled) {
1122 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1123 "VK_MVK_macos_surface extension not enabled. vkCreateMacOSSurfaceMVK not executed!\n");
1124 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
1125 goto out;
1126 }
1127
1128 // Next, if so, proceed with the implementation of this function:
1129 pIcdSurface = AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->macos_surf.base), sizeof(pIcdSurface->macos_surf));
1130 if (pIcdSurface == NULL) {
1131 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
1132 goto out;
1133 }
1134
1135 pIcdSurface->macos_surf.base.platform = VK_ICD_WSI_PLATFORM_MACOS;
1136 pIcdSurface->macos_surf.pView = pCreateInfo->pView;
1137
1138 // Loop through each ICD and determine if they need to create a surface
1139 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
1140 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
1141 if (NULL != icd_term->dispatch.CreateMacOSSurfaceMVK) {
1142 vkRes = icd_term->dispatch.CreateMacOSSurfaceMVK(icd_term->instance, pCreateInfo, pAllocator,
1143 &pIcdSurface->real_icd_surfaces[i]);
1144 if (VK_SUCCESS != vkRes) {
1145 goto out;
1146 }
1147 }
1148 }
1149 }
1150
1151 *pSurface = (VkSurfaceKHR)pIcdSurface;
1152
1153out:
1154
1155 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
1156 if (NULL != pIcdSurface->real_icd_surfaces) {
1157 i = 0;
1158 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
1159 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
1160 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
1161 }
1162 }
1163 loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces);
1164 }
1165 loader_instance_heap_free(ptr_instance, pIcdSurface);
1166 }
1167
1168 return vkRes;
1169}
1170
1171#endif // VK_USE_PLATFORM_MACOS_MVK
1172
1173#ifdef VK_USE_PLATFORM_IOS_MVK
1174
1175// Functions for the VK_MVK_ios_surface extension:
1176
1177// This is the trampoline entrypoint for CreateIOSSurfaceMVK
1178LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateIOSSurfaceMVK(VkInstance instance,
1179 const VkIOSSurfaceCreateInfoMVK *pCreateInfo,
1180 const VkAllocationCallbacks *pAllocator,
1181 VkSurfaceKHR *pSurface) {
1182 const VkLayerInstanceDispatchTable *disp;
1183 disp = loader_get_instance_layer_dispatch(instance);
1184 VkResult res;
1185
1186 res = disp->CreateIOSSurfaceMVK(instance, pCreateInfo, pAllocator, pSurface);
1187 return res;
1188}
1189
1190// This is the instance chain terminator function for CreateIOSSurfaceKHR
1191VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateIOSSurfaceMVK(VkInstance instance, const VkIOSSurfaceCreateInfoMVK *pCreateInfo,
1192 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
1193 // First, check to ensure the appropriate extension was enabled:
1194 struct loader_instance *ptr_instance = loader_get_instance(instance);
1195 if (!ptr_instance->wsi_ios_surface_enabled) {
1196 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1197 "VK_MVK_ios_surface extension not enabled. vkCreateIOSSurfaceMVK not executed!\n");
1198 return VK_ERROR_EXTENSION_NOT_PRESENT;
1199 }
1200
1201 // Next, if so, proceed with the implementation of this function:
1202 VkIcdSurfaceIOS *pIcdSurface =
1203 loader_instance_heap_alloc(ptr_instance, sizeof(VkIcdSurfaceIOS), VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
1204 if (pIcdSurface == NULL) {
1205 return VK_ERROR_OUT_OF_HOST_MEMORY;
1206 }
1207
1208 pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_IOS;
1209 pIcdSurface->pView = pCreateInfo->pView;
1210
1211 *pSurface = (VkSurfaceKHR)pIcdSurface;
1212
1213 return VK_SUCCESS;
1214}
1215
1216#endif // VK_USE_PLATFORM_IOS_MVK
1217
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001218// Functions for the VK_KHR_display instance extension:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001219LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice,
1220 uint32_t *pPropertyCount,
1221 VkDisplayPropertiesKHR *pProperties) {
1222 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001223 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -07001224 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001225 VkResult res = disp->GetPhysicalDeviceDisplayPropertiesKHR(unwrapped_phys_dev, pPropertyCount, pProperties);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001226 return res;
1227}
1228
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001229VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice,
1230 uint32_t *pPropertyCount,
1231 VkDisplayPropertiesKHR *pProperties) {
Ian Elliott2b8965a2016-03-24 13:59:22 -06001232 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001233 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -06001234 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001235 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -06001236 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001237 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -07001238 "VK_KHR_display extension not enabled. vkGetPhysicalDeviceDisplayPropertiesKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -06001239 return VK_SUCCESS;
1240 }
1241
Mark Young0f183a82017-02-28 09:58:04 -07001242 if (NULL == icd_term->dispatch.GetPhysicalDeviceDisplayPropertiesKHR) {
1243 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1244 "ICD for selected physical device is not exporting vkGetPhysicalDeviceDisplayPropertiesKHR!\n");
1245 assert(false && "loader: null GetPhysicalDeviceDisplayPropertiesKHR ICD pointer");
1246 }
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001247
Mark Young0f183a82017-02-28 09:58:04 -07001248 return icd_term->dispatch.GetPhysicalDeviceDisplayPropertiesKHR(phys_dev_term->phys_dev, pPropertyCount, pProperties);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001249}
1250
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001251LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
1252 VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkDisplayPlanePropertiesKHR *pProperties) {
1253 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001254 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -07001255 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001256 VkResult res = disp->GetPhysicalDeviceDisplayPlanePropertiesKHR(unwrapped_phys_dev, pPropertyCount, pProperties);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001257 return res;
1258}
1259
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001260VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice,
1261 uint32_t *pPropertyCount,
1262 VkDisplayPlanePropertiesKHR *pProperties) {
Ian Elliott2b8965a2016-03-24 13:59:22 -06001263 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001264 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -06001265 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001266 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -06001267 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001268 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -07001269 "VK_KHR_display extension not enabled. vkGetPhysicalDeviceDisplayPlanePropertiesKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -06001270 return VK_SUCCESS;
1271 }
1272
Mark Young0f183a82017-02-28 09:58:04 -07001273 if (NULL == icd_term->dispatch.GetPhysicalDeviceDisplayPlanePropertiesKHR) {
1274 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1275 "ICD for selected physical device is not exporting vkGetPhysicalDeviceDisplayPlanePropertiesKHR!\n");
1276 assert(false && "loader: null GetPhysicalDeviceDisplayPlanePropertiesKHR ICD pointer");
1277 }
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001278
Mark Young0f183a82017-02-28 09:58:04 -07001279 return icd_term->dispatch.GetPhysicalDeviceDisplayPlanePropertiesKHR(phys_dev_term->phys_dev, pPropertyCount, pProperties);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001280}
1281
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001282LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice,
1283 uint32_t planeIndex, uint32_t *pDisplayCount,
1284 VkDisplayKHR *pDisplays) {
1285 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001286 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -07001287 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001288 VkResult res = disp->GetDisplayPlaneSupportedDisplaysKHR(unwrapped_phys_dev, planeIndex, pDisplayCount, pDisplays);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001289 return res;
1290}
1291
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001292VKAPI_ATTR VkResult VKAPI_CALL terminator_GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
1293 uint32_t *pDisplayCount, VkDisplayKHR *pDisplays) {
Ian Elliott2b8965a2016-03-24 13:59:22 -06001294 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001295 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -06001296 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001297 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -06001298 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001299 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -07001300 "VK_KHR_display extension not enabled. vkGetDisplayPlaneSupportedDisplaysKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -06001301 return VK_SUCCESS;
1302 }
1303
Mark Young0f183a82017-02-28 09:58:04 -07001304 if (NULL == icd_term->dispatch.GetDisplayPlaneSupportedDisplaysKHR) {
1305 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1306 "ICD for selected physical device is not exporting vkGetDisplayPlaneSupportedDisplaysKHR!\n");
1307 assert(false && "loader: null GetDisplayPlaneSupportedDisplaysKHR ICD pointer");
1308 }
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001309
Mark Young0f183a82017-02-28 09:58:04 -07001310 return icd_term->dispatch.GetDisplayPlaneSupportedDisplaysKHR(phys_dev_term->phys_dev, planeIndex, pDisplayCount, pDisplays);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001311}
1312
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001313LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
1314 uint32_t *pPropertyCount,
1315 VkDisplayModePropertiesKHR *pProperties) {
1316 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001317 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -07001318 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001319 VkResult res = disp->GetDisplayModePropertiesKHR(unwrapped_phys_dev, display, pPropertyCount, pProperties);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001320 return res;
1321}
1322
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001323VKAPI_ATTR VkResult VKAPI_CALL terminator_GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
1324 uint32_t *pPropertyCount,
1325 VkDisplayModePropertiesKHR *pProperties) {
Ian Elliott2b8965a2016-03-24 13:59:22 -06001326 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001327 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -06001328 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001329 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -06001330 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001331 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -07001332 "VK_KHR_display extension not enabled. vkGetDisplayModePropertiesKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -06001333 return VK_SUCCESS;
1334 }
1335
Mark Young0f183a82017-02-28 09:58:04 -07001336 if (NULL == icd_term->dispatch.GetDisplayModePropertiesKHR) {
1337 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1338 "ICD for selected physical device is not exporting vkGetDisplayModePropertiesKHR!\n");
1339 assert(false && "loader: null GetDisplayModePropertiesKHR ICD pointer");
1340 }
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001341
Mark Young0f183a82017-02-28 09:58:04 -07001342 return icd_term->dispatch.GetDisplayModePropertiesKHR(phys_dev_term->phys_dev, display, pPropertyCount, pProperties);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001343}
1344
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001345LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
1346 const VkDisplayModeCreateInfoKHR *pCreateInfo,
1347 const VkAllocationCallbacks *pAllocator,
1348 VkDisplayModeKHR *pMode) {
1349 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001350 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -07001351 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001352 VkResult res = disp->CreateDisplayModeKHR(unwrapped_phys_dev, display, pCreateInfo, pAllocator, pMode);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001353 return res;
1354}
1355
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001356VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
1357 const VkDisplayModeCreateInfoKHR *pCreateInfo,
1358 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode) {
Ian Elliott2b8965a2016-03-24 13:59:22 -06001359 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001360 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -06001361 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001362 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -06001363 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001364 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -07001365 "VK_KHR_display extension not enabled. vkCreateDisplayModeKHR not executed!\n");
Jeremy Hayes9f1d0b62016-06-14 11:50:02 -06001366 return VK_ERROR_EXTENSION_NOT_PRESENT;
Ian Elliott2b8965a2016-03-24 13:59:22 -06001367 }
1368
Mark Young0f183a82017-02-28 09:58:04 -07001369 if (NULL == icd_term->dispatch.CreateDisplayModeKHR) {
1370 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1371 "ICD for selected physical device is not exporting vkCreateDisplayModeKHR!\n");
1372 assert(false && "loader: null CreateDisplayModeKHR ICD pointer");
1373 }
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001374
Mark Young0f183a82017-02-28 09:58:04 -07001375 return icd_term->dispatch.CreateDisplayModeKHR(phys_dev_term->phys_dev, display, pCreateInfo, pAllocator, pMode);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001376}
1377
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001378LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice,
1379 VkDisplayModeKHR mode, uint32_t planeIndex,
1380 VkDisplayPlaneCapabilitiesKHR *pCapabilities) {
1381 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001382 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -07001383 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001384 VkResult res = disp->GetDisplayPlaneCapabilitiesKHR(unwrapped_phys_dev, mode, planeIndex, pCapabilities);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001385 return res;
1386}
1387
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001388VKAPI_ATTR VkResult VKAPI_CALL terminator_GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode,
1389 uint32_t planeIndex,
1390 VkDisplayPlaneCapabilitiesKHR *pCapabilities) {
Ian Elliott2b8965a2016-03-24 13:59:22 -06001391 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001392 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -06001393 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001394 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -06001395 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001396 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -07001397 "VK_KHR_display extension not enabled. vkGetDisplayPlaneCapabilitiesKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -06001398 return VK_SUCCESS;
1399 }
1400
Mark Young0f183a82017-02-28 09:58:04 -07001401 if (NULL == icd_term->dispatch.GetDisplayPlaneCapabilitiesKHR) {
1402 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1403 "ICD for selected physical device is not exporting vkGetDisplayPlaneCapabilitiesKHR!\n");
1404 assert(false && "loader: null GetDisplayPlaneCapabilitiesKHR ICD pointer");
1405 }
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001406
Mark Young0f183a82017-02-28 09:58:04 -07001407 return icd_term->dispatch.GetDisplayPlaneCapabilitiesKHR(phys_dev_term->phys_dev, mode, planeIndex, pCapabilities);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001408}
1409
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001410LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDisplayPlaneSurfaceKHR(VkInstance instance,
1411 const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
1412 const VkAllocationCallbacks *pAllocator,
1413 VkSurfaceKHR *pSurface) {
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001414 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -07001415 disp = loader_get_instance_layer_dispatch(instance);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001416 VkResult res;
1417
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001418 res = disp->CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001419 return res;
1420}
1421
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001422VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateDisplayPlaneSurfaceKHR(VkInstance instance,
1423 const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
1424 const VkAllocationCallbacks *pAllocator,
1425 VkSurfaceKHR *pSurface) {
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001426 struct loader_instance *inst = loader_get_instance(instance);
Mark Young16573c72016-06-28 10:52:43 -06001427 VkIcdSurface *pIcdSurface = NULL;
Mark Young061ac722016-11-01 19:20:41 -06001428 VkResult vkRes = VK_SUCCESS;
Mark Young49f39db2016-11-02 09:37:08 -06001429 uint32_t i = 0;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001430
Mark Young061ac722016-11-01 19:20:41 -06001431 if (!inst->wsi_display_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001432 loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -07001433 "VK_KHR_surface extension not enabled. vkCreateDisplayPlaneSurfaceKHR not executed!\n");
Mark Young061ac722016-11-01 19:20:41 -06001434 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
1435 goto out;
Petros Bantolas25d27fe2016-04-14 12:50:42 +01001436 }
1437
Piers Daniell5a522602016-12-13 16:51:49 -07001438 // Next, if so, proceed with the implementation of this function:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001439 pIcdSurface = AllocateIcdSurfaceStruct(inst, sizeof(pIcdSurface->display_surf.base), sizeof(pIcdSurface->display_surf));
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001440 if (pIcdSurface == NULL) {
Mark Young061ac722016-11-01 19:20:41 -06001441 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
1442 goto out;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001443 }
1444
Mark Young16573c72016-06-28 10:52:43 -06001445 pIcdSurface->display_surf.base.platform = VK_ICD_WSI_PLATFORM_DISPLAY;
1446 pIcdSurface->display_surf.displayMode = pCreateInfo->displayMode;
1447 pIcdSurface->display_surf.planeIndex = pCreateInfo->planeIndex;
1448 pIcdSurface->display_surf.planeStackIndex = pCreateInfo->planeStackIndex;
1449 pIcdSurface->display_surf.transform = pCreateInfo->transform;
1450 pIcdSurface->display_surf.globalAlpha = pCreateInfo->globalAlpha;
1451 pIcdSurface->display_surf.alphaMode = pCreateInfo->alphaMode;
1452 pIcdSurface->display_surf.imageExtent = pCreateInfo->imageExtent;
1453
Mark Young061ac722016-11-01 19:20:41 -06001454 // Loop through each ICD and determine if they need to create a surface
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001455 for (struct loader_icd_term *icd_term = inst->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
1456 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
Mark Young0f183a82017-02-28 09:58:04 -07001457 if (NULL != icd_term->dispatch.CreateDisplayPlaneSurfaceKHR) {
1458 vkRes = icd_term->dispatch.CreateDisplayPlaneSurfaceKHR(icd_term->instance, pCreateInfo, pAllocator,
1459 &pIcdSurface->real_icd_surfaces[i]);
Mark Young061ac722016-11-01 19:20:41 -06001460 if (VK_SUCCESS != vkRes) {
1461 goto out;
1462 }
1463 }
1464 }
1465 }
1466
Mark Young786fb102016-12-01 10:42:21 -07001467 *pSurface = (VkSurfaceKHR)pIcdSurface;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001468
Mark Young061ac722016-11-01 19:20:41 -06001469out:
1470
1471 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
1472 if (NULL != pIcdSurface->real_icd_surfaces) {
Mark Young49f39db2016-11-02 09:37:08 -06001473 i = 0;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001474 for (struct loader_icd_term *icd_term = inst->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
Mark Young0f183a82017-02-28 09:58:04 -07001475 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
1476 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
Mark Young061ac722016-11-01 19:20:41 -06001477 }
1478 }
1479 loader_instance_heap_free(inst, pIcdSurface->real_icd_surfaces);
1480 }
1481 loader_instance_heap_free(inst, pIcdSurface);
1482 }
1483
1484 return vkRes;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001485}
1486
Mark Young39389872017-01-19 21:10:49 -07001487// EXT_display_swapchain Extension command
1488
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001489LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
1490 const VkSwapchainCreateInfoKHR *pCreateInfos,
1491 const VkAllocationCallbacks *pAllocator,
1492 VkSwapchainKHR *pSwapchains) {
Mark Young5210abc2016-09-08 18:36:32 -06001493 const VkLayerDispatchTable *disp;
1494 disp = loader_get_dispatch(device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001495 return disp->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
Mark Young1a867442016-07-01 15:18:27 -06001496}
1497
Mark Young0f183a82017-02-28 09:58:04 -07001498VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
1499 const VkSwapchainCreateInfoKHR *pCreateInfos,
1500 const VkAllocationCallbacks *pAllocator,
1501 VkSwapchainKHR *pSwapchains) {
Mark Young39389872017-01-19 21:10:49 -07001502 uint32_t icd_index = 0;
1503 struct loader_device *dev;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001504 struct loader_icd_term *icd_term = loader_get_icd_and_device(device, &dev, &icd_index);
Mark Young0f183a82017-02-28 09:58:04 -07001505 if (NULL != icd_term && NULL != icd_term->dispatch.CreateSharedSwapchainsKHR) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001506 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)pCreateInfos->surface;
Mark Young39389872017-01-19 21:10:49 -07001507 if (NULL != icd_surface->real_icd_surfaces) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001508 if ((VkSurfaceKHR)NULL != icd_surface->real_icd_surfaces[icd_index]) {
Mark Young39389872017-01-19 21:10:49 -07001509 // We found the ICD, and there is an ICD KHR surface
1510 // associated with it, so copy the CreateInfo struct
1511 // and point it at the ICD's surface.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001512 VkSwapchainCreateInfoKHR *pCreateCopy = loader_stack_alloc(sizeof(VkSwapchainCreateInfoKHR) * swapchainCount);
Mark Young39389872017-01-19 21:10:49 -07001513 if (NULL == pCreateCopy) {
1514 return VK_ERROR_OUT_OF_HOST_MEMORY;
1515 }
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001516 memcpy(pCreateCopy, pCreateInfos, sizeof(VkSwapchainCreateInfoKHR) * swapchainCount);
Mark Young39389872017-01-19 21:10:49 -07001517 for (uint32_t sc = 0; sc < swapchainCount; sc++) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001518 pCreateCopy[sc].surface = icd_surface->real_icd_surfaces[icd_index];
Mark Young39389872017-01-19 21:10:49 -07001519 }
Mark Young0f183a82017-02-28 09:58:04 -07001520 return icd_term->dispatch.CreateSharedSwapchainsKHR(device, swapchainCount, pCreateCopy, pAllocator, pSwapchains);
Mark Young39389872017-01-19 21:10:49 -07001521 }
1522 }
Mark Young0f183a82017-02-28 09:58:04 -07001523 return icd_term->dispatch.CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
Mark Young39389872017-01-19 21:10:49 -07001524 }
1525 return VK_SUCCESS;
1526}
1527
Lenny Komow82e15e02017-10-02 15:08:53 -06001528// TODO: The following functions need to be added tp GPA:
1529// - vkGetPhysicalDevicePresentRectanglesKHR
1530// - vkGetPhysicalDeviceSurfaceCapabilities2KHR
1531
1532VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDevicePresentRectanglesKHR(
1533 VkPhysicalDevice physicalDevice,
1534 VkSurfaceKHR surface,
1535 uint32_t* pRectCount,
1536 VkRect2D* pRects) {
1537 const VkLayerInstanceDispatchTable *disp;
1538 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
1539 disp = loader_get_instance_layer_dispatch(physicalDevice);
1540 return disp->GetPhysicalDevicePresentRectanglesKHR(unwrapped_phys_dev, surface, pRectCount, pRects);
1541}
1542
1543VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDevicePresentRectanglesKHR(
1544 VkPhysicalDevice physicalDevice,
1545 VkSurfaceKHR surface,
1546 uint32_t* pRectCount,
1547 VkRect2D* pRects) {
1548 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
1549 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
1550 if (NULL == icd_term->dispatch.GetPhysicalDevicePresentRectanglesKHR) {
1551 loader_log(icd_term->this_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1552 "ICD associated with VkPhysicalDevice does not support GetPhysicalDevicePresentRectanglesKHX");
1553 }
1554 VkIcdSurface *icd_surface = (VkIcdSurface *)(surface);
1555 uint8_t icd_index = phys_dev_term->icd_index;
1556 if (NULL != icd_surface->real_icd_surfaces && NULL != (void *)icd_surface->real_icd_surfaces[icd_index]) {
1557 return icd_term->dispatch.GetPhysicalDevicePresentRectanglesKHR(phys_dev_term->phys_dev, icd_surface->real_icd_surfaces[icd_index], pRectCount, pRects);
1558 }
1559 return icd_term->dispatch.GetPhysicalDevicePresentRectanglesKHR(phys_dev_term->phys_dev, surface, pRectCount, pRects);
1560}
1561
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001562bool wsi_swapchain_instance_gpa(struct loader_instance *ptr_instance, const char *name, void **addr) {
Ian Elliott954fa342015-10-30 15:28:23 -06001563 *addr = NULL;
1564
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001565 // Functions for the VK_KHR_surface extension:
Ian Elliott2c05e222015-11-19 13:14:05 -07001566 if (!strcmp("vkDestroySurfaceKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001567 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkDestroySurfaceKHR : NULL;
Ian Elliott2c05e222015-11-19 13:14:05 -07001568 return true;
1569 }
Ian Elliott954fa342015-10-30 15:28:23 -06001570 if (!strcmp("vkGetPhysicalDeviceSurfaceSupportKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001571 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkGetPhysicalDeviceSurfaceSupportKHR : NULL;
Ian Elliott954fa342015-10-30 15:28:23 -06001572 return true;
1573 }
Ian Elliott486c5502015-11-19 16:05:09 -07001574 if (!strcmp("vkGetPhysicalDeviceSurfaceCapabilitiesKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001575 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkGetPhysicalDeviceSurfaceCapabilitiesKHR : NULL;
Ian Elliott486c5502015-11-19 16:05:09 -07001576 return true;
1577 }
1578 if (!strcmp("vkGetPhysicalDeviceSurfaceFormatsKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001579 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkGetPhysicalDeviceSurfaceFormatsKHR : NULL;
Ian Elliott486c5502015-11-19 16:05:09 -07001580 return true;
1581 }
1582 if (!strcmp("vkGetPhysicalDeviceSurfacePresentModesKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001583 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkGetPhysicalDeviceSurfacePresentModesKHR : NULL;
Ian Elliott486c5502015-11-19 16:05:09 -07001584 return true;
1585 }
Ian Elliott934d0d52015-11-19 16:39:21 -07001586
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001587 // Functions for the VK_KHR_swapchain extension:
1588
1589 // Note: This is a device extension, and its functions are statically
1590 // exported from the loader. Per Khronos decisions, the loader's GIPA
1591 // function will return the trampoline function for such device-extension
1592 // functions, regardless of whether the extension has been enabled.
Ian Elliott934d0d52015-11-19 16:39:21 -07001593 if (!strcmp("vkCreateSwapchainKHR", name)) {
Jon Ashburn23d36b12016-02-02 17:47:28 -07001594 *addr = (void *)vkCreateSwapchainKHR;
Ian Elliott934d0d52015-11-19 16:39:21 -07001595 return true;
1596 }
1597 if (!strcmp("vkDestroySwapchainKHR", name)) {
Jon Ashburn23d36b12016-02-02 17:47:28 -07001598 *addr = (void *)vkDestroySwapchainKHR;
Ian Elliott934d0d52015-11-19 16:39:21 -07001599 return true;
1600 }
1601 if (!strcmp("vkGetSwapchainImagesKHR", name)) {
Jon Ashburn23d36b12016-02-02 17:47:28 -07001602 *addr = (void *)vkGetSwapchainImagesKHR;
Ian Elliott934d0d52015-11-19 16:39:21 -07001603 return true;
1604 }
1605 if (!strcmp("vkAcquireNextImageKHR", name)) {
Jon Ashburn23d36b12016-02-02 17:47:28 -07001606 *addr = (void *)vkAcquireNextImageKHR;
Ian Elliott934d0d52015-11-19 16:39:21 -07001607 return true;
1608 }
1609 if (!strcmp("vkQueuePresentKHR", name)) {
Jon Ashburn23d36b12016-02-02 17:47:28 -07001610 *addr = (void *)vkQueuePresentKHR;
Ian Elliott934d0d52015-11-19 16:39:21 -07001611 return true;
1612 }
1613
Ian Elliott2c05e222015-11-19 13:14:05 -07001614#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001615
1616 // Functions for the VK_KHR_win32_surface extension:
Ian Elliott2c05e222015-11-19 13:14:05 -07001617 if (!strcmp("vkCreateWin32SurfaceKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001618 *addr = ptr_instance->wsi_win32_surface_enabled ? (void *)vkCreateWin32SurfaceKHR : NULL;
Ian Elliott2c05e222015-11-19 13:14:05 -07001619 return true;
1620 }
Ian Elliott919fa302015-11-24 15:39:10 -07001621 if (!strcmp("vkGetPhysicalDeviceWin32PresentationSupportKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001622 *addr = ptr_instance->wsi_win32_surface_enabled ? (void *)vkGetPhysicalDeviceWin32PresentationSupportKHR : NULL;
Ian Elliott919fa302015-11-24 15:39:10 -07001623 return true;
1624 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001625#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -07001626#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001627
1628 // Functions for the VK_KHR_mir_surface extension:
Ian Elliott2c05e222015-11-19 13:14:05 -07001629 if (!strcmp("vkCreateMirSurfaceKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001630 *addr = ptr_instance->wsi_mir_surface_enabled ? (void *)vkCreateMirSurfaceKHR : NULL;
Ian Elliott2c05e222015-11-19 13:14:05 -07001631 return true;
1632 }
Ian Elliott919fa302015-11-24 15:39:10 -07001633 if (!strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001634 *addr = ptr_instance->wsi_mir_surface_enabled ? (void *)vkGetPhysicalDeviceMirPresentationSupportKHR : NULL;
Ian Elliott919fa302015-11-24 15:39:10 -07001635 return true;
Jason Ekstranda5ebe8a2016-02-12 17:25:03 -08001636 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001637#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -07001638#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001639
1640 // Functions for the VK_KHR_wayland_surface extension:
Jon Ashburn1530c342016-02-26 13:14:27 -07001641 if (!strcmp("vkCreateWaylandSurfaceKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001642 *addr = ptr_instance->wsi_wayland_surface_enabled ? (void *)vkCreateWaylandSurfaceKHR : NULL;
Jon Ashburn1530c342016-02-26 13:14:27 -07001643 return true;
1644 }
1645 if (!strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001646 *addr = ptr_instance->wsi_wayland_surface_enabled ? (void *)vkGetPhysicalDeviceWaylandPresentationSupportKHR : NULL;
Jon Ashburn1530c342016-02-26 13:14:27 -07001647 return true;
1648 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001649#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -07001650#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001651
1652 // Functions for the VK_KHR_xcb_surface extension:
Jon Ashburn1530c342016-02-26 13:14:27 -07001653 if (!strcmp("vkCreateXcbSurfaceKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001654 *addr = ptr_instance->wsi_xcb_surface_enabled ? (void *)vkCreateXcbSurfaceKHR : NULL;
Jon Ashburn1530c342016-02-26 13:14:27 -07001655 return true;
1656 }
1657 if (!strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001658 *addr = ptr_instance->wsi_xcb_surface_enabled ? (void *)vkGetPhysicalDeviceXcbPresentationSupportKHR : NULL;
Jon Ashburn1530c342016-02-26 13:14:27 -07001659 return true;
1660 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001661#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -07001662#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001663
1664 // Functions for the VK_KHR_xlib_surface extension:
Jon Ashburn1530c342016-02-26 13:14:27 -07001665 if (!strcmp("vkCreateXlibSurfaceKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001666 *addr = ptr_instance->wsi_xlib_surface_enabled ? (void *)vkCreateXlibSurfaceKHR : NULL;
Jon Ashburn1530c342016-02-26 13:14:27 -07001667 return true;
1668 }
1669 if (!strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001670 *addr = ptr_instance->wsi_xlib_surface_enabled ? (void *)vkGetPhysicalDeviceXlibPresentationSupportKHR : NULL;
Jon Ashburn1530c342016-02-26 13:14:27 -07001671 return true;
1672 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001673#endif // VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -07001674#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001675
1676 // Functions for the VK_KHR_android_surface extension:
Jon Ashburn1530c342016-02-26 13:14:27 -07001677 if (!strcmp("vkCreateAndroidSurfaceKHR", name)) {
Karl Schultz2e5ed332017-12-12 10:33:01 -05001678 *addr = ptr_instance->wsi_android_surface_enabled ? (void *)vkCreateAndroidSurfaceKHR : NULL;
Jon Ashburn1530c342016-02-26 13:14:27 -07001679 return true;
1680 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001681#endif // VK_USE_PLATFORM_ANDROID_KHR
Karl Schultz2e5ed332017-12-12 10:33:01 -05001682#ifdef VK_USE_PLATFORM_MACOS_MVK
1683
1684 // Functions for the VK_MVK_macos_surface extension:
1685 if (!strcmp("vkCreateMacOSSurfaceMVK", name)) {
1686 *addr = ptr_instance->wsi_macos_surface_enabled ? (void *)vkCreateMacOSSurfaceMVK : NULL;
1687 return true;
1688 }
1689#endif // VK_USE_PLATFORM_MACOS_MVK
1690#ifdef VK_USE_PLATFORM_IOS_MVK
1691
1692 // Functions for the VK_MVK_ios_surface extension:
1693 if (!strcmp("vkCreateIOSSurfaceMVK", name)) {
1694 *addr = ptr_instance->wsi_ios_surface_enabled ? (void *)vkCreateIOSSurfaceMVK : NULL;
1695 return true;
1696 }
1697#endif // VK_USE_PLATFORM_IOS_MVK
Ian Elliott2c05e222015-11-19 13:14:05 -07001698
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001699 // Functions for VK_KHR_display extension:
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001700 if (!strcmp("vkGetPhysicalDeviceDisplayPropertiesKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001701 *addr = ptr_instance->wsi_display_enabled ? (void *)vkGetPhysicalDeviceDisplayPropertiesKHR : NULL;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001702 return true;
1703 }
1704 if (!strcmp("vkGetPhysicalDeviceDisplayPlanePropertiesKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001705 *addr = ptr_instance->wsi_display_enabled ? (void *)vkGetPhysicalDeviceDisplayPlanePropertiesKHR : NULL;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001706 return true;
1707 }
1708 if (!strcmp("vkGetDisplayPlaneSupportedDisplaysKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001709 *addr = ptr_instance->wsi_display_enabled ? (void *)vkGetDisplayPlaneSupportedDisplaysKHR : NULL;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001710 return true;
1711 }
1712 if (!strcmp("vkGetDisplayModePropertiesKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001713 *addr = ptr_instance->wsi_display_enabled ? (void *)vkGetDisplayModePropertiesKHR : NULL;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001714 return true;
1715 }
1716 if (!strcmp("vkCreateDisplayModeKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001717 *addr = ptr_instance->wsi_display_enabled ? (void *)vkCreateDisplayModeKHR : NULL;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001718 return true;
1719 }
1720 if (!strcmp("vkGetDisplayPlaneCapabilitiesKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001721 *addr = ptr_instance->wsi_display_enabled ? (void *)vkGetDisplayPlaneCapabilitiesKHR : NULL;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001722 return true;
1723 }
1724 if (!strcmp("vkCreateDisplayPlaneSurfaceKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001725 *addr = ptr_instance->wsi_display_enabled ? (void *)vkCreateDisplayPlaneSurfaceKHR : NULL;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001726 return true;
1727 }
Mark Young1a867442016-07-01 15:18:27 -06001728
1729 // Functions for KHR_display_swapchain extension:
1730 if (!strcmp("vkCreateSharedSwapchainsKHR", name)) {
1731 *addr = (void *)vkCreateSharedSwapchainsKHR;
1732 return true;
1733 }
1734
Jon Ashburn1530c342016-02-26 13:14:27 -07001735 return false;
Ian Elliott2b8965a2016-03-24 13:59:22 -06001736}