blob: f9a82f54a6ab46653c8095f0e39634f04eab9859 [file] [log] [blame]
Ian Elliott54cea232015-10-30 15:28:23 -06001/*
2 *
3 * Copyright (C) 2015 Valve Corporation
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included
13 * in all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
22 *
23 * Author: Ian Elliott <ian@lunarg.com>
Ian Elliottb1849742015-11-19 11:58:08 -070024 * Author: Ian Elliott <ianelliott@google.com>
Ian Elliott54cea232015-10-30 15:28:23 -060025 */
26
27//#define _ISOC11_SOURCE /* for aligned_alloc() */
28#define _GNU_SOURCE
29#include <stdlib.h>
30#include <string.h>
31#include "vk_loader_platform.h"
32#include "loader.h"
33#include "wsi.h"
Ian Elliott7c352552015-11-19 13:14:05 -070034#include <vulkan/vk_icd.h>
Ian Elliott54cea232015-10-30 15:28:23 -060035
36static const VkExtensionProperties wsi_surface_extension_info = {
37 .extensionName = VK_KHR_SURFACE_EXTENSION_NAME,
Ian Elliott07eb3282015-12-10 17:28:50 -070038 .specVersion = VK_KHR_SURFACE_SPEC_VERSION,
Ian Elliott54cea232015-10-30 15:28:23 -060039};
40
Ian Elliottb1849742015-11-19 11:58:08 -070041#ifdef VK_USE_PLATFORM_WIN32_KHR
Ian Elliott54cea232015-10-30 15:28:23 -060042static const VkExtensionProperties wsi_win32_surface_extension_info = {
43 .extensionName = VK_KHR_WIN32_SURFACE_EXTENSION_NAME,
Ian Elliott07eb3282015-12-10 17:28:50 -070044 .specVersion = VK_KHR_WIN32_SURFACE_SPEC_VERSION,
Ian Elliott54cea232015-10-30 15:28:23 -060045};
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -070046#endif // VK_USE_PLATFORM_WIN32_KHR
47
Ian Elliott5fb891a2015-10-30 17:45:05 -060048#ifdef VK_USE_PLATFORM_MIR_KHR
Ian Elliott54cea232015-10-30 15:28:23 -060049static const VkExtensionProperties wsi_mir_surface_extension_info = {
50 .extensionName = VK_KHR_MIR_SURFACE_EXTENSION_NAME,
Ian Elliott07eb3282015-12-10 17:28:50 -070051 .specVersion = VK_KHR_MIR_SURFACE_SPEC_VERSION,
Ian Elliott54cea232015-10-30 15:28:23 -060052};
Ian Elliott5fb891a2015-10-30 17:45:05 -060053#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott54cea232015-10-30 15:28:23 -060054
Ian Elliott5fb891a2015-10-30 17:45:05 -060055#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott54cea232015-10-30 15:28:23 -060056static const VkExtensionProperties wsi_wayland_surface_extension_info = {
57 .extensionName = VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME,
Ian Elliott07eb3282015-12-10 17:28:50 -070058 .specVersion = VK_KHR_WAYLAND_SURFACE_SPEC_VERSION,
Ian Elliott54cea232015-10-30 15:28:23 -060059};
Ian Elliott5fb891a2015-10-30 17:45:05 -060060#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott54cea232015-10-30 15:28:23 -060061
Ian Elliott5fb891a2015-10-30 17:45:05 -060062#ifdef VK_USE_PLATFORM_XCB_KHR
Ian Elliott54cea232015-10-30 15:28:23 -060063static const VkExtensionProperties wsi_xcb_surface_extension_info = {
64 .extensionName = VK_KHR_XCB_SURFACE_EXTENSION_NAME,
Ian Elliott07eb3282015-12-10 17:28:50 -070065 .specVersion = VK_KHR_XCB_SURFACE_SPEC_VERSION,
Ian Elliott54cea232015-10-30 15:28:23 -060066};
Ian Elliott5fb891a2015-10-30 17:45:05 -060067#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott54cea232015-10-30 15:28:23 -060068
Ian Elliott5fb891a2015-10-30 17:45:05 -060069#ifdef VK_USE_PLATFORM_XLIB_KHR
Ian Elliott54cea232015-10-30 15:28:23 -060070static const VkExtensionProperties wsi_xlib_surface_extension_info = {
71 .extensionName = VK_KHR_XLIB_SURFACE_EXTENSION_NAME,
Ian Elliott07eb3282015-12-10 17:28:50 -070072 .specVersion = VK_KHR_XLIB_SURFACE_SPEC_VERSION,
Ian Elliott54cea232015-10-30 15:28:23 -060073};
Ian Elliott5fb891a2015-10-30 17:45:05 -060074#endif // VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -070075
76#ifdef VK_USE_PLATFORM_ANDROID_KHR
77static const VkExtensionProperties wsi_android_surface_extension_info = {
78 .extensionName = VK_KHR_ANDROID_SURFACE_EXTENSION_NAME,
79 .specVersion = VK_KHR_ANDROID_SURFACE_REVISION,
80};
81#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott54cea232015-10-30 15:28:23 -060082
83void wsi_add_instance_extensions(
84 const struct loader_instance *inst,
85 struct loader_extension_list *ext_list)
86{
87 loader_add_to_ext_list(inst, ext_list, 1, &wsi_surface_extension_info);
Ian Elliottb1849742015-11-19 11:58:08 -070088#ifdef VK_USE_PLATFORM_WIN32_KHR
Ian Elliott54cea232015-10-30 15:28:23 -060089 loader_add_to_ext_list(inst, ext_list, 1, &wsi_win32_surface_extension_info);
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -070090#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott5fb891a2015-10-30 17:45:05 -060091#ifdef VK_USE_PLATFORM_MIR_KHR
Ian Elliott54cea232015-10-30 15:28:23 -060092 loader_add_to_ext_list(inst, ext_list, 1, &wsi_mir_surface_extension_info);
Ian Elliott5fb891a2015-10-30 17:45:05 -060093#endif // VK_USE_PLATFORM_MIR_KHR
94#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott54cea232015-10-30 15:28:23 -060095 loader_add_to_ext_list(inst, ext_list, 1, &wsi_wayland_surface_extension_info);
Ian Elliott5fb891a2015-10-30 17:45:05 -060096#endif // VK_USE_PLATFORM_WAYLAND_KHR
97#ifdef VK_USE_PLATFORM_XCB_KHR
Ian Elliott54cea232015-10-30 15:28:23 -060098 loader_add_to_ext_list(inst, ext_list, 1, &wsi_xcb_surface_extension_info);
Ian Elliott5fb891a2015-10-30 17:45:05 -060099#endif // VK_USE_PLATFORM_XCB_KHR
100#ifdef VK_USE_PLATFORM_XLIB_KHR
Ian Elliott54cea232015-10-30 15:28:23 -0600101 loader_add_to_ext_list(inst, ext_list, 1, &wsi_xlib_surface_extension_info);
Ian Elliott5fb891a2015-10-30 17:45:05 -0600102#endif // VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -0700103#ifdef VK_USE_PLATFORM_ANDROID_KHR
104 loader_add_to_ext_list(inst, ext_list, 1, &wsi_android_surface_extension_info);
105#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott54cea232015-10-30 15:28:23 -0600106}
107
108void wsi_create_instance(
109 struct loader_instance *ptr_instance,
110 const VkInstanceCreateInfo *pCreateInfo)
111{
Ian Elliott5fb891a2015-10-30 17:45:05 -0600112 ptr_instance->wsi_surface_enabled = false;
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -0700113
114#ifdef VK_USE_PLATFORM_WIN32_KHR
Ian Elliott1693f592015-11-23 10:17:23 -0700115 ptr_instance->wsi_win32_surface_enabled = true;
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -0700116#endif // VK_USE_PLATFORM_WIN32_KHR
117#ifdef VK_USE_PLATFORM_MIR_KHR
Ian Elliott54cea232015-10-30 15:28:23 -0600118 ptr_instance->wsi_mir_surface_enabled = false;
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -0700119#endif // VK_USE_PLATFORM_MIR_KHR
120#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott54cea232015-10-30 15:28:23 -0600121 ptr_instance->wsi_wayland_surface_enabled = false;
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -0700122#endif // VK_USE_PLATFORM_WAYLAND_KHR
123#ifdef VK_USE_PLATFORM_XCB_KHR
Ian Elliott54cea232015-10-30 15:28:23 -0600124 ptr_instance->wsi_xcb_surface_enabled = false;
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -0700125#endif // VK_USE_PLATFORM_XCB_KHR
126#ifdef VK_USE_PLATFORM_XLIB_KHR
Ian Elliott54cea232015-10-30 15:28:23 -0600127 ptr_instance->wsi_xlib_surface_enabled = false;
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -0700128#endif // VK_USE_PLATFORM_XLIB_KHR
129#ifdef VK_USE_PLATFORM_ANDROID_KHR
130 ptr_instance->wsi_android_surface_enabled = false;
131#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott54cea232015-10-30 15:28:23 -0600132
133 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionNameCount; i++) {
134 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
135 ptr_instance->wsi_surface_enabled = true;
Ian Elliottb1849742015-11-19 11:58:08 -0700136 continue;
Ian Elliott54cea232015-10-30 15:28:23 -0600137 }
Ian Elliottb1849742015-11-19 11:58:08 -0700138#ifdef VK_USE_PLATFORM_WIN32_KHR
Ian Elliott54cea232015-10-30 15:28:23 -0600139 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
Ian Elliott1693f592015-11-23 10:17:23 -0700140 ptr_instance->wsi_win32_surface_enabled = true;
Ian Elliottb1849742015-11-19 11:58:08 -0700141 continue;
Ian Elliott54cea232015-10-30 15:28:23 -0600142 }
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -0700143#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott5fb891a2015-10-30 17:45:05 -0600144#ifdef VK_USE_PLATFORM_MIR_KHR
Ian Elliott54cea232015-10-30 15:28:23 -0600145 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
146 ptr_instance->wsi_mir_surface_enabled = true;
Ian Elliottb1849742015-11-19 11:58:08 -0700147 continue;
Ian Elliott54cea232015-10-30 15:28:23 -0600148 }
Ian Elliott5fb891a2015-10-30 17:45:05 -0600149#endif // VK_USE_PLATFORM_MIR_KHR
150#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott54cea232015-10-30 15:28:23 -0600151 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
152 ptr_instance->wsi_wayland_surface_enabled = true;
Ian Elliottb1849742015-11-19 11:58:08 -0700153 continue;
Ian Elliott54cea232015-10-30 15:28:23 -0600154 }
Ian Elliott5fb891a2015-10-30 17:45:05 -0600155#endif // VK_USE_PLATFORM_WAYLAND_KHR
156#ifdef VK_USE_PLATFORM_XCB_KHR
Ian Elliott54cea232015-10-30 15:28:23 -0600157 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
158 ptr_instance->wsi_xcb_surface_enabled = true;
Ian Elliottb1849742015-11-19 11:58:08 -0700159 continue;
Ian Elliott54cea232015-10-30 15:28:23 -0600160 }
Ian Elliott5fb891a2015-10-30 17:45:05 -0600161#endif // VK_USE_PLATFORM_XCB_KHR
162#ifdef VK_USE_PLATFORM_XLIB_KHR
Ian Elliott54cea232015-10-30 15:28:23 -0600163 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
164 ptr_instance->wsi_xlib_surface_enabled = true;
Ian Elliottb1849742015-11-19 11:58:08 -0700165 continue;
Ian Elliott54cea232015-10-30 15:28:23 -0600166 }
Ian Elliott5fb891a2015-10-30 17:45:05 -0600167#endif // VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -0700168#ifdef VK_USE_PLATFORM_ANDROID_KHR
169 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
170 ptr_instance->wsi_android_surface_enabled = true;
171 continue;
172 }
173#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott54cea232015-10-30 15:28:23 -0600174 }
175}
176
177/*
Ian Elliott7c352552015-11-19 13:14:05 -0700178 * Functions for the VK_KHR_surface extension:
179 */
180
181/*
182 * This is the trampoline entrypoint
183 * for DestroySurfaceKHR
Ian Elliott7c352552015-11-19 13:14:05 -0700184 */
185LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroySurfaceKHR(
186 VkInstance instance,
187 VkSurfaceKHR surface,
188 const VkAllocationCallbacks* pAllocator)
189{
Ian Elliottabf50662015-11-25 14:43:02 -0700190 const VkLayerInstanceDispatchTable *disp;
191 disp = loader_get_instance_dispatch(instance);
192 disp->DestroySurfaceKHR(instance, surface, pAllocator);
193}
194
195/*
196 * This is the instance chain terminator function
197 * for DestroySurfaceKHR
198 */
199VKAPI_ATTR void VKAPI_CALL loader_DestroySurfaceKHR(
200 VkInstance instance,
201 VkSurfaceKHR surface,
202 const VkAllocationCallbacks* pAllocator)
203{
Ian Elliott1693f592015-11-23 10:17:23 -0700204 struct loader_instance *ptr_instance = loader_get_instance(instance);
205
206 loader_heap_free(ptr_instance, surface);
Ian Elliott7c352552015-11-19 13:14:05 -0700207}
208
209/*
Ian Elliott54cea232015-10-30 15:28:23 -0600210 * This is the trampoline entrypoint
211 * for GetPhysicalDeviceSurfaceSupportKHR
212 */
Ian Elliottf3be00f2015-11-19 12:37:51 -0700213LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceSupportKHR(
Ian Elliott54cea232015-10-30 15:28:23 -0600214 VkPhysicalDevice physicalDevice,
215 uint32_t queueFamilyIndex,
216 VkSurfaceKHR surface,
217 VkBool32* pSupported)
218{
219 const VkLayerInstanceDispatchTable *disp;
220 disp = loader_get_instance_dispatch(physicalDevice);
221 VkResult res = disp->GetPhysicalDeviceSurfaceSupportKHR(
222 physicalDevice,
223 queueFamilyIndex,
224 surface,
225 pSupported);
226 return res;
227}
228
229/*
230 * This is the instance chain terminator function
231 * for GetPhysicalDeviceSurfaceSupportKHR
232 */
233VKAPI_ATTR VkResult VKAPI_CALL loader_GetPhysicalDeviceSurfaceSupportKHR(
234 VkPhysicalDevice physicalDevice,
235 uint32_t queueFamilyIndex,
236 VkSurfaceKHR surface,
237 VkBool32* pSupported)
238{
239 struct loader_physical_device *phys_dev = (struct loader_physical_device *) physicalDevice;
240 struct loader_icd *icd = phys_dev->this_icd;
241
242 assert(pSupported && "GetPhysicalDeviceSurfaceSupportKHR: Error, null pSupported");
243 *pSupported = false;
244
245 assert(icd->GetPhysicalDeviceSurfaceSupportKHR && "loader: null GetPhysicalDeviceSurfaceSupportKHR ICD pointer");
246
247 return icd->GetPhysicalDeviceSurfaceSupportKHR(phys_dev->phys_dev,
248 queueFamilyIndex,
249 surface,
250 pSupported);
251}
252
Ian Elliottea666b22015-11-19 16:05:09 -0700253/*
254 * This is the trampoline entrypoint
255 * for GetPhysicalDeviceSurfaceCapabilitiesKHR
256 */
257LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
258 VkPhysicalDevice physicalDevice,
259 VkSurfaceKHR surface,
260 VkSurfaceCapabilitiesKHR* pSurfaceCapabilities)
261{
262 const VkLayerInstanceDispatchTable *disp;
263 disp = loader_get_instance_dispatch(physicalDevice);
264 VkResult res = disp->GetPhysicalDeviceSurfaceCapabilitiesKHR(
265 physicalDevice,
266 surface,
267 pSurfaceCapabilities);
268 return res;
269}
270
271/*
272 * This is the instance chain terminator function
273 * for GetPhysicalDeviceSurfaceCapabilitiesKHR
274 */
275VKAPI_ATTR VkResult VKAPI_CALL loader_GetPhysicalDeviceSurfaceCapabilitiesKHR(
276 VkPhysicalDevice physicalDevice,
277 VkSurfaceKHR surface,
278 VkSurfaceCapabilitiesKHR* pSurfaceCapabilities)
279{
280 struct loader_physical_device *phys_dev = (struct loader_physical_device *) physicalDevice;
281 struct loader_icd *icd = phys_dev->this_icd;
282
283 assert(pSurfaceCapabilities && "GetPhysicalDeviceSurfaceCapabilitiesKHR: Error, null pSurfaceCapabilities");
284
285 assert(icd->GetPhysicalDeviceSurfaceCapabilitiesKHR && "loader: null GetPhysicalDeviceSurfaceCapabilitiesKHR ICD pointer");
286
287 return icd->GetPhysicalDeviceSurfaceCapabilitiesKHR(phys_dev->phys_dev,
288 surface,
289 pSurfaceCapabilities);
290}
291
292/*
293 * This is the trampoline entrypoint
294 * for GetPhysicalDeviceSurfaceFormatsKHR
295 */
296LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceFormatsKHR(
297 VkPhysicalDevice physicalDevice,
298 VkSurfaceKHR surface,
299 uint32_t* pSurfaceFormatCount,
300 VkSurfaceFormatKHR* pSurfaceFormats)
301{
302 const VkLayerInstanceDispatchTable *disp;
303 disp = loader_get_instance_dispatch(physicalDevice);
304 VkResult res = disp->GetPhysicalDeviceSurfaceFormatsKHR(
305 physicalDevice,
306 surface,
307 pSurfaceFormatCount,
308 pSurfaceFormats);
309 return res;
310}
311
312/*
313 * This is the instance chain terminator function
314 * for GetPhysicalDeviceSurfaceFormatsKHR
315 */
316VKAPI_ATTR VkResult VKAPI_CALL loader_GetPhysicalDeviceSurfaceFormatsKHR(
317 VkPhysicalDevice physicalDevice,
318 VkSurfaceKHR surface,
319 uint32_t* pSurfaceFormatCount,
320 VkSurfaceFormatKHR* pSurfaceFormats)
321{
322 struct loader_physical_device *phys_dev = (struct loader_physical_device *) physicalDevice;
323 struct loader_icd *icd = phys_dev->this_icd;
324
325 assert(pSurfaceFormatCount && "GetPhysicalDeviceSurfaceFormatsKHR: Error, null pSurfaceFormatCount");
326
327 assert(icd->GetPhysicalDeviceSurfaceFormatsKHR && "loader: null GetPhysicalDeviceSurfaceFormatsKHR ICD pointer");
328
329 return icd->GetPhysicalDeviceSurfaceFormatsKHR(phys_dev->phys_dev,
330 surface,
331 pSurfaceFormatCount,
332 pSurfaceFormats);
333}
334
335/*
336 * This is the trampoline entrypoint
337 * for GetPhysicalDeviceSurfacePresentModesKHR
338 */
339LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfacePresentModesKHR(
340 VkPhysicalDevice physicalDevice,
341 VkSurfaceKHR surface,
342 uint32_t* pPresentModeCount,
343 VkPresentModeKHR* pPresentModes)
344{
345 const VkLayerInstanceDispatchTable *disp;
346 disp = loader_get_instance_dispatch(physicalDevice);
347 VkResult res = disp->GetPhysicalDeviceSurfacePresentModesKHR(
348 physicalDevice,
349 surface,
350 pPresentModeCount,
351 pPresentModes);
352 return res;
353}
354
355/*
356 * This is the instance chain terminator function
357 * for GetPhysicalDeviceSurfacePresentModesKHR
358 */
359VKAPI_ATTR VkResult VKAPI_CALL loader_GetPhysicalDeviceSurfacePresentModesKHR(
360 VkPhysicalDevice physicalDevice,
361 VkSurfaceKHR surface,
362 uint32_t* pPresentModeCount,
363 VkPresentModeKHR* pPresentModes)
364{
365 struct loader_physical_device *phys_dev = (struct loader_physical_device *) physicalDevice;
366 struct loader_icd *icd = phys_dev->this_icd;
367
368 assert(pPresentModeCount && "GetPhysicalDeviceSurfacePresentModesKHR: Error, null pPresentModeCount");
369
370 assert(icd->GetPhysicalDeviceSurfacePresentModesKHR && "loader: null GetPhysicalDeviceSurfacePresentModesKHR ICD pointer");
371
372 return icd->GetPhysicalDeviceSurfacePresentModesKHR(phys_dev->phys_dev,
373 surface,
374 pPresentModeCount,
375 pPresentModes);
376}
377
Ian Elliott7c352552015-11-19 13:14:05 -0700378
Ian Elliott7c352552015-11-19 13:14:05 -0700379/*
380 * Functions for the VK_KHR_swapchain extension:
381 */
382
Ian Elliott9b89a472015-11-19 16:39:21 -0700383/*
384 * This is the trampoline entrypoint
385 * for CreateSwapchainKHR
386 */
387LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSwapchainKHR(
388 VkDevice device,
389 const VkSwapchainCreateInfoKHR* pCreateInfo,
390 const VkAllocationCallbacks* pAllocator,
391 VkSwapchainKHR* pSwapchain)
392{
393 const VkLayerDispatchTable *disp;
394 disp = loader_get_dispatch(device);
395 VkResult res = disp->CreateSwapchainKHR(
396 device,
397 pCreateInfo,
398 pAllocator,
399 pSwapchain);
400 return res;
401}
Ian Elliott7c352552015-11-19 13:14:05 -0700402
Ian Elliott9b89a472015-11-19 16:39:21 -0700403/*
404 * This is the trampoline entrypoint
405 * for DestroySwapchainKHR
406 */
407LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroySwapchainKHR(
408 VkDevice device,
409 VkSwapchainKHR swapchain,
410 const VkAllocationCallbacks* pAllocator)
411{
412 const VkLayerDispatchTable *disp;
413 disp = loader_get_dispatch(device);
414 disp->DestroySwapchainKHR(device, swapchain, pAllocator);
415}
Ian Elliott7c352552015-11-19 13:14:05 -0700416
Ian Elliott9b89a472015-11-19 16:39:21 -0700417/*
418 * This is the trampoline entrypoint
419 * for GetSwapchainImagesKHR
420 */
421LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainImagesKHR(
422 VkDevice device,
423 VkSwapchainKHR swapchain,
424 uint32_t* pSwapchainImageCount,
425 VkImage* pSwapchainImages)
426{
427 const VkLayerDispatchTable *disp;
428 disp = loader_get_dispatch(device);
429 VkResult res = disp->GetSwapchainImagesKHR(
430 device,
431 swapchain,
432 pSwapchainImageCount,
433 pSwapchainImages);
434 return res;
435}
436
437/*
438 * This is the trampoline entrypoint
439 * for AcquireNextImageKHR
440 */
441LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImageKHR(
442 VkDevice device,
443 VkSwapchainKHR swapchain,
444 uint64_t timeout,
445 VkSemaphore semaphore,
446 VkFence fence,
447 uint32_t* pImageIndex)
448{
449 const VkLayerDispatchTable *disp;
450 disp = loader_get_dispatch(device);
451 VkResult res = disp->AcquireNextImageKHR(
452 device,
453 swapchain,
454 timeout,
455 semaphore,
456 fence,
457 pImageIndex);
458 return res;
459}
460
461/*
462 * This is the trampoline entrypoint
463 * for QueuePresentKHR
464 */
465LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueuePresentKHR(
466 VkQueue queue,
467 const VkPresentInfoKHR* pPresentInfo)
468{
469 const VkLayerDispatchTable *disp;
470 disp = loader_get_dispatch(queue);
471 VkResult res = disp->QueuePresentKHR(queue, pPresentInfo);
472 return res;
473}
Ian Elliott7c352552015-11-19 13:14:05 -0700474
475
Ian Elliott7c352552015-11-19 13:14:05 -0700476#ifdef VK_USE_PLATFORM_WIN32_KHR
477
478/*
479 * Functions for the VK_KHR_win32_surface extension:
480 */
481
482/*
483 * This is the trampoline entrypoint
484 * for CreateWin32SurfaceKHR
485 */
486LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateWin32SurfaceKHR(
487 VkInstance instance,
Ian Elliott07eb3282015-12-10 17:28:50 -0700488 const VkWin32SurfaceCreateInfoKHR* pCreateInfo,
Ian Elliott7c352552015-11-19 13:14:05 -0700489 const VkAllocationCallbacks* pAllocator,
490 VkSurfaceKHR* pSurface)
491{
Jon Ashburn16edfa62015-11-25 17:55:49 -0700492 const VkLayerInstanceDispatchTable *disp;
493 disp = loader_get_instance_dispatch(instance);
494 VkResult res;
495
Ian Elliott07eb3282015-12-10 17:28:50 -0700496 res = disp->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburn16edfa62015-11-25 17:55:49 -0700497 return res;
498}
499
500/*
501 * This is the instance chain terminator function
502 * for CreateWin32SurfaceKHR
503 */
504VKAPI_ATTR VkResult VKAPI_CALL loader_CreateWin32SurfaceKHR(
505 VkInstance instance,
Ian Elliott07eb3282015-12-10 17:28:50 -0700506 const VkWin32SurfaceCreateInfoKHR* pCreateInfo,
Jon Ashburn16edfa62015-11-25 17:55:49 -0700507 const VkAllocationCallbacks* pAllocator,
508 VkSurfaceKHR* pSurface)
509{
Ian Elliott1693f592015-11-23 10:17:23 -0700510 struct loader_instance *ptr_instance = loader_get_instance(instance);
Ian Elliott7c352552015-11-19 13:14:05 -0700511 VkIcdSurfaceWin32 *pIcdSurface = NULL;
512
Ian Elliott1693f592015-11-23 10:17:23 -0700513 pIcdSurface = loader_heap_alloc(ptr_instance,
514 sizeof(VkIcdSurfaceWin32),
515 VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
Ian Elliott7c352552015-11-19 13:14:05 -0700516 if (pIcdSurface == NULL) {
517 return VK_ERROR_OUT_OF_HOST_MEMORY;
518 }
519
520 pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_WIN32;
Ian Elliott07eb3282015-12-10 17:28:50 -0700521 pIcdSurface->hinstance = pCreateInfo->hinstance;
522 pIcdSurface->hwnd = pCreateInfo->hwnd;
Ian Elliott7c352552015-11-19 13:14:05 -0700523
524 *pSurface = (VkSurfaceKHR) pIcdSurface;
525
526 return VK_SUCCESS;
527}
Ian Elliotte851dd62015-11-24 15:39:10 -0700528
529/*
530 * This is the trampoline entrypoint
531 * for GetPhysicalDeviceWin32PresentationSupportKHR
532 */
533LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWin32PresentationSupportKHR(
534 VkPhysicalDevice physicalDevice,
535 uint32_t queueFamilyIndex)
536{
537 const VkLayerInstanceDispatchTable *disp;
538 disp = loader_get_instance_dispatch(physicalDevice);
539 VkBool32 res = disp->GetPhysicalDeviceWin32PresentationSupportKHR(
540 physicalDevice,
541 queueFamilyIndex);
542 return res;
543}
544
545
546/*
547 * This is the instance chain terminator function
548 * for GetPhysicalDeviceWin32PresentationSupportKHR
549 */
550VKAPI_ATTR VkBool32 VKAPI_CALL loader_GetPhysicalDeviceWin32PresentationSupportKHR(
551 VkPhysicalDevice physicalDevice,
552 uint32_t queueFamilyIndex)
553{
554 struct loader_physical_device *phys_dev = (struct loader_physical_device *) physicalDevice;
555 struct loader_icd *icd = phys_dev->this_icd;
556
Mark Lobodzinski3b8c1492015-11-24 15:49:46 -0700557 assert(icd->GetPhysicalDeviceWin32PresentationSupportKHR && "loader: null GetPhysicalDeviceWin32PresentationSupportKHR ICD pointer");
Ian Elliotte851dd62015-11-24 15:39:10 -0700558
559 return icd->GetPhysicalDeviceWin32PresentationSupportKHR(phys_dev->phys_dev,
560 queueFamilyIndex);
561}
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -0700562#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott7c352552015-11-19 13:14:05 -0700563
564#ifdef VK_USE_PLATFORM_MIR_KHR
565
566/*
567 * Functions for the VK_KHR_mir_surface extension:
568 */
569
570/*
571 * This is the trampoline entrypoint
572 * for CreateMirSurfaceKHR
573 */
574LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateMirSurfaceKHR(
575 VkInstance instance,
Ian Elliott07eb3282015-12-10 17:28:50 -0700576 const VkMirSurfaceCreateInfoKHR* pCreateInfo,
Ian Elliott7c352552015-11-19 13:14:05 -0700577 const VkAllocationCallbacks* pAllocator,
578 VkSurfaceKHR* pSurface)
579{
Jon Ashburn16edfa62015-11-25 17:55:49 -0700580 const VkLayerInstanceDispatchTable *disp;
581 disp = loader_get_instance_dispatch(instance);
582 VkResult res;
583
Ian Elliott07eb3282015-12-10 17:28:50 -0700584 res = disp->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburn16edfa62015-11-25 17:55:49 -0700585 return res;
586}
587
588/*
589 * This is the instance chain terminator function
590 * for CreateMirSurfaceKHR
591 */
592VKAPI_ATTR VkResult VKAPI_CALL loader_CreateMirSurfaceKHR(
593 VkInstance instance,
Ian Elliott07eb3282015-12-10 17:28:50 -0700594 const VkMirSurfaceCreateInfoKHR* pCreateInfo,
Jon Ashburn16edfa62015-11-25 17:55:49 -0700595 const VkAllocationCallbacks* pAllocator,
596 VkSurfaceKHR* pSurface)
597{
Ian Elliott1693f592015-11-23 10:17:23 -0700598 struct loader_instance *ptr_instance = loader_get_instance(instance);
Ian Elliott7c352552015-11-19 13:14:05 -0700599 VkIcdSurfaceMir *pIcdSurface = NULL;
600
Ian Elliott1693f592015-11-23 10:17:23 -0700601 pIcdSurface = loader_heap_alloc(ptr_instance,
602 sizeof(VkIcdSurfaceMir),
603 VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
Ian Elliott7c352552015-11-19 13:14:05 -0700604 if (pIcdSurface == NULL) {
605 return VK_ERROR_OUT_OF_HOST_MEMORY;
606 }
607
608 pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_MIR;
Ian Elliott07eb3282015-12-10 17:28:50 -0700609 pIcdSurface->connection = pCreateInfo->connection;
610 pIcdSurface->mirSurface = pCreateInfo->mirSurface;
Ian Elliott7c352552015-11-19 13:14:05 -0700611
612 *pSurface = (VkSurfaceKHR) pIcdSurface;
613
614 return VK_SUCCESS;
615}
Ian Elliotte851dd62015-11-24 15:39:10 -0700616
617/*
618 * This is the trampoline entrypoint
619 * for GetPhysicalDeviceMirPresentationSupportKHR
620 */
621LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceMirPresentationSupportKHR(
622 VkPhysicalDevice physicalDevice,
623 uint32_t queueFamilyIndex,
624 MirConnection* connection)
625{
626 const VkLayerInstanceDispatchTable *disp;
627 disp = loader_get_instance_dispatch(physicalDevice);
628 VkBool32 res = disp->GetPhysicalDeviceMirPresentationSupportKHR(
629 physicalDevice,
630 queueFamilyIndex,
631 connection);
632 return res;
633}
634
635
636/*
637 * This is the instance chain terminator function
638 * for GetPhysicalDeviceMirPresentationSupportKHR
639 */
640VKAPI_ATTR VkBool32 VKAPI_CALL loader_GetPhysicalDeviceMirPresentationSupportKHR(
641 VkPhysicalDevice physicalDevice,
642 uint32_t queueFamilyIndex,
643 MirConnection* connection)
644{
645 struct loader_physical_device *phys_dev = (struct loader_physical_device *) physicalDevice;
646 struct loader_icd *icd = phys_dev->this_icd;
647
648 assert(icd->GetPhysicalDeviceMirPresentationSupportKHR && "loader: null GetPhysicalDeviceMirPresentationSupportKHR ICD pointer");
649
650 return icd->GetPhysicalDeviceMirPresentationSupportKHR(phys_dev->phys_dev,
651 queueFamilyIndex,
652 connection);
653}
Ian Elliott7c352552015-11-19 13:14:05 -0700654#endif // VK_USE_PLATFORM_MIR_KHR
655
656#ifdef VK_USE_PLATFORM_WAYLAND_KHR
657
658/*
659 * Functions for the VK_KHR_wayland_surface extension:
660 */
661
662/*
663 * This is the trampoline entrypoint
664 * for CreateWaylandSurfaceKHR
665 */
666LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateWaylandSurfaceKHR(
667 VkInstance instance,
Ian Elliott07eb3282015-12-10 17:28:50 -0700668 const VkMirSurfaceCreateInfoKHR* pCreateInfo,
Ian Elliott7c352552015-11-19 13:14:05 -0700669 const VkAllocationCallbacks* pAllocator,
670 VkSurfaceKHR* pSurface)
671{
Jon Ashburn16edfa62015-11-25 17:55:49 -0700672 const VkLayerInstanceDispatchTable *disp;
673 disp = loader_get_instance_dispatch(instance);
674 VkResult res;
675
Ian Elliott07eb3282015-12-10 17:28:50 -0700676 res = disp->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburn16edfa62015-11-25 17:55:49 -0700677 return res;
678}
679
680/*
681 * This is the instance chain terminator function
682 * for CreateXlibSurfaceKHR
683 */
684VKAPI_ATTR VkResult VKAPI_CALL loader_CreateWaylandSurfaceKHR(
685 VkInstance instance,
Ian Elliott07eb3282015-12-10 17:28:50 -0700686 const VkMirSurfaceCreateInfoKHR* pCreateInfo,
Jon Ashburn16edfa62015-11-25 17:55:49 -0700687 const VkAllocationCallbacks* pAllocator,
688 VkSurfaceKHR* pSurface)
689{
Ian Elliott1693f592015-11-23 10:17:23 -0700690 struct loader_instance *ptr_instance = loader_get_instance(instance);
Ian Elliott7c352552015-11-19 13:14:05 -0700691 VkIcdSurfaceWayland *pIcdSurface = NULL;
692
Ian Elliott1693f592015-11-23 10:17:23 -0700693 pIcdSurface = loader_heap_alloc(ptr_instance,
694 sizeof(VkIcdSurfaceWayland),
695 VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
Ian Elliott7c352552015-11-19 13:14:05 -0700696 if (pIcdSurface == NULL) {
697 return VK_ERROR_OUT_OF_HOST_MEMORY;
698 }
699
700 pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_WAYLAND;
Ian Elliott07eb3282015-12-10 17:28:50 -0700701 pIcdSurface->display = pCreateInfo->display;
702 pIcdSurface->surface = pCreateInfo->surface;
Ian Elliott7c352552015-11-19 13:14:05 -0700703
704 *pSurface = (VkSurfaceKHR) pIcdSurface;
705
706 return VK_SUCCESS;
707}
Ian Elliotte851dd62015-11-24 15:39:10 -0700708
709/*
710 * This is the trampoline entrypoint
711 * for GetPhysicalDeviceWaylandPresentationSupportKHR
712 */
713LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWaylandPresentationSupportKHR(
714 VkPhysicalDevice physicalDevice,
715 uint32_t queueFamilyIndex,
716 struct wl_display* display)
717{
718 const VkLayerInstanceDispatchTable *disp;
719 disp = loader_get_instance_dispatch(physicalDevice);
720 VkBool32 res = disp->GetPhysicalDeviceWaylandPresentationSupportKHR(
721 physicalDevice,
722 queueFamilyIndex,
723 display);
724 return res;
725}
726
727
728/*
729 * This is the instance chain terminator function
730 * for GetPhysicalDeviceWaylandPresentationSupportKHR
731 */
732VKAPI_ATTR VkBool32 VKAPI_CALL loader_GetPhysicalDeviceWaylandPresentationSupportKHR(
733 VkPhysicalDevice physicalDevice,
734 uint32_t queueFamilyIndex,
735 struct wl_display* display)
736{
737 struct loader_physical_device *phys_dev = (struct loader_physical_device *) physicalDevice;
738 struct loader_icd *icd = phys_dev->this_icd;
739
740 assert(icd->GetPhysicalDeviceWaylandPresentationSupportKHR && "loader: null GetPhysicalDeviceWaylandPresentationSupportKHR ICD pointer");
741
742 return icd->GetPhysicalDeviceWaylandPresentationSupportKHR(phys_dev->phys_dev,
743 queueFamilyIndex,
744 display);
745}
Ian Elliott7c352552015-11-19 13:14:05 -0700746#endif // VK_USE_PLATFORM_WAYLAND_KHR
747
748#ifdef VK_USE_PLATFORM_XCB_KHR
749
750/*
751 * Functions for the VK_KHR_xcb_surface extension:
752 */
753
754/*
755 * This is the trampoline entrypoint
756 * for CreateXcbSurfaceKHR
757 */
758LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateXcbSurfaceKHR(
759 VkInstance instance,
Ian Elliott07eb3282015-12-10 17:28:50 -0700760 const VkXcbSurfaceCreateInfoKHR* pCreateInfo,
Ian Elliott7c352552015-11-19 13:14:05 -0700761 const VkAllocationCallbacks* pAllocator,
762 VkSurfaceKHR* pSurface)
763{
Jon Ashburn16edfa62015-11-25 17:55:49 -0700764 const VkLayerInstanceDispatchTable *disp;
765 disp = loader_get_instance_dispatch(instance);
766 VkResult res;
767
Ian Elliott07eb3282015-12-10 17:28:50 -0700768 res = disp->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburn16edfa62015-11-25 17:55:49 -0700769 return res;
770}
771
772/*
773 * This is the instance chain terminator function
774 * for CreateXcbSurfaceKHR
775 */
776VKAPI_ATTR VkResult VKAPI_CALL loader_CreateXcbSurfaceKHR(
777 VkInstance instance,
Ian Elliott07eb3282015-12-10 17:28:50 -0700778 const VkXcbSurfaceCreateInfoKHR* pCreateInfo,
Jon Ashburn16edfa62015-11-25 17:55:49 -0700779 const VkAllocationCallbacks* pAllocator,
780 VkSurfaceKHR* pSurface)
781{
Ian Elliott1693f592015-11-23 10:17:23 -0700782 struct loader_instance *ptr_instance = loader_get_instance(instance);
Ian Elliott7c352552015-11-19 13:14:05 -0700783 VkIcdSurfaceXcb *pIcdSurface = NULL;
784
Ian Elliott1693f592015-11-23 10:17:23 -0700785 pIcdSurface = loader_heap_alloc(ptr_instance,
786 sizeof(VkIcdSurfaceXcb),
787 VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
Ian Elliott7c352552015-11-19 13:14:05 -0700788 if (pIcdSurface == NULL) {
789 return VK_ERROR_OUT_OF_HOST_MEMORY;
790 }
791
792 pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_XCB;
Ian Elliott07eb3282015-12-10 17:28:50 -0700793 pIcdSurface->connection = pCreateInfo->connection;
794 pIcdSurface->window = pCreateInfo->window;
Ian Elliott7c352552015-11-19 13:14:05 -0700795
796 *pSurface = (VkSurfaceKHR) pIcdSurface;
797
798 return VK_SUCCESS;
799}
Ian Elliotte851dd62015-11-24 15:39:10 -0700800
801/*
802 * This is the trampoline entrypoint
803 * for GetPhysicalDeviceXcbPresentationSupportKHR
804 */
805LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXcbPresentationSupportKHR(
806 VkPhysicalDevice physicalDevice,
807 uint32_t queueFamilyIndex,
808 xcb_connection_t* connection,
809 xcb_visualid_t visual_id)
810{
811 const VkLayerInstanceDispatchTable *disp;
812 disp = loader_get_instance_dispatch(physicalDevice);
813 VkBool32 res = disp->GetPhysicalDeviceXcbPresentationSupportKHR(
814 physicalDevice,
815 queueFamilyIndex,
816 connection,
817 visual_id);
818 return res;
819}
820
821
822/*
823 * This is the instance chain terminator function
824 * for GetPhysicalDeviceXcbPresentationSupportKHR
825 */
826VKAPI_ATTR VkBool32 VKAPI_CALL loader_GetPhysicalDeviceXcbPresentationSupportKHR(
827 VkPhysicalDevice physicalDevice,
828 uint32_t queueFamilyIndex,
829 xcb_connection_t* connection,
830 xcb_visualid_t visual_id)
831{
832 struct loader_physical_device *phys_dev = (struct loader_physical_device *) physicalDevice;
833 struct loader_icd *icd = phys_dev->this_icd;
834
835 assert(icd->GetPhysicalDeviceXcbPresentationSupportKHR && "loader: null GetPhysicalDeviceXcbPresentationSupportKHR ICD pointer");
836
837 return icd->GetPhysicalDeviceXcbPresentationSupportKHR(phys_dev->phys_dev,
838 queueFamilyIndex,
839 connection,
840 visual_id);
841}
Ian Elliott7c352552015-11-19 13:14:05 -0700842#endif // VK_USE_PLATFORM_XCB_KHR
843
844#ifdef VK_USE_PLATFORM_XLIB_KHR
845
846/*
847 * Functions for the VK_KHR_xlib_surface extension:
848 */
849
850/*
851 * This is the trampoline entrypoint
852 * for CreateXlibSurfaceKHR
853 */
854LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateXlibSurfaceKHR(
855 VkInstance instance,
Ian Elliott07eb3282015-12-10 17:28:50 -0700856 const VkXlibSurfaceCreateInfoKHR* pCreateInfo,
Ian Elliott7c352552015-11-19 13:14:05 -0700857 const VkAllocationCallbacks* pAllocator,
858 VkSurfaceKHR* pSurface)
859{
Jon Ashburn16edfa62015-11-25 17:55:49 -0700860 const VkLayerInstanceDispatchTable *disp;
861 disp = loader_get_instance_dispatch(instance);
862 VkResult res;
863
Ian Elliott07eb3282015-12-10 17:28:50 -0700864 res = disp->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Jon Ashburn16edfa62015-11-25 17:55:49 -0700865 return res;
866}
867
868/*
869 * This is the instance chain terminator function
870 * for CreateXlibSurfaceKHR
871 */
872VKAPI_ATTR VkResult VKAPI_CALL loader_CreateXlibSurfaceKHR(
873 VkInstance instance,
Ian Elliott07eb3282015-12-10 17:28:50 -0700874 const VkXlibSurfaceCreateInfoKHR* pCreateInfo,
Jon Ashburn16edfa62015-11-25 17:55:49 -0700875 const VkAllocationCallbacks* pAllocator,
876 VkSurfaceKHR* pSurface)
877{
Ian Elliott1693f592015-11-23 10:17:23 -0700878 struct loader_instance *ptr_instance = loader_get_instance(instance);
Ian Elliott7c352552015-11-19 13:14:05 -0700879 VkIcdSurfaceXlib *pIcdSurface = NULL;
880
Ian Elliott1693f592015-11-23 10:17:23 -0700881 pIcdSurface = loader_heap_alloc(ptr_instance,
882 sizeof(VkIcdSurfaceXlib),
883 VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
Ian Elliott7c352552015-11-19 13:14:05 -0700884 if (pIcdSurface == NULL) {
885 return VK_ERROR_OUT_OF_HOST_MEMORY;
886 }
887
888 pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_XLIB;
Ian Elliott07eb3282015-12-10 17:28:50 -0700889 pIcdSurface->dpy = pCreateInfo->dpy;
890 pIcdSurface->window = pCreateInfo->window;
Ian Elliott7c352552015-11-19 13:14:05 -0700891
892 *pSurface = (VkSurfaceKHR) pIcdSurface;
893
894 return VK_SUCCESS;
895}
Ian Elliotte851dd62015-11-24 15:39:10 -0700896
897/*
898 * This is the trampoline entrypoint
899 * for GetPhysicalDeviceXlibPresentationSupportKHR
900 */
901LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXlibPresentationSupportKHR(
902 VkPhysicalDevice physicalDevice,
903 uint32_t queueFamilyIndex,
904 Display* dpy,
905 VisualID visualID)
906{
907 const VkLayerInstanceDispatchTable *disp;
908 disp = loader_get_instance_dispatch(physicalDevice);
909 VkBool32 res = disp->GetPhysicalDeviceXlibPresentationSupportKHR(
910 physicalDevice,
911 queueFamilyIndex,
912 dpy,
913 visualID);
914 return res;
915}
916
917
918/*
919 * This is the instance chain terminator function
920 * for GetPhysicalDeviceXlibPresentationSupportKHR
921 */
922VKAPI_ATTR VkBool32 VKAPI_CALL loader_GetPhysicalDeviceXlibPresentationSupportKHR(
923 VkPhysicalDevice physicalDevice,
924 uint32_t queueFamilyIndex,
925 Display* dpy,
926 VisualID visualID)
927{
928 struct loader_physical_device *phys_dev = (struct loader_physical_device *) physicalDevice;
929 struct loader_icd *icd = phys_dev->this_icd;
930
931 assert(icd->GetPhysicalDeviceXlibPresentationSupportKHR && "loader: null GetPhysicalDeviceXlibPresentationSupportKHR ICD pointer");
932
933 return icd->GetPhysicalDeviceXlibPresentationSupportKHR(phys_dev->phys_dev,
934 queueFamilyIndex,
935 dpy,
936 visualID);
937}
Ian Elliott7c352552015-11-19 13:14:05 -0700938#endif // VK_USE_PLATFORM_XLIB_KHR
939
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -0700940#ifdef VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott7c352552015-11-19 13:14:05 -0700941
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -0700942/*
943 * Functions for the VK_KHR_android_surface extension:
944 */
945
946/*
947 * This is the trampoline entrypoint
948 * for CreateAndroidSurfaceKHR
949 */
950LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateAndroidSurfaceKHR(
951 VkInstance instance,
952 ANativeWindow* window,
953 const VkAllocationCallbacks* pAllocator,
954 VkSurfaceKHR* pSurface)
955{
956 const VkLayerInstanceDispatchTable *disp;
957 disp = loader_get_instance_dispatch(instance);
958 VkResult res;
959
960 res = disp->CreateAndroidSurfaceKHR(instance, window, pAllocator, pSurface);
961 return res;
962}
963
964/*
965 * This is the instance chain terminator function
966 * for CreateAndroidSurfaceKHR
967 */
968VKAPI_ATTR VkResult VKAPI_CALL loader_CreateAndroidSurfaceKHR(
969 VkInstance instance,
970 Window window,
971 const VkAllocationCallbacks* pAllocator,
972 VkSurfaceKHR* pSurface)
973{
974 struct loader_instance *ptr_instance = loader_get_instance(instance);
975 VkIcdSurfaceAndroid *pIcdSurface = NULL;
976
977 pIcdSurface = loader_heap_alloc(ptr_instance,
978 sizeof(VkIcdSurfaceAndroid),
979 VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
980 if (pIcdSurface == NULL) {
981 return VK_ERROR_OUT_OF_HOST_MEMORY;
982 }
983
984 pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_ANDROID;
985 pIcdSurface->dpy = dpy;
986 pIcdSurface->window = window;
987
988 *pSurface = (VkSurfaceKHR) pIcdSurface;
989
990 return VK_SUCCESS;
991}
992
993#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott7c352552015-11-19 13:14:05 -0700994
Ian Elliott54cea232015-10-30 15:28:23 -0600995bool wsi_swapchain_instance_gpa(struct loader_instance *ptr_instance,
996 const char* name, void **addr)
997{
998 *addr = NULL;
999
Ian Elliott9b89a472015-11-19 16:39:21 -07001000 /*
1001 * Functions for the VK_KHR_surface extension:
1002 */
Ian Elliott7c352552015-11-19 13:14:05 -07001003 if (!strcmp("vkDestroySurfaceKHR", name)) {
1004 *addr = ptr_instance->wsi_surface_enabled ? (void *) vkDestroySurfaceKHR : NULL;
1005 return true;
1006 }
Ian Elliott54cea232015-10-30 15:28:23 -06001007 if (!strcmp("vkGetPhysicalDeviceSurfaceSupportKHR", name)) {
Ian Elliottf3be00f2015-11-19 12:37:51 -07001008 *addr = ptr_instance->wsi_surface_enabled ? (void *) vkGetPhysicalDeviceSurfaceSupportKHR : NULL;
Ian Elliott54cea232015-10-30 15:28:23 -06001009 return true;
1010 }
Ian Elliottea666b22015-11-19 16:05:09 -07001011 if (!strcmp("vkGetPhysicalDeviceSurfaceCapabilitiesKHR", name)) {
1012 *addr = ptr_instance->wsi_surface_enabled ? (void *) vkGetPhysicalDeviceSurfaceCapabilitiesKHR : NULL;
1013 return true;
1014 }
1015 if (!strcmp("vkGetPhysicalDeviceSurfaceFormatsKHR", name)) {
1016 *addr = ptr_instance->wsi_surface_enabled ? (void *) vkGetPhysicalDeviceSurfaceFormatsKHR : NULL;
1017 return true;
1018 }
1019 if (!strcmp("vkGetPhysicalDeviceSurfacePresentModesKHR", name)) {
1020 *addr = ptr_instance->wsi_surface_enabled ? (void *) vkGetPhysicalDeviceSurfacePresentModesKHR : NULL;
1021 return true;
1022 }
Ian Elliott9b89a472015-11-19 16:39:21 -07001023
1024 /*
1025 * Functions for the VK_KHR_swapchain extension:
1026 *
1027 * Note: This is a device extension, and its functions are statically
1028 * exported from the loader. Per Khronos decisions, the the loader's GIPA
1029 * function will return the trampoline function for such device-extension
1030 * functions, regardless of whether the extension has been enabled.
1031 */
1032 if (!strcmp("vkCreateSwapchainKHR", name)) {
1033 *addr = (void *) vkCreateSwapchainKHR;
1034 return true;
1035 }
1036 if (!strcmp("vkDestroySwapchainKHR", name)) {
1037 *addr = (void *) vkDestroySwapchainKHR;
1038 return true;
1039 }
1040 if (!strcmp("vkGetSwapchainImagesKHR", name)) {
1041 *addr = (void *) vkGetSwapchainImagesKHR;
1042 return true;
1043 }
1044 if (!strcmp("vkAcquireNextImageKHR", name)) {
1045 *addr = (void *) vkAcquireNextImageKHR;
1046 return true;
1047 }
1048 if (!strcmp("vkQueuePresentKHR", name)) {
1049 *addr = (void *) vkQueuePresentKHR;
1050 return true;
1051 }
1052
Ian Elliott7c352552015-11-19 13:14:05 -07001053#ifdef VK_USE_PLATFORM_WIN32_KHR
Ian Elliott9b89a472015-11-19 16:39:21 -07001054 /*
1055 * Functions for the VK_KHR_win32_surface extension:
1056 */
Ian Elliott7c352552015-11-19 13:14:05 -07001057 if (!strcmp("vkCreateWin32SurfaceKHR", name)) {
1058 *addr = ptr_instance->wsi_win32_surface_enabled ? (void *) vkCreateWin32SurfaceKHR : NULL;
1059 return true;
1060 }
Ian Elliotte851dd62015-11-24 15:39:10 -07001061 if (!strcmp("vkGetPhysicalDeviceWin32PresentationSupportKHR", name)) {
1062 *addr = ptr_instance->wsi_win32_surface_enabled ? (void *) vkGetPhysicalDeviceWin32PresentationSupportKHR : NULL;
1063 return true;
1064 }
Ian Elliott7c352552015-11-19 13:14:05 -07001065#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott7c352552015-11-19 13:14:05 -07001066#ifdef VK_USE_PLATFORM_MIR_KHR
Ian Elliott9b89a472015-11-19 16:39:21 -07001067 /*
1068 * Functions for the VK_KHR_mir_surface extension:
1069 */
Ian Elliott7c352552015-11-19 13:14:05 -07001070 if (!strcmp("vkCreateMirSurfaceKHR", name)) {
1071 *addr = ptr_instance->wsi_mir_surface_enabled ? (void *) vkCreateMirSurfaceKHR : NULL;
1072 return true;
1073 }
Ian Elliotte851dd62015-11-24 15:39:10 -07001074 if (!strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name)) {
1075 *addr = ptr_instance->wsi_mir_surface_enabled ? (void *) vkGetPhysicalDeviceMirPresentationSupportKHR : NULL;
1076 return true;
Ian Elliott7c352552015-11-19 13:14:05 -07001077#endif // VK_USE_PLATFORM_MIR_KHR
1078#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott9b89a472015-11-19 16:39:21 -07001079 /*
1080 * Functions for the VK_KHR_wayland_surface extension:
1081 */
Ian Elliott7c352552015-11-19 13:14:05 -07001082 if (!strcmp("vkCreateWaylandSurfaceKHR", name)) {
1083 *addr = ptr_instance->wsi_wayland_surface_enabled ? (void *) vkCreateWaylandSurfaceKHR : NULL;
1084 return true;
1085 }
Ian Elliotte851dd62015-11-24 15:39:10 -07001086 if (!strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name)) {
1087 *addr = ptr_instance->wsi_wayland_surface_enabled ? (void *) vkGetPhysicalDeviceWaylandPresentationSupportKHR : NULL;
1088 return true;
Ian Elliott7c352552015-11-19 13:14:05 -07001089#endif // VK_USE_PLATFORM_WAYLAND_KHR
1090#ifdef VK_USE_PLATFORM_XCB_KHR
Ian Elliott9b89a472015-11-19 16:39:21 -07001091 /*
1092 * Functions for the VK_KHR_xcb_surface extension:
1093 */
Ian Elliott7c352552015-11-19 13:14:05 -07001094 if (!strcmp("vkCreateXcbSurfaceKHR", name)) {
1095 *addr = ptr_instance->wsi_xcb_surface_enabled ? (void *) vkCreateXcbSurfaceKHR : NULL;
1096 return true;
1097 }
Ian Elliotte851dd62015-11-24 15:39:10 -07001098 if (!strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name)) {
1099 *addr = ptr_instance->wsi_xcb_surface_enabled ? (void *) vkGetPhysicalDeviceXcbPresentationSupportKHR : NULL;
1100 return true;
1101 }
Ian Elliott7c352552015-11-19 13:14:05 -07001102#endif // VK_USE_PLATFORM_XCB_KHR
1103#ifdef VK_USE_PLATFORM_XLIB_KHR
Ian Elliott9b89a472015-11-19 16:39:21 -07001104 /*
1105 * Functions for the VK_KHR_xlib_surface extension:
1106 */
Ian Elliott7c352552015-11-19 13:14:05 -07001107 if (!strcmp("vkCreateXlibSurfaceKHR", name)) {
1108 *addr = ptr_instance->wsi_xlib_surface_enabled ? (void *) vkCreateXlibSurfaceKHR : NULL;
1109 return true;
1110 }
Ian Elliotte851dd62015-11-24 15:39:10 -07001111 if (!strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name)) {
1112 *addr = ptr_instance->wsi_xlib_surface_enabled ? (void *) vkGetPhysicalDeviceXlibPresentationSupportKHR : NULL;
1113 return true;
Jon Ashburnfa4fdf42015-11-30 08:23:10 -07001114 }
Ian Elliott7c352552015-11-19 13:14:05 -07001115#endif // VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski1ad14b42015-12-10 16:25:21 -07001116#ifdef VK_USE_PLATFORM_ANDROID_KHR
1117 /*
1118 * Functions for the VK_KHR_android_surface extension:
1119 */
1120 if (!strcmp("vkCreateAndroidSurfaceKHR", name)) {
1121 *addr = ptr_instance->wsi_xlib_surface_enabled ? (void *) vkCreateAndroidSurfaceKHR : NULL;
1122 return true;
1123 }
1124#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott7c352552015-11-19 13:14:05 -07001125
Ian Elliott54cea232015-10-30 15:28:23 -06001126 return false;
1127}