blob: 131ca51842b069f0576f1368384a5c8ba74d73c9 [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
Ian Elliott954fa342015-10-30 15:28:23 -060058
Jon Ashburnc7d3e732016-03-08 09:30:30 -070059 ptr_instance->wsi_display_enabled = false;
60
Jon Ashburnf19916e2016-01-11 13:12:43 -070061 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070062 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
Ian Elliott954fa342015-10-30 15:28:23 -060063 ptr_instance->wsi_surface_enabled = true;
Ian Elliottc2e9aee2015-11-19 11:58:08 -070064 continue;
Ian Elliott954fa342015-10-30 15:28:23 -060065 }
Ian Elliottc2e9aee2015-11-19 11:58:08 -070066#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070067 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
Ian Elliottdb4300a2015-11-23 10:17:23 -070068 ptr_instance->wsi_win32_surface_enabled = true;
Ian Elliottc2e9aee2015-11-19 11:58:08 -070069 continue;
Ian Elliott954fa342015-10-30 15:28:23 -060070 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070071#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliottaf7d6362015-10-30 17:45:05 -060072#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070073 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
Ian Elliott954fa342015-10-30 15:28:23 -060074 ptr_instance->wsi_mir_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_MIR_KHR
Ian Elliottaf7d6362015-10-30 17:45:05 -060078#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070079 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
Ian Elliott954fa342015-10-30 15:28:23 -060080 ptr_instance->wsi_wayland_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_WAYLAND_KHR
Ian Elliottaf7d6362015-10-30 17:45:05 -060084#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070085 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
Ian Elliott954fa342015-10-30 15:28:23 -060086 ptr_instance->wsi_xcb_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_XCB_KHR
Ian Elliottaf7d6362015-10-30 17:45:05 -060090#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070091 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
Ian Elliott954fa342015-10-30 15:28:23 -060092 ptr_instance->wsi_xlib_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_XLIB_KHR
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -070096#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070097 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -070098 ptr_instance->wsi_android_surface_enabled = true;
99 continue;
100 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700101#endif // VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700102 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
Jon Ashburnc7d3e732016-03-08 09:30:30 -0700103 ptr_instance->wsi_display_enabled = true;
104 continue;
105 }
Ian Elliott954fa342015-10-30 15:28:23 -0600106 }
107}
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600108
109// Linux WSI surface extensions are not always compiled into the loader. (Assume
110// for Windows the KHR_win32_surface is always compiled into loader). A given
111// Linux build environment might not have the headers required for building one
112// of the four extensions (Xlib, Xcb, Mir, Wayland). Thus, need to check if
113// the built loader actually supports the particular Linux surface extension.
114// If not supported by the built loader it will not be included in the list of
115// enumerated instance extensions. This solves the issue where an ICD or layer
116// advertises support for a given Linux surface extension but the loader was not
117// built to support the extension.
Jon Ashburn6fa520f2016-03-25 12:49:35 -0600118bool wsi_unsupported_instance_extension(const VkExtensionProperties *ext_prop) {
119#ifndef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700120 if (!strcmp(ext_prop->extensionName, "VK_KHR_mir_surface")) return true;
121#endif // VK_USE_PLATFORM_MIR_KHR
Jon Ashburn6fa520f2016-03-25 12:49:35 -0600122#ifndef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700123 if (!strcmp(ext_prop->extensionName, "VK_KHR_wayland_surface")) return true;
124#endif // VK_USE_PLATFORM_WAYLAND_KHR
Jon Ashburn6fa520f2016-03-25 12:49:35 -0600125#ifndef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700126 if (!strcmp(ext_prop->extensionName, "VK_KHR_xcb_surface")) return true;
127#endif // VK_USE_PLATFORM_XCB_KHR
Jon Ashburn6fa520f2016-03-25 12:49:35 -0600128#ifndef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700129 if (!strcmp(ext_prop->extensionName, "VK_KHR_xlib_surface")) return true;
130#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott954fa342015-10-30 15:28:23 -0600131
Jon Ashburn6fa520f2016-03-25 12:49:35 -0600132 return false;
133}
Ian Elliott2c05e222015-11-19 13:14:05 -0700134
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600135// Functions for the VK_KHR_surface extension:
136
137// This is the trampoline entrypoint for DestroySurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700138LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface,
139 const VkAllocationCallbacks *pAllocator) {
Ian Elliottfb42cd72015-11-25 14:43:02 -0700140 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700141 disp = loader_get_instance_layer_dispatch(instance);
Ian Elliottfb42cd72015-11-25 14:43:02 -0700142 disp->DestroySurfaceKHR(instance, surface, pAllocator);
143}
144
Jon Ashburnc7d3e732016-03-08 09:30:30 -0700145// TODO probably need to lock around all the loader_get_instance() calls.
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600146
147// This is the instance chain terminator function for DestroySurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700148VKAPI_ATTR void VKAPI_CALL terminator_DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface,
149 const VkAllocationCallbacks *pAllocator) {
Ian Elliottdb4300a2015-11-23 10:17:23 -0700150 struct loader_instance *ptr_instance = loader_get_instance(instance);
151
Karl Schultz94971292016-11-19 09:02:27 -0700152 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)surface;
Mark Young4a62fa32016-10-17 12:27:36 -0600153 if (NULL != icd_surface) {
154 if (NULL != icd_surface->real_icd_surfaces) {
Mark Young49f39db2016-11-02 09:37:08 -0600155 uint32_t i = 0;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700156 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
157 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
Mark Young0f183a82017-02-28 09:58:04 -0700158 if (NULL != icd_term->dispatch.DestroySurfaceKHR && (VkSurfaceKHR)NULL != icd_surface->real_icd_surfaces[i]) {
159 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, icd_surface->real_icd_surfaces[i], pAllocator);
Mark Young786fb102016-12-01 10:42:21 -0700160 icd_surface->real_icd_surfaces[i] = (VkSurfaceKHR)NULL;
Mark Young4a62fa32016-10-17 12:27:36 -0600161 }
162 } else {
163 // The real_icd_surface for any ICD not supporting the
164 // proper interface version should be NULL. If not, then
165 // we have a problem.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700166 assert((VkSurfaceKHR)NULL == icd_surface->real_icd_surfaces[i]);
Mark Young16573c72016-06-28 10:52:43 -0600167 }
Mark Young16573c72016-06-28 10:52:43 -0600168 }
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700169 loader_instance_heap_free(ptr_instance, icd_surface->real_icd_surfaces);
Mark Young16573c72016-06-28 10:52:43 -0600170 }
Mark Young16573c72016-06-28 10:52:43 -0600171
Karl Schultz94971292016-11-19 09:02:27 -0700172 loader_instance_heap_free(ptr_instance, (void *)(uintptr_t)surface);
Mark Young4a62fa32016-10-17 12:27:36 -0600173 }
Ian Elliott2c05e222015-11-19 13:14:05 -0700174}
175
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600176// This is the trampoline entrypoint for GetPhysicalDeviceSurfaceSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700177LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
178 uint32_t queueFamilyIndex, VkSurfaceKHR surface,
179 VkBool32 *pSupported) {
Ian Elliott954fa342015-10-30 15:28:23 -0600180 const VkLayerInstanceDispatchTable *disp;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700181 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Mark Young39389872017-01-19 21:10:49 -0700182 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700183 VkResult res = disp->GetPhysicalDeviceSurfaceSupportKHR(unwrapped_phys_dev, queueFamilyIndex, surface, pSupported);
Ian Elliott954fa342015-10-30 15:28:23 -0600184 return res;
185}
186
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600187// This is the instance chain terminator function for
188// GetPhysicalDeviceSurfaceSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700189VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
190 uint32_t queueFamilyIndex, VkSurfaceKHR surface,
191 VkBool32 *pSupported) {
Ian Elliott2b8965a2016-03-24 13:59:22 -0600192 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700193 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -0600194 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700195 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600196 if (!ptr_instance->wsi_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700197 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700198 "VK_KHR_surface extension not enabled. vkGetPhysicalDeviceSurfaceSupportKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -0600199 return VK_SUCCESS;
200 }
201
Mark Young0f183a82017-02-28 09:58:04 -0700202 if (NULL == pSupported) {
203 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
204 "NULL pointer passed into vkGetPhysicalDeviceSurfaceSupportKHR for pSupported!\n");
205 assert(false && "GetPhysicalDeviceSurfaceSupportKHR: Error, null pSupported");
206 }
Ian Elliott954fa342015-10-30 15:28:23 -0600207 *pSupported = false;
208
Mark Young0f183a82017-02-28 09:58:04 -0700209 if (NULL == icd_term->dispatch.GetPhysicalDeviceSurfaceSupportKHR) {
210 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
211 "ICD for selected physical device is not exporting vkGetPhysicalDeviceSurfaceSupportKHR!\n");
212 assert(false && "loader: null GetPhysicalDeviceSurfaceSupportKHR ICD pointer");
213 }
Ian Elliott954fa342015-10-30 15:28:23 -0600214
Karl Schultz94971292016-11-19 09:02:27 -0700215 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)surface;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700216 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 -0700217 return icd_term->dispatch.GetPhysicalDeviceSurfaceSupportKHR(
218 phys_dev_term->phys_dev, queueFamilyIndex, icd_surface->real_icd_surfaces[phys_dev_term->icd_index], pSupported);
Mark Young16573c72016-06-28 10:52:43 -0600219 }
Mark Young16573c72016-06-28 10:52:43 -0600220
Mark Young0f183a82017-02-28 09:58:04 -0700221 return icd_term->dispatch.GetPhysicalDeviceSurfaceSupportKHR(phys_dev_term->phys_dev, queueFamilyIndex, surface, pSupported);
Ian Elliott954fa342015-10-30 15:28:23 -0600222}
223
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600224// This is the trampoline entrypoint for GetPhysicalDeviceSurfaceCapabilitiesKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700225LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
226 VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
Ian Elliott486c5502015-11-19 16:05:09 -0700227 const VkLayerInstanceDispatchTable *disp;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700228 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Mark Young39389872017-01-19 21:10:49 -0700229 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700230 VkResult res = disp->GetPhysicalDeviceSurfaceCapabilitiesKHR(unwrapped_phys_dev, surface, pSurfaceCapabilities);
Ian Elliott486c5502015-11-19 16:05:09 -0700231 return res;
232}
233
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600234// This is the instance chain terminator function for
235// GetPhysicalDeviceSurfaceCapabilitiesKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700236VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice,
237 VkSurfaceKHR surface,
238 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
Ian Elliott2b8965a2016-03-24 13:59:22 -0600239 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700240 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -0600241 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700242 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600243 if (!ptr_instance->wsi_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700244 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700245 "VK_KHR_surface extension not enabled. vkGetPhysicalDeviceSurfaceCapabilitiesKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -0600246 return VK_SUCCESS;
247 }
248
Mark Young0f183a82017-02-28 09:58:04 -0700249 if (NULL == pSurfaceCapabilities) {
250 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
251 "NULL pointer passed into vkGetPhysicalDeviceSurfaceCapabilitiesKHR for pSurfaceCapabilities!\n");
252 assert(false && "GetPhysicalDeviceSurfaceCapabilitiesKHR: Error, null pSurfaceCapabilities");
253 }
Ian Elliott486c5502015-11-19 16:05:09 -0700254
Mark Young0f183a82017-02-28 09:58:04 -0700255 if (NULL == icd_term->dispatch.GetPhysicalDeviceSurfaceCapabilitiesKHR) {
256 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
257 "ICD for selected physical device is not exporting vkGetPhysicalDeviceSurfaceCapabilitiesKHR!\n");
258 assert(false && "loader: null GetPhysicalDeviceSurfaceCapabilitiesKHR ICD pointer");
259 }
Ian Elliott486c5502015-11-19 16:05:09 -0700260
Karl Schultz94971292016-11-19 09:02:27 -0700261 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)surface;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700262 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 -0700263 return icd_term->dispatch.GetPhysicalDeviceSurfaceCapabilitiesKHR(
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700264 phys_dev_term->phys_dev, icd_surface->real_icd_surfaces[phys_dev_term->icd_index], pSurfaceCapabilities);
Mark Young16573c72016-06-28 10:52:43 -0600265 }
Mark Young16573c72016-06-28 10:52:43 -0600266
Mark Young0f183a82017-02-28 09:58:04 -0700267 return icd_term->dispatch.GetPhysicalDeviceSurfaceCapabilitiesKHR(phys_dev_term->phys_dev, surface, pSurfaceCapabilities);
Ian Elliott486c5502015-11-19 16:05:09 -0700268}
269
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600270// This is the trampoline entrypoint for GetPhysicalDeviceSurfaceFormatsKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700271LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice,
272 VkSurfaceKHR surface,
273 uint32_t *pSurfaceFormatCount,
274 VkSurfaceFormatKHR *pSurfaceFormats) {
275 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Ian Elliott486c5502015-11-19 16:05:09 -0700276 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700277 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700278 VkResult res = disp->GetPhysicalDeviceSurfaceFormatsKHR(unwrapped_phys_dev, surface, pSurfaceFormatCount, pSurfaceFormats);
Ian Elliott486c5502015-11-19 16:05:09 -0700279 return res;
280}
281
Mark Young49f39db2016-11-02 09:37:08 -0600282// This is the instance chain terminator function for
283// GetPhysicalDeviceSurfaceFormatsKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700284VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
285 uint32_t *pSurfaceFormatCount,
286 VkSurfaceFormatKHR *pSurfaceFormats) {
Ian Elliott2b8965a2016-03-24 13:59:22 -0600287 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700288 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -0600289 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700290 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600291 if (!ptr_instance->wsi_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700292 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700293 "VK_KHR_surface extension not enabled. vkGetPhysicalDeviceSurfaceFormatsKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -0600294 return VK_SUCCESS;
295 }
296
Mark Young0f183a82017-02-28 09:58:04 -0700297 if (NULL == pSurfaceFormatCount) {
298 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
299 "NULL pointer passed into vkGetPhysicalDeviceSurfaceFormatsKHR for pSurfaceFormatCount!\n");
300 assert(false && "GetPhysicalDeviceSurfaceFormatsKHR(: Error, null pSurfaceFormatCount");
301 }
Ian Elliott486c5502015-11-19 16:05:09 -0700302
Mark Young0f183a82017-02-28 09:58:04 -0700303 if (NULL == icd_term->dispatch.GetPhysicalDeviceSurfaceFormatsKHR) {
304 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
305 "ICD for selected physical device is not exporting vkGetPhysicalDeviceSurfaceCapabilitiesKHR!\n");
306 assert(false && "loader: null GetPhysicalDeviceSurfaceFormatsKHR ICD pointer");
307 }
Ian Elliott486c5502015-11-19 16:05:09 -0700308
Karl Schultz94971292016-11-19 09:02:27 -0700309 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)surface;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700310 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 -0700311 return icd_term->dispatch.GetPhysicalDeviceSurfaceFormatsKHR(phys_dev_term->phys_dev,
312 icd_surface->real_icd_surfaces[phys_dev_term->icd_index],
313 pSurfaceFormatCount, pSurfaceFormats);
Mark Young16573c72016-06-28 10:52:43 -0600314 }
Mark Young16573c72016-06-28 10:52:43 -0600315
Mark Young0f183a82017-02-28 09:58:04 -0700316 return icd_term->dispatch.GetPhysicalDeviceSurfaceFormatsKHR(phys_dev_term->phys_dev, surface, pSurfaceFormatCount,
317 pSurfaceFormats);
Ian Elliott486c5502015-11-19 16:05:09 -0700318}
319
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600320// This is the trampoline entrypoint for GetPhysicalDeviceSurfacePresentModesKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700321LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice,
322 VkSurfaceKHR surface,
323 uint32_t *pPresentModeCount,
324 VkPresentModeKHR *pPresentModes) {
325 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Ian Elliott486c5502015-11-19 16:05:09 -0700326 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700327 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700328 VkResult res = disp->GetPhysicalDeviceSurfacePresentModesKHR(unwrapped_phys_dev, surface, pPresentModeCount, pPresentModes);
Ian Elliott486c5502015-11-19 16:05:09 -0700329 return res;
330}
331
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600332// This is the instance chain terminator function for
333// GetPhysicalDeviceSurfacePresentModesKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700334VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice,
335 VkSurfaceKHR surface, uint32_t *pPresentModeCount,
336 VkPresentModeKHR *pPresentModes) {
Ian Elliott2b8965a2016-03-24 13:59:22 -0600337 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700338 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -0600339 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700340 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600341 if (!ptr_instance->wsi_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700342 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700343 "VK_KHR_surface extension not enabled. vkGetPhysicalDeviceSurfacePresentModesKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -0600344 return VK_SUCCESS;
345 }
346
Mark Young0f183a82017-02-28 09:58:04 -0700347 if (NULL == pPresentModeCount) {
348 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
349 "NULL pointer passed into vkGetPhysicalDeviceSurfacePresentModesKHR for pPresentModeCount!\n");
350 assert(false && "GetPhysicalDeviceSurfacePresentModesKHR(: Error, null pPresentModeCount");
351 }
Ian Elliott486c5502015-11-19 16:05:09 -0700352
Mark Young0f183a82017-02-28 09:58:04 -0700353 if (NULL == icd_term->dispatch.GetPhysicalDeviceSurfacePresentModesKHR) {
354 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
355 "ICD for selected physical device is not exporting vkGetPhysicalDeviceSurfacePresentModesKHR!\n");
356 assert(false && "loader: null GetPhysicalDeviceSurfacePresentModesKHR ICD pointer");
357 }
Ian Elliott486c5502015-11-19 16:05:09 -0700358
Karl Schultz94971292016-11-19 09:02:27 -0700359 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)surface;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700360 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 -0700361 return icd_term->dispatch.GetPhysicalDeviceSurfacePresentModesKHR(
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700362 phys_dev_term->phys_dev, icd_surface->real_icd_surfaces[phys_dev_term->icd_index], pPresentModeCount, pPresentModes);
Mark Young16573c72016-06-28 10:52:43 -0600363 }
Mark Young16573c72016-06-28 10:52:43 -0600364
Mark Young0f183a82017-02-28 09:58:04 -0700365 return icd_term->dispatch.GetPhysicalDeviceSurfacePresentModesKHR(phys_dev_term->phys_dev, surface, pPresentModeCount,
366 pPresentModes);
Ian Elliott486c5502015-11-19 16:05:09 -0700367}
368
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600369// Functions for the VK_KHR_swapchain extension:
Ian Elliott2c05e222015-11-19 13:14:05 -0700370
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600371// This is the trampoline entrypoint for CreateSwapchainKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700372LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
373 const VkAllocationCallbacks *pAllocator,
374 VkSwapchainKHR *pSwapchain) {
Ian Elliott934d0d52015-11-19 16:39:21 -0700375 const VkLayerDispatchTable *disp;
376 disp = loader_get_dispatch(device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700377 return disp->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
Ian Elliott934d0d52015-11-19 16:39:21 -0700378}
Ian Elliott2c05e222015-11-19 13:14:05 -0700379
Mark Young0f183a82017-02-28 09:58:04 -0700380VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
381 const VkAllocationCallbacks *pAllocator,
382 VkSwapchainKHR *pSwapchain) {
Mark Young16573c72016-06-28 10:52:43 -0600383 uint32_t icd_index = 0;
384 struct loader_device *dev;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700385 struct loader_icd_term *icd_term = loader_get_icd_and_device(device, &dev, &icd_index);
Mark Young0f183a82017-02-28 09:58:04 -0700386 if (NULL != icd_term && NULL != icd_term->dispatch.CreateSwapchainKHR) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700387 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)pCreateInfo->surface;
Mark Young16573c72016-06-28 10:52:43 -0600388 if (NULL != icd_surface->real_icd_surfaces) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700389 if ((VkSurfaceKHR)NULL != icd_surface->real_icd_surfaces[icd_index]) {
Mark Young16573c72016-06-28 10:52:43 -0600390 // We found the ICD, and there is an ICD KHR surface
391 // associated with it, so copy the CreateInfo struct
392 // and point it at the ICD's surface.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700393 VkSwapchainCreateInfoKHR *pCreateCopy = loader_stack_alloc(sizeof(VkSwapchainCreateInfoKHR));
Mark Young16573c72016-06-28 10:52:43 -0600394 if (NULL == pCreateCopy) {
395 return VK_ERROR_OUT_OF_HOST_MEMORY;
396 }
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700397 memcpy(pCreateCopy, pCreateInfo, sizeof(VkSwapchainCreateInfoKHR));
398 pCreateCopy->surface = icd_surface->real_icd_surfaces[icd_index];
Mark Young0f183a82017-02-28 09:58:04 -0700399 return icd_term->dispatch.CreateSwapchainKHR(device, pCreateCopy, pAllocator, pSwapchain);
Mark Young16573c72016-06-28 10:52:43 -0600400 }
401 }
Mark Young0f183a82017-02-28 09:58:04 -0700402 return icd_term->dispatch.CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
Mark Young16573c72016-06-28 10:52:43 -0600403 }
404 return VK_SUCCESS;
405}
406
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600407// This is the trampoline entrypoint for DestroySwapchainKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700408LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain,
409 const VkAllocationCallbacks *pAllocator) {
Ian Elliott934d0d52015-11-19 16:39:21 -0700410 const VkLayerDispatchTable *disp;
411 disp = loader_get_dispatch(device);
412 disp->DestroySwapchainKHR(device, swapchain, pAllocator);
413}
Ian Elliott2c05e222015-11-19 13:14:05 -0700414
Mark Young0f183a82017-02-28 09:58:04 -0700415// This is the trampoline entrypoint for GetSwapchainImagesKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700416LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain,
417 uint32_t *pSwapchainImageCount, VkImage *pSwapchainImages) {
Ian Elliott934d0d52015-11-19 16:39:21 -0700418 const VkLayerDispatchTable *disp;
419 disp = loader_get_dispatch(device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700420 return disp->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
Ian Elliott934d0d52015-11-19 16:39:21 -0700421}
422
Mark Young0f183a82017-02-28 09:58:04 -0700423// This is the trampoline entrypoint for AcquireNextImageKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700424LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
425 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Ian Elliott934d0d52015-11-19 16:39:21 -0700426 const VkLayerDispatchTable *disp;
427 disp = loader_get_dispatch(device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700428 return disp->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Ian Elliott934d0d52015-11-19 16:39:21 -0700429}
430
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600431// This is the trampoline entrypoint for QueuePresentKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700432LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
Ian Elliott934d0d52015-11-19 16:39:21 -0700433 const VkLayerDispatchTable *disp;
434 disp = loader_get_dispatch(queue);
Mark Youngead9b932016-09-08 12:28:38 -0600435 return disp->QueuePresentKHR(queue, pPresentInfo);
Ian Elliott934d0d52015-11-19 16:39:21 -0700436}
Ian Elliott2c05e222015-11-19 13:14:05 -0700437
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700438static VkIcdSurface *AllocateIcdSurfaceStruct(struct loader_instance *instance, size_t base_size, size_t platform_size) {
Mark Younga7c51fd2016-09-16 10:18:42 -0600439 // Next, if so, proceed with the implementation of this function:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700440 VkIcdSurface *pIcdSurface = loader_instance_heap_alloc(instance, sizeof(VkIcdSurface), VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
Mark Younga7c51fd2016-09-16 10:18:42 -0600441 if (pIcdSurface != NULL) {
442 // Setup the new sizes and offsets so we can grow the structures in the
443 // future without having problems
444 pIcdSurface->base_size = (uint32_t)base_size;
445 pIcdSurface->platform_size = (uint32_t)platform_size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700446 pIcdSurface->non_platform_offset = (uint32_t)((uint8_t *)(&pIcdSurface->base_size) - (uint8_t *)pIcdSurface);
Mark Younga7c51fd2016-09-16 10:18:42 -0600447 pIcdSurface->entire_size = sizeof(VkIcdSurface);
448
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700449 pIcdSurface->real_icd_surfaces = loader_instance_heap_alloc(instance, sizeof(VkSurfaceKHR) * instance->total_icd_count,
450 VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
Mark Younga60f1342016-12-13 17:19:32 -0700451 if (pIcdSurface->real_icd_surfaces == NULL) {
452 loader_instance_heap_free(instance, pIcdSurface);
453 pIcdSurface = NULL;
Mark Younga7c51fd2016-09-16 10:18:42 -0600454 } else {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700455 memset(pIcdSurface->real_icd_surfaces, 0, sizeof(VkSurfaceKHR) * instance->total_icd_count);
Mark Younga7c51fd2016-09-16 10:18:42 -0600456 }
457 }
458 return pIcdSurface;
459}
460
Ian Elliott2c05e222015-11-19 13:14:05 -0700461#ifdef VK_USE_PLATFORM_WIN32_KHR
462
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600463// Functions for the VK_KHR_win32_surface extension:
464
465// This is the trampoline entrypoint for CreateWin32SurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700466LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateWin32SurfaceKHR(VkInstance instance,
467 const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
468 const VkAllocationCallbacks *pAllocator,
469 VkSurfaceKHR *pSurface) {
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700470 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700471 disp = loader_get_instance_layer_dispatch(instance);
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700472 VkResult res;
473
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700474 res = disp->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700475 return res;
476}
477
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600478// This is the instance chain terminator function for CreateWin32SurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700479VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
480 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Young16573c72016-06-28 10:52:43 -0600481 VkResult vkRes = VK_SUCCESS;
Mark Youngad46cec2016-10-12 14:18:44 -0600482 VkIcdSurface *pIcdSurface = NULL;
Mark Young49f39db2016-11-02 09:37:08 -0600483 uint32_t i = 0;
484
Mark Younga7c51fd2016-09-16 10:18:42 -0600485 // Initialize pSurface to NULL just to be safe.
486 *pSurface = VK_NULL_HANDLE;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600487 // First, check to ensure the appropriate extension was enabled:
Ian Elliottdb4300a2015-11-23 10:17:23 -0700488 struct loader_instance *ptr_instance = loader_get_instance(instance);
Ian Elliott2b8965a2016-03-24 13:59:22 -0600489 if (!ptr_instance->wsi_win32_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700490 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700491 "VK_KHR_win32_surface extension not enabled. vkCreateWin32SurfaceKHR not executed!\n");
Mark Young16573c72016-06-28 10:52:43 -0600492 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
493 goto out;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600494 }
495
496 // Next, if so, proceed with the implementation of this function:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700497 pIcdSurface = AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->win_surf.base), sizeof(pIcdSurface->win_surf));
Ian Elliott2c05e222015-11-19 13:14:05 -0700498 if (pIcdSurface == NULL) {
Mark Young16573c72016-06-28 10:52:43 -0600499 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
500 goto out;
Ian Elliott2c05e222015-11-19 13:14:05 -0700501 }
502
Mark Young16573c72016-06-28 10:52:43 -0600503 pIcdSurface->win_surf.base.platform = VK_ICD_WSI_PLATFORM_WIN32;
504 pIcdSurface->win_surf.hinstance = pCreateInfo->hinstance;
505 pIcdSurface->win_surf.hwnd = pCreateInfo->hwnd;
Ian Elliott2c05e222015-11-19 13:14:05 -0700506
Mark Young16573c72016-06-28 10:52:43 -0600507 // Loop through each ICD and determine if they need to create a surface
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700508 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
509 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
Mark Young0f183a82017-02-28 09:58:04 -0700510 if (NULL != icd_term->dispatch.CreateWin32SurfaceKHR) {
511 vkRes = icd_term->dispatch.CreateWin32SurfaceKHR(icd_term->instance, pCreateInfo, pAllocator,
512 &pIcdSurface->real_icd_surfaces[i]);
Mark Young16573c72016-06-28 10:52:43 -0600513 if (VK_SUCCESS != vkRes) {
514 goto out;
515 }
516 }
517 }
518 }
519
520 *pSurface = (VkSurfaceKHR)(pIcdSurface);
521
522out:
523
524 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
525 if (NULL != pIcdSurface->real_icd_surfaces) {
Mark Young49f39db2016-11-02 09:37:08 -0600526 i = 0;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700527 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 -0700528 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
529 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
Mark Young16573c72016-06-28 10:52:43 -0600530 }
531 }
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700532 loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces);
Mark Young16573c72016-06-28 10:52:43 -0600533 }
534 loader_instance_heap_free(ptr_instance, pIcdSurface);
535 }
536
537 return vkRes;
Ian Elliott2c05e222015-11-19 13:14:05 -0700538}
Ian Elliott919fa302015-11-24 15:39:10 -0700539
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600540// This is the trampoline entrypoint for
541// GetPhysicalDeviceWin32PresentationSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700542LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
543 uint32_t queueFamilyIndex) {
544 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Ian Elliott919fa302015-11-24 15:39:10 -0700545 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700546 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700547 VkBool32 res = disp->GetPhysicalDeviceWin32PresentationSupportKHR(unwrapped_phys_dev, queueFamilyIndex);
Ian Elliott919fa302015-11-24 15:39:10 -0700548 return res;
549}
550
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600551// This is the instance chain terminator function for
552// GetPhysicalDeviceWin32PresentationSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700553VKAPI_ATTR VkBool32 VKAPI_CALL terminator_GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
554 uint32_t queueFamilyIndex) {
Ian Elliott2b8965a2016-03-24 13:59:22 -0600555 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700556 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -0600557 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700558 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600559 if (!ptr_instance->wsi_win32_surface_enabled) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700560 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700561 "VK_KHR_win32_surface extension not enabled. vkGetPhysicalDeviceWin32PresentationSupportKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -0600562 return VK_SUCCESS;
563 }
564
Mark Young0f183a82017-02-28 09:58:04 -0700565 if (NULL == icd_term->dispatch.GetPhysicalDeviceWin32PresentationSupportKHR) {
566 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
567 "ICD for selected physical device is not exporting vkGetPhysicalDeviceWin32PresentationSupportKHR!\n");
568 assert(false && "loader: null GetPhysicalDeviceWin32PresentationSupportKHR ICD pointer");
569 }
Ian Elliott919fa302015-11-24 15:39:10 -0700570
Mark Young0f183a82017-02-28 09:58:04 -0700571 return icd_term->dispatch.GetPhysicalDeviceWin32PresentationSupportKHR(phys_dev_term->phys_dev, queueFamilyIndex);
Ian Elliott919fa302015-11-24 15:39:10 -0700572}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700573#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -0700574
575#ifdef VK_USE_PLATFORM_MIR_KHR
576
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600577// Functions for the VK_KHR_mir_surface extension:
Ian Elliott2c05e222015-11-19 13:14:05 -0700578
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600579// This is the trampoline entrypoint for CreateMirSurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700580LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateMirSurfaceKHR(VkInstance instance,
581 const VkMirSurfaceCreateInfoKHR *pCreateInfo,
582 const VkAllocationCallbacks *pAllocator,
583 VkSurfaceKHR *pSurface) {
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700584 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700585 disp = loader_get_instance_layer_dispatch(instance);
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700586 VkResult res;
587
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700588 res = disp->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700589 return res;
590}
591
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600592// This is the instance chain terminator function for CreateMirSurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700593VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
594 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Young16573c72016-06-28 10:52:43 -0600595 VkResult vkRes = VK_SUCCESS;
Mark Youngad46cec2016-10-12 14:18:44 -0600596 VkIcdSurface *pIcdSurface = NULL;
Mark Young49f39db2016-11-02 09:37:08 -0600597 uint32_t i = 0;
598
Ian Elliott2b8965a2016-03-24 13:59:22 -0600599 // First, check to ensure the appropriate extension was enabled:
Ian Elliottdb4300a2015-11-23 10:17:23 -0700600 struct loader_instance *ptr_instance = loader_get_instance(instance);
Ian Elliott2b8965a2016-03-24 13:59:22 -0600601 if (!ptr_instance->wsi_mir_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700602 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700603 "VK_KHR_mir_surface extension not enabled. vkCreateMirSurfaceKHR not executed!\n");
Mark Young16573c72016-06-28 10:52:43 -0600604 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
605 goto out;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600606 }
607
608 // Next, if so, proceed with the implementation of this function:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700609 pIcdSurface = AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->mir_surf.base), sizeof(pIcdSurface->mir_surf));
Ian Elliott2c05e222015-11-19 13:14:05 -0700610 if (pIcdSurface == NULL) {
Mark Young16573c72016-06-28 10:52:43 -0600611 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
612 goto out;
Ian Elliott2c05e222015-11-19 13:14:05 -0700613 }
614
Mark Young16573c72016-06-28 10:52:43 -0600615 pIcdSurface->mir_surf.base.platform = VK_ICD_WSI_PLATFORM_MIR;
616 pIcdSurface->mir_surf.connection = pCreateInfo->connection;
617 pIcdSurface->mir_surf.mirSurface = pCreateInfo->mirSurface;
618
Mark Young16573c72016-06-28 10:52:43 -0600619 // Loop through each ICD and determine if they need to create a surface
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700620 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
621 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
Mark Young0f183a82017-02-28 09:58:04 -0700622 if (NULL != icd_term->dispatch.CreateMirSurfaceKHR) {
623 vkRes = icd_term->dispatch.CreateMirSurfaceKHR(icd_term->instance, pCreateInfo, pAllocator,
624 &pIcdSurface->real_icd_surfaces[i]);
Mark Young16573c72016-06-28 10:52:43 -0600625 if (VK_SUCCESS != vkRes) {
626 goto out;
627 }
628 }
629 }
630 }
Ian Elliott2c05e222015-11-19 13:14:05 -0700631
Jon Ashburn23d36b12016-02-02 17:47:28 -0700632 *pSurface = (VkSurfaceKHR)pIcdSurface;
Ian Elliott2c05e222015-11-19 13:14:05 -0700633
Mark Young16573c72016-06-28 10:52:43 -0600634out:
635
636 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
637 if (NULL != pIcdSurface->real_icd_surfaces) {
Mark Young49f39db2016-11-02 09:37:08 -0600638 i = 0;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700639 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 -0700640 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
641 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
Mark Young16573c72016-06-28 10:52:43 -0600642 }
643 }
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700644 loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces);
Mark Young16573c72016-06-28 10:52:43 -0600645 }
646 loader_instance_heap_free(ptr_instance, pIcdSurface);
647 }
648
649 return vkRes;
Ian Elliott2c05e222015-11-19 13:14:05 -0700650}
Ian Elliott919fa302015-11-24 15:39:10 -0700651
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600652// This is the trampoline entrypoint for
653// GetPhysicalDeviceMirPresentationSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700654LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
655 uint32_t queueFamilyIndex,
656 MirConnection *connection) {
657 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Ian Elliott919fa302015-11-24 15:39:10 -0700658 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700659 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700660 VkBool32 res = disp->GetPhysicalDeviceMirPresentationSupportKHR(unwrapped_phys_dev, queueFamilyIndex, connection);
Ian Elliott919fa302015-11-24 15:39:10 -0700661 return res;
662}
663
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600664// This is the instance chain terminator function for
665// GetPhysicalDeviceMirPresentationSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700666VKAPI_ATTR VkBool32 VKAPI_CALL terminator_GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
667 uint32_t queueFamilyIndex,
668 MirConnection *connection) {
Ian Elliott2b8965a2016-03-24 13:59:22 -0600669 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700670 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -0600671 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700672 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600673 if (!ptr_instance->wsi_mir_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700674 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700675 "VK_KHR_mir_surface extension not enabled. vkGetPhysicalDeviceMirPresentationSupportKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -0600676 return VK_SUCCESS;
677 }
678
Mark Young0f183a82017-02-28 09:58:04 -0700679 if (NULL == icd_term->dispatch.GetPhysicalDeviceMirPresentationSupportKHR) {
680 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
681 "ICD for selected physical device is not exporting vkGetPhysicalDeviceMirPresentationSupportKHR!\n");
682 assert(false && "loader: null GetPhysicalDeviceMirPresentationSupportKHR ICD pointer");
683 }
Ian Elliott919fa302015-11-24 15:39:10 -0700684
Mark Young0f183a82017-02-28 09:58:04 -0700685 return icd_term->dispatch.GetPhysicalDeviceMirPresentationSupportKHR(phys_dev_term->phys_dev, queueFamilyIndex, connection);
Ian Elliott919fa302015-11-24 15:39:10 -0700686}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700687#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -0700688
689#ifdef VK_USE_PLATFORM_WAYLAND_KHR
690
Mark Young0f183a82017-02-28 09:58:04 -0700691// This is the trampoline entrypoint for CreateWaylandSurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700692LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateWaylandSurfaceKHR(VkInstance instance,
693 const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
694 const VkAllocationCallbacks *pAllocator,
695 VkSurfaceKHR *pSurface) {
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700696 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700697 disp = loader_get_instance_layer_dispatch(instance);
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700698 VkResult res;
699
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700700 res = disp->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700701 return res;
702}
703
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600704// This is the instance chain terminator function for CreateWaylandSurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700705VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateWaylandSurfaceKHR(VkInstance instance,
706 const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
707 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Young16573c72016-06-28 10:52:43 -0600708 VkResult vkRes = VK_SUCCESS;
Mark Youngad46cec2016-10-12 14:18:44 -0600709 VkIcdSurface *pIcdSurface = NULL;
Mark Young49f39db2016-11-02 09:37:08 -0600710 uint32_t i = 0;
711
Ian Elliott2b8965a2016-03-24 13:59:22 -0600712 // First, check to ensure the appropriate extension was enabled:
Ian Elliottdb4300a2015-11-23 10:17:23 -0700713 struct loader_instance *ptr_instance = loader_get_instance(instance);
Jon Ashburnd76b51c2016-03-24 17:26:59 -0600714 if (!ptr_instance->wsi_wayland_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700715 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700716 "VK_KHR_wayland_surface extension not enabled. vkCreateWaylandSurfaceKHR not executed!\n");
Mark Young16573c72016-06-28 10:52:43 -0600717 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
718 goto out;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600719 }
720
721 // Next, if so, proceed with the implementation of this function:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700722 pIcdSurface = AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->wayland_surf.base), sizeof(pIcdSurface->wayland_surf));
Ian Elliott2c05e222015-11-19 13:14:05 -0700723 if (pIcdSurface == NULL) {
Mark Young16573c72016-06-28 10:52:43 -0600724 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
725 goto out;
Ian Elliott2c05e222015-11-19 13:14:05 -0700726 }
727
Mark Young16573c72016-06-28 10:52:43 -0600728 pIcdSurface->wayland_surf.base.platform = VK_ICD_WSI_PLATFORM_WAYLAND;
729 pIcdSurface->wayland_surf.display = pCreateInfo->display;
730 pIcdSurface->wayland_surf.surface = pCreateInfo->surface;
731
Mark Young16573c72016-06-28 10:52:43 -0600732 // Loop through each ICD and determine if they need to create a surface
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700733 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
734 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
Mark Young0f183a82017-02-28 09:58:04 -0700735 if (NULL != icd_term->dispatch.CreateWaylandSurfaceKHR) {
736 vkRes = icd_term->dispatch.CreateWaylandSurfaceKHR(icd_term->instance, pCreateInfo, pAllocator,
737 &pIcdSurface->real_icd_surfaces[i]);
Mark Young16573c72016-06-28 10:52:43 -0600738 if (VK_SUCCESS != vkRes) {
739 goto out;
740 }
741 }
742 }
743 }
Ian Elliott2c05e222015-11-19 13:14:05 -0700744
Jon Ashburn23d36b12016-02-02 17:47:28 -0700745 *pSurface = (VkSurfaceKHR)pIcdSurface;
Ian Elliott2c05e222015-11-19 13:14:05 -0700746
Mark Young16573c72016-06-28 10:52:43 -0600747out:
748
749 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
750 if (NULL != pIcdSurface->real_icd_surfaces) {
Mark Young49f39db2016-11-02 09:37:08 -0600751 i = 0;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700752 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 -0700753 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
754 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
Mark Young16573c72016-06-28 10:52:43 -0600755 }
756 }
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700757 loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces);
Mark Young16573c72016-06-28 10:52:43 -0600758 }
759 loader_instance_heap_free(ptr_instance, pIcdSurface);
760 }
761
762 return vkRes;
Ian Elliott2c05e222015-11-19 13:14:05 -0700763}
Ian Elliott919fa302015-11-24 15:39:10 -0700764
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600765// This is the trampoline entrypoint for
766// GetPhysicalDeviceWaylandPresentationSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700767LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
768 uint32_t queueFamilyIndex,
769 struct wl_display *display) {
770 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Ian Elliott919fa302015-11-24 15:39:10 -0700771 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700772 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700773 VkBool32 res = disp->GetPhysicalDeviceWaylandPresentationSupportKHR(unwrapped_phys_dev, queueFamilyIndex, display);
Ian Elliott919fa302015-11-24 15:39:10 -0700774 return res;
775}
776
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600777// This is the instance chain terminator function for
778// GetPhysicalDeviceWaylandPresentationSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700779VKAPI_ATTR VkBool32 VKAPI_CALL terminator_GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
780 uint32_t queueFamilyIndex,
781 struct wl_display *display) {
Ian Elliott2b8965a2016-03-24 13:59:22 -0600782 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700783 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -0600784 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700785 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Jon Ashburnd76b51c2016-03-24 17:26:59 -0600786 if (!ptr_instance->wsi_wayland_surface_enabled) {
Mark Young0f183a82017-02-28 09:58:04 -0700787 loader_log(
788 ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
789 "VK_KHR_wayland_surface extension not enabled. vkGetPhysicalDeviceWaylandPresentationSupportKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -0600790 return VK_SUCCESS;
791 }
792
Mark Young0f183a82017-02-28 09:58:04 -0700793 if (NULL == icd_term->dispatch.GetPhysicalDeviceWaylandPresentationSupportKHR) {
794 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
795 "ICD for selected physical device is not exporting vkGetPhysicalDeviceWaylandPresentationSupportKHR!\n");
796 assert(false && "loader: null GetPhysicalDeviceWaylandPresentationSupportKHR ICD pointer");
797 }
Ian Elliott919fa302015-11-24 15:39:10 -0700798
Mark Young0f183a82017-02-28 09:58:04 -0700799 return icd_term->dispatch.GetPhysicalDeviceWaylandPresentationSupportKHR(phys_dev_term->phys_dev, queueFamilyIndex, display);
Ian Elliott919fa302015-11-24 15:39:10 -0700800}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700801#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -0700802
803#ifdef VK_USE_PLATFORM_XCB_KHR
804
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600805// Functions for the VK_KHR_xcb_surface extension:
806
807// This is the trampoline entrypoint for CreateXcbSurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700808LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateXcbSurfaceKHR(VkInstance instance,
809 const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
810 const VkAllocationCallbacks *pAllocator,
811 VkSurfaceKHR *pSurface) {
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700812 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700813 disp = loader_get_instance_layer_dispatch(instance);
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700814 VkResult res;
815
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700816 res = disp->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700817 return res;
818}
819
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600820// This is the instance chain terminator function for CreateXcbSurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700821VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
822 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Young16573c72016-06-28 10:52:43 -0600823 VkResult vkRes = VK_SUCCESS;
Mark Youngad46cec2016-10-12 14:18:44 -0600824 VkIcdSurface *pIcdSurface = NULL;
Mark Young49f39db2016-11-02 09:37:08 -0600825 uint32_t i = 0;
826
Ian Elliott2b8965a2016-03-24 13:59:22 -0600827 // First, check to ensure the appropriate extension was enabled:
Ian Elliottdb4300a2015-11-23 10:17:23 -0700828 struct loader_instance *ptr_instance = loader_get_instance(instance);
Ian Elliott2b8965a2016-03-24 13:59:22 -0600829 if (!ptr_instance->wsi_xcb_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700830 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700831 "VK_KHR_xcb_surface extension not enabled. vkCreateXcbSurfaceKHR not executed!\n");
Mark Young16573c72016-06-28 10:52:43 -0600832 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
833 goto out;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600834 }
835
836 // Next, if so, proceed with the implementation of this function:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700837 pIcdSurface = AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->xcb_surf.base), sizeof(pIcdSurface->xcb_surf));
Ian Elliott2c05e222015-11-19 13:14:05 -0700838 if (pIcdSurface == NULL) {
Mark Young16573c72016-06-28 10:52:43 -0600839 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
840 goto out;
Ian Elliott2c05e222015-11-19 13:14:05 -0700841 }
842
Mark Young16573c72016-06-28 10:52:43 -0600843 pIcdSurface->xcb_surf.base.platform = VK_ICD_WSI_PLATFORM_XCB;
844 pIcdSurface->xcb_surf.connection = pCreateInfo->connection;
845 pIcdSurface->xcb_surf.window = pCreateInfo->window;
846
Mark Young16573c72016-06-28 10:52:43 -0600847 // Loop through each ICD and determine if they need to create a surface
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700848 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
849 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
Mark Young0f183a82017-02-28 09:58:04 -0700850 if (NULL != icd_term->dispatch.CreateXcbSurfaceKHR) {
851 vkRes = icd_term->dispatch.CreateXcbSurfaceKHR(icd_term->instance, pCreateInfo, pAllocator,
852 &pIcdSurface->real_icd_surfaces[i]);
Mark Young16573c72016-06-28 10:52:43 -0600853 if (VK_SUCCESS != vkRes) {
854 goto out;
855 }
856 }
857 }
858 }
Ian Elliott2c05e222015-11-19 13:14:05 -0700859
Mark Young786fb102016-12-01 10:42:21 -0700860 *pSurface = (VkSurfaceKHR)pIcdSurface;
Ian Elliott2c05e222015-11-19 13:14:05 -0700861
Mark Young16573c72016-06-28 10:52:43 -0600862out:
863
864 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
865 if (NULL != pIcdSurface->real_icd_surfaces) {
Mark Young49f39db2016-11-02 09:37:08 -0600866 i = 0;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700867 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 -0700868 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
869 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
Mark Young16573c72016-06-28 10:52:43 -0600870 }
871 }
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700872 loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces);
Mark Young16573c72016-06-28 10:52:43 -0600873 }
874 loader_instance_heap_free(ptr_instance, pIcdSurface);
875 }
876
877 return vkRes;
Ian Elliott2c05e222015-11-19 13:14:05 -0700878}
Ian Elliott919fa302015-11-24 15:39:10 -0700879
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600880// This is the trampoline entrypoint for
881// GetPhysicalDeviceXcbPresentationSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700882LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
883 uint32_t queueFamilyIndex,
884 xcb_connection_t *connection,
885 xcb_visualid_t visual_id) {
886 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Ian Elliott919fa302015-11-24 15:39:10 -0700887 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700888 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700889 VkBool32 res = disp->GetPhysicalDeviceXcbPresentationSupportKHR(unwrapped_phys_dev, queueFamilyIndex, connection, visual_id);
Ian Elliott919fa302015-11-24 15:39:10 -0700890 return res;
891}
892
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600893// This is the instance chain terminator function for
894// GetPhysicalDeviceXcbPresentationSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700895VKAPI_ATTR VkBool32 VKAPI_CALL terminator_GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
896 uint32_t queueFamilyIndex,
897 xcb_connection_t *connection,
898 xcb_visualid_t visual_id) {
Ian Elliott2b8965a2016-03-24 13:59:22 -0600899 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700900 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -0600901 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700902 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600903 if (!ptr_instance->wsi_xcb_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700904 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700905 "VK_KHR_xcb_surface extension not enabled. vkGetPhysicalDeviceXcbPresentationSupportKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -0600906 return VK_SUCCESS;
907 }
908
Mark Young0f183a82017-02-28 09:58:04 -0700909 if (NULL == icd_term->dispatch.GetPhysicalDeviceXcbPresentationSupportKHR) {
910 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
911 "ICD for selected physical device is not exporting vkGetPhysicalDeviceXcbPresentationSupportKHR!\n");
912 assert(false && "loader: null GetPhysicalDeviceXcbPresentationSupportKHR ICD pointer");
913 }
Ian Elliott919fa302015-11-24 15:39:10 -0700914
Mark Young0f183a82017-02-28 09:58:04 -0700915 return icd_term->dispatch.GetPhysicalDeviceXcbPresentationSupportKHR(phys_dev_term->phys_dev, queueFamilyIndex, connection,
916 visual_id);
Ian Elliott919fa302015-11-24 15:39:10 -0700917}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700918#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -0700919
920#ifdef VK_USE_PLATFORM_XLIB_KHR
921
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600922// Functions for the VK_KHR_xlib_surface extension:
Ian Elliott2c05e222015-11-19 13:14:05 -0700923
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600924// This is the trampoline entrypoint for CreateXlibSurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700925LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateXlibSurfaceKHR(VkInstance instance,
926 const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
927 const VkAllocationCallbacks *pAllocator,
928 VkSurfaceKHR *pSurface) {
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700929 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -0700930 disp = loader_get_instance_layer_dispatch(instance);
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700931 VkResult res;
932
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700933 res = disp->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburnf72a04b2015-11-25 17:55:49 -0700934 return res;
935}
936
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -0600937// This is the instance chain terminator function for CreateXlibSurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700938VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
939 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Young16573c72016-06-28 10:52:43 -0600940 VkResult vkRes = VK_SUCCESS;
Mark Youngad46cec2016-10-12 14:18:44 -0600941 VkIcdSurface *pIcdSurface = NULL;
Mark Young49f39db2016-11-02 09:37:08 -0600942 uint32_t i = 0;
943
Ian Elliott2b8965a2016-03-24 13:59:22 -0600944 // First, check to ensure the appropriate extension was enabled:
Ian Elliottdb4300a2015-11-23 10:17:23 -0700945 struct loader_instance *ptr_instance = loader_get_instance(instance);
Ian Elliott2b8965a2016-03-24 13:59:22 -0600946 if (!ptr_instance->wsi_xlib_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700947 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -0700948 "VK_KHR_xlib_surface extension not enabled. vkCreateXlibSurfaceKHR not executed!\n");
Mark Young16573c72016-06-28 10:52:43 -0600949 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
950 goto out;
Ian Elliott2b8965a2016-03-24 13:59:22 -0600951 }
952
953 // Next, if so, proceed with the implementation of this function:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700954 pIcdSurface = AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->xlib_surf.base), sizeof(pIcdSurface->xlib_surf));
Ian Elliott2c05e222015-11-19 13:14:05 -0700955 if (pIcdSurface == NULL) {
Mark Young16573c72016-06-28 10:52:43 -0600956 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
957 goto out;
Ian Elliott2c05e222015-11-19 13:14:05 -0700958 }
959
Mark Young16573c72016-06-28 10:52:43 -0600960 pIcdSurface->xlib_surf.base.platform = VK_ICD_WSI_PLATFORM_XLIB;
961 pIcdSurface->xlib_surf.dpy = pCreateInfo->dpy;
962 pIcdSurface->xlib_surf.window = pCreateInfo->window;
963
Mark Young16573c72016-06-28 10:52:43 -0600964 // Loop through each ICD and determine if they need to create a surface
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700965 for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
966 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
Mark Young0f183a82017-02-28 09:58:04 -0700967 if (NULL != icd_term->dispatch.CreateXlibSurfaceKHR) {
968 vkRes = icd_term->dispatch.CreateXlibSurfaceKHR(icd_term->instance, pCreateInfo, pAllocator,
969 &pIcdSurface->real_icd_surfaces[i]);
Mark Young16573c72016-06-28 10:52:43 -0600970 if (VK_SUCCESS != vkRes) {
971 goto out;
972 }
973 }
974 }
975 }
Ian Elliott2c05e222015-11-19 13:14:05 -0700976
Mark Young786fb102016-12-01 10:42:21 -0700977 *pSurface = (VkSurfaceKHR)pIcdSurface;
Ian Elliott2c05e222015-11-19 13:14:05 -0700978
Mark Young16573c72016-06-28 10:52:43 -0600979out:
980
981 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
982 if (NULL != pIcdSurface->real_icd_surfaces) {
Mark Young49f39db2016-11-02 09:37:08 -0600983 i = 0;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700984 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 -0700985 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
986 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
Mark Young16573c72016-06-28 10:52:43 -0600987 }
988 }
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700989 loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces);
Mark Young16573c72016-06-28 10:52:43 -0600990 }
991 loader_instance_heap_free(ptr_instance, pIcdSurface);
992 }
993
994 return vkRes;
Ian Elliott2c05e222015-11-19 13:14:05 -0700995}
Ian Elliott919fa302015-11-24 15:39:10 -0700996
Mark Young49f39db2016-11-02 09:37:08 -0600997// This is the trampoline entrypoint for
998// GetPhysicalDeviceXlibPresentationSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700999LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
1000 uint32_t queueFamilyIndex, Display *dpy,
1001 VisualID visualID) {
1002 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Ian Elliott919fa302015-11-24 15:39:10 -07001003 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -07001004 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001005 VkBool32 res = disp->GetPhysicalDeviceXlibPresentationSupportKHR(unwrapped_phys_dev, queueFamilyIndex, dpy, visualID);
Ian Elliott919fa302015-11-24 15:39:10 -07001006 return res;
1007}
1008
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001009// This is the instance chain terminator function for
1010// GetPhysicalDeviceXlibPresentationSupportKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001011VKAPI_ATTR VkBool32 VKAPI_CALL terminator_GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
1012 uint32_t queueFamilyIndex, Display *dpy,
1013 VisualID visualID) {
Ian Elliott2b8965a2016-03-24 13:59:22 -06001014 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001015 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -06001016 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001017 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -06001018 if (!ptr_instance->wsi_xlib_surface_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001019 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -07001020 "VK_KHR_xlib_surface extension not enabled. vkGetPhysicalDeviceXlibPresentationSupportKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -06001021 return VK_SUCCESS;
1022 }
1023
Mark Young0f183a82017-02-28 09:58:04 -07001024 if (NULL == icd_term->dispatch.GetPhysicalDeviceXlibPresentationSupportKHR) {
1025 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1026 "ICD for selected physical device is not exporting vkGetPhysicalDeviceXlibPresentationSupportKHR!\n");
1027 assert(false && "loader: null GetPhysicalDeviceXlibPresentationSupportKHR ICD pointer");
1028 }
Ian Elliott919fa302015-11-24 15:39:10 -07001029
Mark Young0f183a82017-02-28 09:58:04 -07001030 return icd_term->dispatch.GetPhysicalDeviceXlibPresentationSupportKHR(phys_dev_term->phys_dev, queueFamilyIndex, dpy, visualID);
Ian Elliott919fa302015-11-24 15:39:10 -07001031}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001032#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -07001033
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -07001034#ifdef VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -07001035
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001036// Functions for the VK_KHR_android_surface extension:
1037
1038// This is the trampoline entrypoint for CreateAndroidSurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001039LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateAndroidSurfaceKHR(VkInstance instance, ANativeWindow *window,
1040 const VkAllocationCallbacks *pAllocator,
1041 VkSurfaceKHR *pSurface) {
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -07001042 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -07001043 disp = loader_get_instance_layer_dispatch(instance);
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -07001044 VkResult res;
1045
1046 res = disp->CreateAndroidSurfaceKHR(instance, window, pAllocator, pSurface);
1047 return res;
1048}
1049
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001050// This is the instance chain terminator function for CreateAndroidSurfaceKHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001051VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateAndroidSurfaceKHR(VkInstance instance, Window window,
1052 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Ian Elliott2b8965a2016-03-24 13:59:22 -06001053 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -07001054 struct loader_instance *ptr_instance = loader_get_instance(instance);
Ian Elliott2b8965a2016-03-24 13:59:22 -06001055 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001056 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -07001057 "VK_KHR_display extension not enabled. vkCreateAndroidSurfaceKHR not executed!\n");
Jeremy Hayes9f1d0b62016-06-14 11:50:02 -06001058 return VK_ERROR_EXTENSION_NOT_PRESENT;
Ian Elliott2b8965a2016-03-24 13:59:22 -06001059 }
1060
1061 // Next, if so, proceed with the implementation of this function:
Mark Young16573c72016-06-28 10:52:43 -06001062 VkIcdSurfaceAndroid *pIcdSurface =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001063 loader_instance_heap_alloc(ptr_instance, sizeof(VkIcdSurfaceAndroid), VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -07001064 if (pIcdSurface == NULL) {
1065 return VK_ERROR_OUT_OF_HOST_MEMORY;
1066 }
1067
1068 pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_ANDROID;
1069 pIcdSurface->dpy = dpy;
1070 pIcdSurface->window = window;
1071
Jon Ashburn23d36b12016-02-02 17:47:28 -07001072 *pSurface = (VkSurfaceKHR)pIcdSurface;
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -07001073
1074 return VK_SUCCESS;
1075}
1076
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001077#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -07001078
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001079// Functions for the VK_KHR_display instance extension:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001080LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice,
1081 uint32_t *pPropertyCount,
1082 VkDisplayPropertiesKHR *pProperties) {
1083 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001084 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -07001085 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001086 VkResult res = disp->GetPhysicalDeviceDisplayPropertiesKHR(unwrapped_phys_dev, pPropertyCount, pProperties);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001087 return res;
1088}
1089
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001090VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice,
1091 uint32_t *pPropertyCount,
1092 VkDisplayPropertiesKHR *pProperties) {
Ian Elliott2b8965a2016-03-24 13:59:22 -06001093 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001094 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -06001095 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001096 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -06001097 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001098 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -07001099 "VK_KHR_display extension not enabled. vkGetPhysicalDeviceDisplayPropertiesKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -06001100 return VK_SUCCESS;
1101 }
1102
Mark Young0f183a82017-02-28 09:58:04 -07001103 if (NULL == icd_term->dispatch.GetPhysicalDeviceDisplayPropertiesKHR) {
1104 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1105 "ICD for selected physical device is not exporting vkGetPhysicalDeviceDisplayPropertiesKHR!\n");
1106 assert(false && "loader: null GetPhysicalDeviceDisplayPropertiesKHR ICD pointer");
1107 }
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001108
Mark Young0f183a82017-02-28 09:58:04 -07001109 return icd_term->dispatch.GetPhysicalDeviceDisplayPropertiesKHR(phys_dev_term->phys_dev, pPropertyCount, pProperties);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001110}
1111
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001112LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
1113 VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkDisplayPlanePropertiesKHR *pProperties) {
1114 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001115 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -07001116 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001117 VkResult res = disp->GetPhysicalDeviceDisplayPlanePropertiesKHR(unwrapped_phys_dev, pPropertyCount, pProperties);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001118 return res;
1119}
1120
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001121VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice,
1122 uint32_t *pPropertyCount,
1123 VkDisplayPlanePropertiesKHR *pProperties) {
Ian Elliott2b8965a2016-03-24 13:59:22 -06001124 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001125 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -06001126 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001127 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -06001128 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001129 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -07001130 "VK_KHR_display extension not enabled. vkGetPhysicalDeviceDisplayPlanePropertiesKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -06001131 return VK_SUCCESS;
1132 }
1133
Mark Young0f183a82017-02-28 09:58:04 -07001134 if (NULL == icd_term->dispatch.GetPhysicalDeviceDisplayPlanePropertiesKHR) {
1135 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1136 "ICD for selected physical device is not exporting vkGetPhysicalDeviceDisplayPlanePropertiesKHR!\n");
1137 assert(false && "loader: null GetPhysicalDeviceDisplayPlanePropertiesKHR ICD pointer");
1138 }
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001139
Mark Young0f183a82017-02-28 09:58:04 -07001140 return icd_term->dispatch.GetPhysicalDeviceDisplayPlanePropertiesKHR(phys_dev_term->phys_dev, pPropertyCount, pProperties);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001141}
1142
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001143LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice,
1144 uint32_t planeIndex, uint32_t *pDisplayCount,
1145 VkDisplayKHR *pDisplays) {
1146 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001147 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -07001148 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001149 VkResult res = disp->GetDisplayPlaneSupportedDisplaysKHR(unwrapped_phys_dev, planeIndex, pDisplayCount, pDisplays);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001150 return res;
1151}
1152
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001153VKAPI_ATTR VkResult VKAPI_CALL terminator_GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
1154 uint32_t *pDisplayCount, VkDisplayKHR *pDisplays) {
Ian Elliott2b8965a2016-03-24 13:59:22 -06001155 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001156 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -06001157 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001158 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -06001159 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001160 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -07001161 "VK_KHR_display extension not enabled. vkGetDisplayPlaneSupportedDisplaysKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -06001162 return VK_SUCCESS;
1163 }
1164
Mark Young0f183a82017-02-28 09:58:04 -07001165 if (NULL == icd_term->dispatch.GetDisplayPlaneSupportedDisplaysKHR) {
1166 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1167 "ICD for selected physical device is not exporting vkGetDisplayPlaneSupportedDisplaysKHR!\n");
1168 assert(false && "loader: null GetDisplayPlaneSupportedDisplaysKHR ICD pointer");
1169 }
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001170
Mark Young0f183a82017-02-28 09:58:04 -07001171 return icd_term->dispatch.GetDisplayPlaneSupportedDisplaysKHR(phys_dev_term->phys_dev, planeIndex, pDisplayCount, pDisplays);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001172}
1173
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001174LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
1175 uint32_t *pPropertyCount,
1176 VkDisplayModePropertiesKHR *pProperties) {
1177 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001178 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -07001179 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001180 VkResult res = disp->GetDisplayModePropertiesKHR(unwrapped_phys_dev, display, pPropertyCount, pProperties);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001181 return res;
1182}
1183
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001184VKAPI_ATTR VkResult VKAPI_CALL terminator_GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
1185 uint32_t *pPropertyCount,
1186 VkDisplayModePropertiesKHR *pProperties) {
Ian Elliott2b8965a2016-03-24 13:59:22 -06001187 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001188 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -06001189 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001190 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -06001191 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001192 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -07001193 "VK_KHR_display extension not enabled. vkGetDisplayModePropertiesKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -06001194 return VK_SUCCESS;
1195 }
1196
Mark Young0f183a82017-02-28 09:58:04 -07001197 if (NULL == icd_term->dispatch.GetDisplayModePropertiesKHR) {
1198 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1199 "ICD for selected physical device is not exporting vkGetDisplayModePropertiesKHR!\n");
1200 assert(false && "loader: null GetDisplayModePropertiesKHR ICD pointer");
1201 }
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001202
Mark Young0f183a82017-02-28 09:58:04 -07001203 return icd_term->dispatch.GetDisplayModePropertiesKHR(phys_dev_term->phys_dev, display, pPropertyCount, pProperties);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001204}
1205
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001206LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
1207 const VkDisplayModeCreateInfoKHR *pCreateInfo,
1208 const VkAllocationCallbacks *pAllocator,
1209 VkDisplayModeKHR *pMode) {
1210 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001211 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -07001212 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001213 VkResult res = disp->CreateDisplayModeKHR(unwrapped_phys_dev, display, pCreateInfo, pAllocator, pMode);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001214 return res;
1215}
1216
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001217VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
1218 const VkDisplayModeCreateInfoKHR *pCreateInfo,
1219 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode) {
Ian Elliott2b8965a2016-03-24 13:59:22 -06001220 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001221 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -06001222 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001223 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -06001224 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001225 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -07001226 "VK_KHR_display extension not enabled. vkCreateDisplayModeKHR not executed!\n");
Jeremy Hayes9f1d0b62016-06-14 11:50:02 -06001227 return VK_ERROR_EXTENSION_NOT_PRESENT;
Ian Elliott2b8965a2016-03-24 13:59:22 -06001228 }
1229
Mark Young0f183a82017-02-28 09:58:04 -07001230 if (NULL == icd_term->dispatch.CreateDisplayModeKHR) {
1231 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1232 "ICD for selected physical device is not exporting vkCreateDisplayModeKHR!\n");
1233 assert(false && "loader: null CreateDisplayModeKHR ICD pointer");
1234 }
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001235
Mark Young0f183a82017-02-28 09:58:04 -07001236 return icd_term->dispatch.CreateDisplayModeKHR(phys_dev_term->phys_dev, display, pCreateInfo, pAllocator, pMode);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001237}
1238
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001239LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice,
1240 VkDisplayModeKHR mode, uint32_t planeIndex,
1241 VkDisplayPlaneCapabilitiesKHR *pCapabilities) {
1242 VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001243 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -07001244 disp = loader_get_instance_layer_dispatch(physicalDevice);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001245 VkResult res = disp->GetDisplayPlaneCapabilitiesKHR(unwrapped_phys_dev, mode, planeIndex, pCapabilities);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001246 return res;
1247}
1248
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001249VKAPI_ATTR VkResult VKAPI_CALL terminator_GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode,
1250 uint32_t planeIndex,
1251 VkDisplayPlaneCapabilitiesKHR *pCapabilities) {
Ian Elliott2b8965a2016-03-24 13:59:22 -06001252 // First, check to ensure the appropriate extension was enabled:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001253 struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
Mark Young0153e0b2016-11-03 14:27:13 -06001254 struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001255 struct loader_instance *ptr_instance = (struct loader_instance *)icd_term->this_instance;
Ian Elliott2b8965a2016-03-24 13:59:22 -06001256 if (!ptr_instance->wsi_display_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001257 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -07001258 "VK_KHR_display extension not enabled. vkGetDisplayPlaneCapabilitiesKHR not executed!\n");
Ian Elliott2b8965a2016-03-24 13:59:22 -06001259 return VK_SUCCESS;
1260 }
1261
Mark Young0f183a82017-02-28 09:58:04 -07001262 if (NULL == icd_term->dispatch.GetDisplayPlaneCapabilitiesKHR) {
1263 loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
1264 "ICD for selected physical device is not exporting vkGetDisplayPlaneCapabilitiesKHR!\n");
1265 assert(false && "loader: null GetDisplayPlaneCapabilitiesKHR ICD pointer");
1266 }
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001267
Mark Young0f183a82017-02-28 09:58:04 -07001268 return icd_term->dispatch.GetDisplayPlaneCapabilitiesKHR(phys_dev_term->phys_dev, mode, planeIndex, pCapabilities);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001269}
1270
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001271LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDisplayPlaneSurfaceKHR(VkInstance instance,
1272 const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
1273 const VkAllocationCallbacks *pAllocator,
1274 VkSurfaceKHR *pSurface) {
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001275 const VkLayerInstanceDispatchTable *disp;
Mark Young39389872017-01-19 21:10:49 -07001276 disp = loader_get_instance_layer_dispatch(instance);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001277 VkResult res;
1278
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001279 res = disp->CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001280 return res;
1281}
1282
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001283VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateDisplayPlaneSurfaceKHR(VkInstance instance,
1284 const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
1285 const VkAllocationCallbacks *pAllocator,
1286 VkSurfaceKHR *pSurface) {
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001287 struct loader_instance *inst = loader_get_instance(instance);
Mark Young16573c72016-06-28 10:52:43 -06001288 VkIcdSurface *pIcdSurface = NULL;
Mark Young061ac722016-11-01 19:20:41 -06001289 VkResult vkRes = VK_SUCCESS;
Mark Young49f39db2016-11-02 09:37:08 -06001290 uint32_t i = 0;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001291
Mark Young061ac722016-11-01 19:20:41 -06001292 if (!inst->wsi_display_enabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001293 loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Mark Young0f183a82017-02-28 09:58:04 -07001294 "VK_KHR_surface extension not enabled. vkCreateDisplayPlaneSurfaceKHR not executed!\n");
Mark Young061ac722016-11-01 19:20:41 -06001295 vkRes = VK_ERROR_EXTENSION_NOT_PRESENT;
1296 goto out;
Petros Bantolas25d27fe2016-04-14 12:50:42 +01001297 }
1298
Piers Daniell5a522602016-12-13 16:51:49 -07001299 // Next, if so, proceed with the implementation of this function:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001300 pIcdSurface = AllocateIcdSurfaceStruct(inst, sizeof(pIcdSurface->display_surf.base), sizeof(pIcdSurface->display_surf));
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001301 if (pIcdSurface == NULL) {
Mark Young061ac722016-11-01 19:20:41 -06001302 vkRes = VK_ERROR_OUT_OF_HOST_MEMORY;
1303 goto out;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001304 }
1305
Mark Young16573c72016-06-28 10:52:43 -06001306 pIcdSurface->display_surf.base.platform = VK_ICD_WSI_PLATFORM_DISPLAY;
1307 pIcdSurface->display_surf.displayMode = pCreateInfo->displayMode;
1308 pIcdSurface->display_surf.planeIndex = pCreateInfo->planeIndex;
1309 pIcdSurface->display_surf.planeStackIndex = pCreateInfo->planeStackIndex;
1310 pIcdSurface->display_surf.transform = pCreateInfo->transform;
1311 pIcdSurface->display_surf.globalAlpha = pCreateInfo->globalAlpha;
1312 pIcdSurface->display_surf.alphaMode = pCreateInfo->alphaMode;
1313 pIcdSurface->display_surf.imageExtent = pCreateInfo->imageExtent;
1314
Mark Young061ac722016-11-01 19:20:41 -06001315 // Loop through each ICD and determine if they need to create a surface
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001316 for (struct loader_icd_term *icd_term = inst->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) {
1317 if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
Mark Young0f183a82017-02-28 09:58:04 -07001318 if (NULL != icd_term->dispatch.CreateDisplayPlaneSurfaceKHR) {
1319 vkRes = icd_term->dispatch.CreateDisplayPlaneSurfaceKHR(icd_term->instance, pCreateInfo, pAllocator,
1320 &pIcdSurface->real_icd_surfaces[i]);
Mark Young061ac722016-11-01 19:20:41 -06001321 if (VK_SUCCESS != vkRes) {
1322 goto out;
1323 }
1324 }
1325 }
1326 }
1327
Mark Young786fb102016-12-01 10:42:21 -07001328 *pSurface = (VkSurfaceKHR)pIcdSurface;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001329
Mark Young061ac722016-11-01 19:20:41 -06001330out:
1331
1332 if (VK_SUCCESS != vkRes && NULL != pIcdSurface) {
1333 if (NULL != pIcdSurface->real_icd_surfaces) {
Mark Young49f39db2016-11-02 09:37:08 -06001334 i = 0;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001335 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 -07001336 if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
1337 icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator);
Mark Young061ac722016-11-01 19:20:41 -06001338 }
1339 }
1340 loader_instance_heap_free(inst, pIcdSurface->real_icd_surfaces);
1341 }
1342 loader_instance_heap_free(inst, pIcdSurface);
1343 }
1344
1345 return vkRes;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001346}
1347
Mark Young39389872017-01-19 21:10:49 -07001348// EXT_display_swapchain Extension command
1349
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001350LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
1351 const VkSwapchainCreateInfoKHR *pCreateInfos,
1352 const VkAllocationCallbacks *pAllocator,
1353 VkSwapchainKHR *pSwapchains) {
Mark Young5210abc2016-09-08 18:36:32 -06001354 const VkLayerDispatchTable *disp;
1355 disp = loader_get_dispatch(device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001356 return disp->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
Mark Young1a867442016-07-01 15:18:27 -06001357}
1358
Mark Young0f183a82017-02-28 09:58:04 -07001359VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
1360 const VkSwapchainCreateInfoKHR *pCreateInfos,
1361 const VkAllocationCallbacks *pAllocator,
1362 VkSwapchainKHR *pSwapchains) {
Mark Young39389872017-01-19 21:10:49 -07001363 uint32_t icd_index = 0;
1364 struct loader_device *dev;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001365 struct loader_icd_term *icd_term = loader_get_icd_and_device(device, &dev, &icd_index);
Mark Young0f183a82017-02-28 09:58:04 -07001366 if (NULL != icd_term && NULL != icd_term->dispatch.CreateSharedSwapchainsKHR) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001367 VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)pCreateInfos->surface;
Mark Young39389872017-01-19 21:10:49 -07001368 if (NULL != icd_surface->real_icd_surfaces) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001369 if ((VkSurfaceKHR)NULL != icd_surface->real_icd_surfaces[icd_index]) {
Mark Young39389872017-01-19 21:10:49 -07001370 // We found the ICD, and there is an ICD KHR surface
1371 // associated with it, so copy the CreateInfo struct
1372 // and point it at the ICD's surface.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001373 VkSwapchainCreateInfoKHR *pCreateCopy = loader_stack_alloc(sizeof(VkSwapchainCreateInfoKHR) * swapchainCount);
Mark Young39389872017-01-19 21:10:49 -07001374 if (NULL == pCreateCopy) {
1375 return VK_ERROR_OUT_OF_HOST_MEMORY;
1376 }
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001377 memcpy(pCreateCopy, pCreateInfos, sizeof(VkSwapchainCreateInfoKHR) * swapchainCount);
Mark Young39389872017-01-19 21:10:49 -07001378 for (uint32_t sc = 0; sc < swapchainCount; sc++) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001379 pCreateCopy[sc].surface = icd_surface->real_icd_surfaces[icd_index];
Mark Young39389872017-01-19 21:10:49 -07001380 }
Mark Young0f183a82017-02-28 09:58:04 -07001381 return icd_term->dispatch.CreateSharedSwapchainsKHR(device, swapchainCount, pCreateCopy, pAllocator, pSwapchains);
Mark Young39389872017-01-19 21:10:49 -07001382 }
1383 }
Mark Young0f183a82017-02-28 09:58:04 -07001384 return icd_term->dispatch.CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
Mark Young39389872017-01-19 21:10:49 -07001385 }
1386 return VK_SUCCESS;
1387}
1388
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001389bool wsi_swapchain_instance_gpa(struct loader_instance *ptr_instance, const char *name, void **addr) {
Ian Elliott954fa342015-10-30 15:28:23 -06001390 *addr = NULL;
1391
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001392 // Functions for the VK_KHR_surface extension:
Ian Elliott2c05e222015-11-19 13:14:05 -07001393 if (!strcmp("vkDestroySurfaceKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001394 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkDestroySurfaceKHR : NULL;
Ian Elliott2c05e222015-11-19 13:14:05 -07001395 return true;
1396 }
Ian Elliott954fa342015-10-30 15:28:23 -06001397 if (!strcmp("vkGetPhysicalDeviceSurfaceSupportKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001398 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkGetPhysicalDeviceSurfaceSupportKHR : NULL;
Ian Elliott954fa342015-10-30 15:28:23 -06001399 return true;
1400 }
Ian Elliott486c5502015-11-19 16:05:09 -07001401 if (!strcmp("vkGetPhysicalDeviceSurfaceCapabilitiesKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001402 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkGetPhysicalDeviceSurfaceCapabilitiesKHR : NULL;
Ian Elliott486c5502015-11-19 16:05:09 -07001403 return true;
1404 }
1405 if (!strcmp("vkGetPhysicalDeviceSurfaceFormatsKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001406 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkGetPhysicalDeviceSurfaceFormatsKHR : NULL;
Ian Elliott486c5502015-11-19 16:05:09 -07001407 return true;
1408 }
1409 if (!strcmp("vkGetPhysicalDeviceSurfacePresentModesKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001410 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkGetPhysicalDeviceSurfacePresentModesKHR : NULL;
Ian Elliott486c5502015-11-19 16:05:09 -07001411 return true;
1412 }
Ian Elliott934d0d52015-11-19 16:39:21 -07001413
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001414 // Functions for the VK_KHR_swapchain extension:
1415
1416 // Note: This is a device extension, and its functions are statically
1417 // exported from the loader. Per Khronos decisions, the loader's GIPA
1418 // function will return the trampoline function for such device-extension
1419 // functions, regardless of whether the extension has been enabled.
Ian Elliott934d0d52015-11-19 16:39:21 -07001420 if (!strcmp("vkCreateSwapchainKHR", name)) {
Jon Ashburn23d36b12016-02-02 17:47:28 -07001421 *addr = (void *)vkCreateSwapchainKHR;
Ian Elliott934d0d52015-11-19 16:39:21 -07001422 return true;
1423 }
1424 if (!strcmp("vkDestroySwapchainKHR", name)) {
Jon Ashburn23d36b12016-02-02 17:47:28 -07001425 *addr = (void *)vkDestroySwapchainKHR;
Ian Elliott934d0d52015-11-19 16:39:21 -07001426 return true;
1427 }
1428 if (!strcmp("vkGetSwapchainImagesKHR", name)) {
Jon Ashburn23d36b12016-02-02 17:47:28 -07001429 *addr = (void *)vkGetSwapchainImagesKHR;
Ian Elliott934d0d52015-11-19 16:39:21 -07001430 return true;
1431 }
1432 if (!strcmp("vkAcquireNextImageKHR", name)) {
Jon Ashburn23d36b12016-02-02 17:47:28 -07001433 *addr = (void *)vkAcquireNextImageKHR;
Ian Elliott934d0d52015-11-19 16:39:21 -07001434 return true;
1435 }
1436 if (!strcmp("vkQueuePresentKHR", name)) {
Jon Ashburn23d36b12016-02-02 17:47:28 -07001437 *addr = (void *)vkQueuePresentKHR;
Ian Elliott934d0d52015-11-19 16:39:21 -07001438 return true;
1439 }
1440
Ian Elliott2c05e222015-11-19 13:14:05 -07001441#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001442
1443 // Functions for the VK_KHR_win32_surface extension:
Ian Elliott2c05e222015-11-19 13:14:05 -07001444 if (!strcmp("vkCreateWin32SurfaceKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001445 *addr = ptr_instance->wsi_win32_surface_enabled ? (void *)vkCreateWin32SurfaceKHR : NULL;
Ian Elliott2c05e222015-11-19 13:14:05 -07001446 return true;
1447 }
Ian Elliott919fa302015-11-24 15:39:10 -07001448 if (!strcmp("vkGetPhysicalDeviceWin32PresentationSupportKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001449 *addr = ptr_instance->wsi_win32_surface_enabled ? (void *)vkGetPhysicalDeviceWin32PresentationSupportKHR : NULL;
Ian Elliott919fa302015-11-24 15:39:10 -07001450 return true;
1451 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001452#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -07001453#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001454
1455 // Functions for the VK_KHR_mir_surface extension:
Ian Elliott2c05e222015-11-19 13:14:05 -07001456 if (!strcmp("vkCreateMirSurfaceKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001457 *addr = ptr_instance->wsi_mir_surface_enabled ? (void *)vkCreateMirSurfaceKHR : NULL;
Ian Elliott2c05e222015-11-19 13:14:05 -07001458 return true;
1459 }
Ian Elliott919fa302015-11-24 15:39:10 -07001460 if (!strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001461 *addr = ptr_instance->wsi_mir_surface_enabled ? (void *)vkGetPhysicalDeviceMirPresentationSupportKHR : NULL;
Ian Elliott919fa302015-11-24 15:39:10 -07001462 return true;
Jason Ekstranda5ebe8a2016-02-12 17:25:03 -08001463 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001464#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -07001465#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001466
1467 // Functions for the VK_KHR_wayland_surface extension:
Jon Ashburn1530c342016-02-26 13:14:27 -07001468 if (!strcmp("vkCreateWaylandSurfaceKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001469 *addr = ptr_instance->wsi_wayland_surface_enabled ? (void *)vkCreateWaylandSurfaceKHR : NULL;
Jon Ashburn1530c342016-02-26 13:14:27 -07001470 return true;
1471 }
1472 if (!strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001473 *addr = ptr_instance->wsi_wayland_surface_enabled ? (void *)vkGetPhysicalDeviceWaylandPresentationSupportKHR : NULL;
Jon Ashburn1530c342016-02-26 13:14:27 -07001474 return true;
1475 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001476#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -07001477#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001478
1479 // Functions for the VK_KHR_xcb_surface extension:
Jon Ashburn1530c342016-02-26 13:14:27 -07001480 if (!strcmp("vkCreateXcbSurfaceKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001481 *addr = ptr_instance->wsi_xcb_surface_enabled ? (void *)vkCreateXcbSurfaceKHR : NULL;
Jon Ashburn1530c342016-02-26 13:14:27 -07001482 return true;
1483 }
1484 if (!strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001485 *addr = ptr_instance->wsi_xcb_surface_enabled ? (void *)vkGetPhysicalDeviceXcbPresentationSupportKHR : NULL;
Jon Ashburn1530c342016-02-26 13:14:27 -07001486 return true;
1487 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001488#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -07001489#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001490
1491 // Functions for the VK_KHR_xlib_surface extension:
Jon Ashburn1530c342016-02-26 13:14:27 -07001492 if (!strcmp("vkCreateXlibSurfaceKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001493 *addr = ptr_instance->wsi_xlib_surface_enabled ? (void *)vkCreateXlibSurfaceKHR : NULL;
Jon Ashburn1530c342016-02-26 13:14:27 -07001494 return true;
1495 }
1496 if (!strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001497 *addr = ptr_instance->wsi_xlib_surface_enabled ? (void *)vkGetPhysicalDeviceXlibPresentationSupportKHR : NULL;
Jon Ashburn1530c342016-02-26 13:14:27 -07001498 return true;
1499 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001500#endif // VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinskia8a5f852015-12-10 16:25:21 -07001501#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001502
1503 // Functions for the VK_KHR_android_surface extension:
Jon Ashburn1530c342016-02-26 13:14:27 -07001504 if (!strcmp("vkCreateAndroidSurfaceKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001505 *addr = ptr_instance->wsi_xlib_surface_enabled ? (void *)vkCreateAndroidSurfaceKHR : NULL;
Jon Ashburn1530c342016-02-26 13:14:27 -07001506 return true;
1507 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001508#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c05e222015-11-19 13:14:05 -07001509
Mark Lobodzinski6e45fe72016-08-31 09:31:29 -06001510 // Functions for VK_KHR_display extension:
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001511 if (!strcmp("vkGetPhysicalDeviceDisplayPropertiesKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001512 *addr = ptr_instance->wsi_display_enabled ? (void *)vkGetPhysicalDeviceDisplayPropertiesKHR : NULL;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001513 return true;
1514 }
1515 if (!strcmp("vkGetPhysicalDeviceDisplayPlanePropertiesKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001516 *addr = ptr_instance->wsi_display_enabled ? (void *)vkGetPhysicalDeviceDisplayPlanePropertiesKHR : NULL;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001517 return true;
1518 }
1519 if (!strcmp("vkGetDisplayPlaneSupportedDisplaysKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001520 *addr = ptr_instance->wsi_display_enabled ? (void *)vkGetDisplayPlaneSupportedDisplaysKHR : NULL;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001521 return true;
1522 }
1523 if (!strcmp("vkGetDisplayModePropertiesKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001524 *addr = ptr_instance->wsi_display_enabled ? (void *)vkGetDisplayModePropertiesKHR : NULL;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001525 return true;
1526 }
1527 if (!strcmp("vkCreateDisplayModeKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001528 *addr = ptr_instance->wsi_display_enabled ? (void *)vkCreateDisplayModeKHR : NULL;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001529 return true;
1530 }
1531 if (!strcmp("vkGetDisplayPlaneCapabilitiesKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001532 *addr = ptr_instance->wsi_display_enabled ? (void *)vkGetDisplayPlaneCapabilitiesKHR : NULL;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001533 return true;
1534 }
1535 if (!strcmp("vkCreateDisplayPlaneSurfaceKHR", name)) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001536 *addr = ptr_instance->wsi_display_enabled ? (void *)vkCreateDisplayPlaneSurfaceKHR : NULL;
Jon Ashburnc7d3e732016-03-08 09:30:30 -07001537 return true;
1538 }
Mark Young1a867442016-07-01 15:18:27 -06001539
1540 // Functions for KHR_display_swapchain extension:
1541 if (!strcmp("vkCreateSharedSwapchainsKHR", name)) {
1542 *addr = (void *)vkCreateSharedSwapchainsKHR;
1543 return true;
1544 }
1545
Jon Ashburn1530c342016-02-26 13:14:27 -07001546 return false;
Ian Elliott2b8965a2016-03-24 13:59:22 -06001547}