1 /* 2 * Copyright (c) 2015-2016 The Khronos Group Inc. 3 * Copyright (c) 2015-2016 Valve Corporation 4 * Copyright (c) 2015-2016 LunarG, Inc. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and/or associated documentation files (the "Materials"), to 8 * deal in the Materials without restriction, including without limitation the 9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10 * sell copies of the Materials, and to permit persons to whom the Materials are 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice(s) and this permission notice shall be included in 14 * all copies or substantial portions of the Materials. 15 * 16 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 * 20 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 21 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 22 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE 23 * USE OR OTHER DEALINGS IN THE MATERIALS. 24 * 25 * Author: Ian Elliott <ian (at) lunarg.com> 26 * Author: Jon Ashburn <jon (at) lunarg.com> 27 * Author: Ian Elliott <ianelliott (at) google.com> 28 * Author: Mark Lobodzinski <mark (at) lunarg.com> 29 */ 30 31 //#define _ISOC11_SOURCE /* for aligned_alloc() */ 32 #define _GNU_SOURCE 33 #include <stdlib.h> 34 #include <string.h> 35 #include "vk_loader_platform.h" 36 #include "loader.h" 37 #include "wsi.h" 38 #include <vulkan/vk_icd.h> 39 40 static const VkExtensionProperties wsi_surface_extension_info = { 41 .extensionName = VK_KHR_SURFACE_EXTENSION_NAME, 42 .specVersion = VK_KHR_SURFACE_SPEC_VERSION, 43 }; 44 45 #ifdef VK_USE_PLATFORM_WIN32_KHR 46 static const VkExtensionProperties wsi_win32_surface_extension_info = { 47 .extensionName = VK_KHR_WIN32_SURFACE_EXTENSION_NAME, 48 .specVersion = VK_KHR_WIN32_SURFACE_SPEC_VERSION, 49 }; 50 #endif // VK_USE_PLATFORM_WIN32_KHR 51 52 #ifdef VK_USE_PLATFORM_MIR_KHR 53 static const VkExtensionProperties wsi_mir_surface_extension_info = { 54 .extensionName = VK_KHR_MIR_SURFACE_EXTENSION_NAME, 55 .specVersion = VK_KHR_MIR_SURFACE_SPEC_VERSION, 56 }; 57 #endif // VK_USE_PLATFORM_MIR_KHR 58 59 #ifdef VK_USE_PLATFORM_WAYLAND_KHR 60 static const VkExtensionProperties wsi_wayland_surface_extension_info = { 61 .extensionName = VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME, 62 .specVersion = VK_KHR_WAYLAND_SURFACE_SPEC_VERSION, 63 }; 64 #endif // VK_USE_PLATFORM_WAYLAND_KHR 65 66 #ifdef VK_USE_PLATFORM_XCB_KHR 67 static const VkExtensionProperties wsi_xcb_surface_extension_info = { 68 .extensionName = VK_KHR_XCB_SURFACE_EXTENSION_NAME, 69 .specVersion = VK_KHR_XCB_SURFACE_SPEC_VERSION, 70 }; 71 #endif // VK_USE_PLATFORM_XCB_KHR 72 73 #ifdef VK_USE_PLATFORM_XLIB_KHR 74 static const VkExtensionProperties wsi_xlib_surface_extension_info = { 75 .extensionName = VK_KHR_XLIB_SURFACE_EXTENSION_NAME, 76 .specVersion = VK_KHR_XLIB_SURFACE_SPEC_VERSION, 77 }; 78 #endif // VK_USE_PLATFORM_XLIB_KHR 79 80 #ifdef VK_USE_PLATFORM_ANDROID_KHR 81 static const VkExtensionProperties wsi_android_surface_extension_info = { 82 .extensionName = VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, 83 .specVersion = VK_KHR_ANDROID_SURFACE_REVISION, 84 }; 85 #endif // VK_USE_PLATFORM_ANDROID_KHR 86 87 // Note for VK_DISPLAY_KHR don't advertise support since we really need support 88 // to come from ICD, although the loader supplements the support from ICD 89 90 void wsi_add_instance_extensions(const struct loader_instance *inst, 91 struct loader_extension_list *ext_list) { 92 loader_add_to_ext_list(inst, ext_list, 1, &wsi_surface_extension_info); 93 #ifdef VK_USE_PLATFORM_WIN32_KHR 94 loader_add_to_ext_list(inst, ext_list, 1, 95 &wsi_win32_surface_extension_info); 96 #endif // VK_USE_PLATFORM_WIN32_KHR 97 #ifdef VK_USE_PLATFORM_MIR_KHR 98 loader_add_to_ext_list(inst, ext_list, 1, &wsi_mir_surface_extension_info); 99 #endif // VK_USE_PLATFORM_MIR_KHR 100 #ifdef VK_USE_PLATFORM_WAYLAND_KHR 101 loader_add_to_ext_list(inst, ext_list, 1, 102 &wsi_wayland_surface_extension_info); 103 #endif // VK_USE_PLATFORM_WAYLAND_KHR 104 #ifdef VK_USE_PLATFORM_XCB_KHR 105 loader_add_to_ext_list(inst, ext_list, 1, &wsi_xcb_surface_extension_info); 106 #endif // VK_USE_PLATFORM_XCB_KHR 107 #ifdef VK_USE_PLATFORM_XLIB_KHR 108 loader_add_to_ext_list(inst, ext_list, 1, &wsi_xlib_surface_extension_info); 109 #endif // VK_USE_PLATFORM_XLIB_KHR 110 #ifdef VK_USE_PLATFORM_ANDROID_KHR 111 loader_add_to_ext_list(inst, ext_list, 1, 112 &wsi_android_surface_extension_info); 113 #endif // VK_USE_PLATFORM_ANDROID_KHR 114 } 115 116 void wsi_create_instance(struct loader_instance *ptr_instance, 117 const VkInstanceCreateInfo *pCreateInfo) { 118 ptr_instance->wsi_surface_enabled = false; 119 120 #ifdef VK_USE_PLATFORM_WIN32_KHR 121 ptr_instance->wsi_win32_surface_enabled = false; 122 #endif // VK_USE_PLATFORM_WIN32_KHR 123 #ifdef VK_USE_PLATFORM_MIR_KHR 124 ptr_instance->wsi_mir_surface_enabled = false; 125 #endif // VK_USE_PLATFORM_MIR_KHR 126 #ifdef VK_USE_PLATFORM_WAYLAND_KHR 127 ptr_instance->wsi_wayland_surface_enabled = false; 128 #endif // VK_USE_PLATFORM_WAYLAND_KHR 129 #ifdef VK_USE_PLATFORM_XCB_KHR 130 ptr_instance->wsi_xcb_surface_enabled = false; 131 #endif // VK_USE_PLATFORM_XCB_KHR 132 #ifdef VK_USE_PLATFORM_XLIB_KHR 133 ptr_instance->wsi_xlib_surface_enabled = false; 134 #endif // VK_USE_PLATFORM_XLIB_KHR 135 #ifdef VK_USE_PLATFORM_ANDROID_KHR 136 ptr_instance->wsi_android_surface_enabled = false; 137 #endif // VK_USE_PLATFORM_ANDROID_KHR 138 139 ptr_instance->wsi_display_enabled = false; 140 141 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) { 142 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], 143 VK_KHR_SURFACE_EXTENSION_NAME) == 0) { 144 ptr_instance->wsi_surface_enabled = true; 145 continue; 146 } 147 #ifdef VK_USE_PLATFORM_WIN32_KHR 148 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], 149 VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) { 150 ptr_instance->wsi_win32_surface_enabled = true; 151 continue; 152 } 153 #endif // VK_USE_PLATFORM_WIN32_KHR 154 #ifdef VK_USE_PLATFORM_MIR_KHR 155 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], 156 VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) { 157 ptr_instance->wsi_mir_surface_enabled = true; 158 continue; 159 } 160 #endif // VK_USE_PLATFORM_MIR_KHR 161 #ifdef VK_USE_PLATFORM_WAYLAND_KHR 162 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], 163 VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) { 164 ptr_instance->wsi_wayland_surface_enabled = true; 165 continue; 166 } 167 #endif // VK_USE_PLATFORM_WAYLAND_KHR 168 #ifdef VK_USE_PLATFORM_XCB_KHR 169 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], 170 VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) { 171 ptr_instance->wsi_xcb_surface_enabled = true; 172 continue; 173 } 174 #endif // VK_USE_PLATFORM_XCB_KHR 175 #ifdef VK_USE_PLATFORM_XLIB_KHR 176 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], 177 VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) { 178 ptr_instance->wsi_xlib_surface_enabled = true; 179 continue; 180 } 181 #endif // VK_USE_PLATFORM_XLIB_KHR 182 #ifdef VK_USE_PLATFORM_ANDROID_KHR 183 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], 184 VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) { 185 ptr_instance->wsi_android_surface_enabled = true; 186 continue; 187 } 188 #endif // VK_USE_PLATFORM_ANDROID_KHR 189 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], 190 VK_KHR_DISPLAY_EXTENSION_NAME) == 0) { 191 ptr_instance->wsi_display_enabled = true; 192 continue; 193 } 194 } 195 } 196 197 /* 198 * Functions for the VK_KHR_surface extension: 199 */ 200 201 /* 202 * This is the trampoline entrypoint 203 * for DestroySurfaceKHR 204 */ 205 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 206 vkDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, 207 const VkAllocationCallbacks *pAllocator) { 208 const VkLayerInstanceDispatchTable *disp; 209 disp = loader_get_instance_dispatch(instance); 210 disp->DestroySurfaceKHR(instance, surface, pAllocator); 211 } 212 213 // TODO probably need to lock around all the loader_get_instance() calls. 214 /* 215 * This is the instance chain terminator function 216 * for DestroySurfaceKHR 217 */ 218 VKAPI_ATTR void VKAPI_CALL 219 terminator_DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, 220 const VkAllocationCallbacks *pAllocator) { 221 struct loader_instance *ptr_instance = loader_get_instance(instance); 222 223 loader_heap_free(ptr_instance, (void *)surface); 224 } 225 226 /* 227 * This is the trampoline entrypoint 228 * for GetPhysicalDeviceSurfaceSupportKHR 229 */ 230 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 231 vkGetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, 232 uint32_t queueFamilyIndex, 233 VkSurfaceKHR surface, 234 VkBool32 *pSupported) { 235 const VkLayerInstanceDispatchTable *disp; 236 VkPhysicalDevice unwrapped_phys_dev = 237 loader_unwrap_physical_device(physicalDevice); 238 disp = loader_get_instance_dispatch(physicalDevice); 239 VkResult res = disp->GetPhysicalDeviceSurfaceSupportKHR( 240 unwrapped_phys_dev, queueFamilyIndex, surface, pSupported); 241 return res; 242 } 243 244 /* 245 * This is the instance chain terminator function 246 * for GetPhysicalDeviceSurfaceSupportKHR 247 */ 248 VKAPI_ATTR VkResult VKAPI_CALL 249 terminator_GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, 250 uint32_t queueFamilyIndex, 251 VkSurfaceKHR surface, 252 VkBool32 *pSupported) { 253 struct loader_physical_device *phys_dev = 254 (struct loader_physical_device *)physicalDevice; 255 struct loader_icd *icd = phys_dev->this_icd; 256 257 assert(pSupported && 258 "GetPhysicalDeviceSurfaceSupportKHR: Error, null pSupported"); 259 *pSupported = false; 260 261 assert(icd->GetPhysicalDeviceSurfaceSupportKHR && 262 "loader: null GetPhysicalDeviceSurfaceSupportKHR ICD pointer"); 263 264 return icd->GetPhysicalDeviceSurfaceSupportKHR( 265 phys_dev->phys_dev, queueFamilyIndex, surface, pSupported); 266 } 267 268 /* 269 * This is the trampoline entrypoint 270 * for GetPhysicalDeviceSurfaceCapabilitiesKHR 271 */ 272 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 273 vkGetPhysicalDeviceSurfaceCapabilitiesKHR( 274 VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, 275 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) { 276 277 const VkLayerInstanceDispatchTable *disp; 278 VkPhysicalDevice unwrapped_phys_dev = 279 loader_unwrap_physical_device(physicalDevice); 280 disp = loader_get_instance_dispatch(physicalDevice); 281 VkResult res = disp->GetPhysicalDeviceSurfaceCapabilitiesKHR( 282 unwrapped_phys_dev, surface, pSurfaceCapabilities); 283 return res; 284 } 285 286 /* 287 * This is the instance chain terminator function 288 * for GetPhysicalDeviceSurfaceCapabilitiesKHR 289 */ 290 VKAPI_ATTR VkResult VKAPI_CALL 291 terminator_GetPhysicalDeviceSurfaceCapabilitiesKHR( 292 VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, 293 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) { 294 struct loader_physical_device *phys_dev = 295 (struct loader_physical_device *)physicalDevice; 296 struct loader_icd *icd = phys_dev->this_icd; 297 298 assert(pSurfaceCapabilities && "GetPhysicalDeviceSurfaceCapabilitiesKHR: " 299 "Error, null pSurfaceCapabilities"); 300 301 assert(icd->GetPhysicalDeviceSurfaceCapabilitiesKHR && 302 "loader: null GetPhysicalDeviceSurfaceCapabilitiesKHR ICD pointer"); 303 304 return icd->GetPhysicalDeviceSurfaceCapabilitiesKHR( 305 phys_dev->phys_dev, surface, pSurfaceCapabilities); 306 } 307 308 /* 309 * This is the trampoline entrypoint 310 * for GetPhysicalDeviceSurfaceFormatsKHR 311 */ 312 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 313 vkGetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, 314 VkSurfaceKHR surface, 315 uint32_t *pSurfaceFormatCount, 316 VkSurfaceFormatKHR *pSurfaceFormats) { 317 VkPhysicalDevice unwrapped_phys_dev = 318 loader_unwrap_physical_device(physicalDevice); 319 const VkLayerInstanceDispatchTable *disp; 320 disp = loader_get_instance_dispatch(physicalDevice); 321 VkResult res = disp->GetPhysicalDeviceSurfaceFormatsKHR( 322 unwrapped_phys_dev, surface, pSurfaceFormatCount, pSurfaceFormats); 323 return res; 324 } 325 326 /* 327 * This is the instance chain terminator function 328 * for GetPhysicalDeviceSurfaceFormatsKHR 329 */ 330 VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfaceFormatsKHR( 331 VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, 332 uint32_t *pSurfaceFormatCount, VkSurfaceFormatKHR *pSurfaceFormats) { 333 struct loader_physical_device *phys_dev = 334 (struct loader_physical_device *)physicalDevice; 335 struct loader_icd *icd = phys_dev->this_icd; 336 337 assert( 338 pSurfaceFormatCount && 339 "GetPhysicalDeviceSurfaceFormatsKHR: Error, null pSurfaceFormatCount"); 340 341 assert(icd->GetPhysicalDeviceSurfaceFormatsKHR && 342 "loader: null GetPhysicalDeviceSurfaceFormatsKHR ICD pointer"); 343 344 return icd->GetPhysicalDeviceSurfaceFormatsKHR( 345 phys_dev->phys_dev, surface, pSurfaceFormatCount, pSurfaceFormats); 346 } 347 348 /* 349 * This is the trampoline entrypoint 350 * for GetPhysicalDeviceSurfacePresentModesKHR 351 */ 352 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 353 vkGetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, 354 VkSurfaceKHR surface, 355 uint32_t *pPresentModeCount, 356 VkPresentModeKHR *pPresentModes) { 357 VkPhysicalDevice unwrapped_phys_dev = 358 loader_unwrap_physical_device(physicalDevice); 359 const VkLayerInstanceDispatchTable *disp; 360 disp = loader_get_instance_dispatch(physicalDevice); 361 VkResult res = disp->GetPhysicalDeviceSurfacePresentModesKHR( 362 unwrapped_phys_dev, surface, pPresentModeCount, pPresentModes); 363 return res; 364 } 365 366 /* 367 * This is the instance chain terminator function 368 * for GetPhysicalDeviceSurfacePresentModesKHR 369 */ 370 VKAPI_ATTR VkResult VKAPI_CALL 371 terminator_GetPhysicalDeviceSurfacePresentModesKHR( 372 VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, 373 uint32_t *pPresentModeCount, VkPresentModeKHR *pPresentModes) { 374 struct loader_physical_device *phys_dev = 375 (struct loader_physical_device *)physicalDevice; 376 struct loader_icd *icd = phys_dev->this_icd; 377 378 assert(pPresentModeCount && "GetPhysicalDeviceSurfacePresentModesKHR: " 379 "Error, null pPresentModeCount"); 380 381 assert(icd->GetPhysicalDeviceSurfacePresentModesKHR && 382 "loader: null GetPhysicalDeviceSurfacePresentModesKHR ICD pointer"); 383 384 return icd->GetPhysicalDeviceSurfacePresentModesKHR( 385 phys_dev->phys_dev, surface, pPresentModeCount, pPresentModes); 386 } 387 388 /* 389 * Functions for the VK_KHR_swapchain extension: 390 */ 391 392 /* 393 * This is the trampoline entrypoint 394 * for CreateSwapchainKHR 395 */ 396 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 397 vkCreateSwapchainKHR(VkDevice device, 398 const VkSwapchainCreateInfoKHR *pCreateInfo, 399 const VkAllocationCallbacks *pAllocator, 400 VkSwapchainKHR *pSwapchain) { 401 const VkLayerDispatchTable *disp; 402 disp = loader_get_dispatch(device); 403 VkResult res = 404 disp->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain); 405 return res; 406 } 407 408 /* 409 * This is the trampoline entrypoint 410 * for DestroySwapchainKHR 411 */ 412 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 413 vkDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, 414 const VkAllocationCallbacks *pAllocator) { 415 const VkLayerDispatchTable *disp; 416 disp = loader_get_dispatch(device); 417 disp->DestroySwapchainKHR(device, swapchain, pAllocator); 418 } 419 420 /* 421 * This is the trampoline entrypoint 422 * for GetSwapchainImagesKHR 423 */ 424 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 425 vkGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, 426 uint32_t *pSwapchainImageCount, 427 VkImage *pSwapchainImages) { 428 const VkLayerDispatchTable *disp; 429 disp = loader_get_dispatch(device); 430 VkResult res = disp->GetSwapchainImagesKHR( 431 device, swapchain, pSwapchainImageCount, pSwapchainImages); 432 return res; 433 } 434 435 /* 436 * This is the trampoline entrypoint 437 * for AcquireNextImageKHR 438 */ 439 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 440 vkAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, 441 uint64_t timeout, VkSemaphore semaphore, VkFence fence, 442 uint32_t *pImageIndex) { 443 const VkLayerDispatchTable *disp; 444 disp = loader_get_dispatch(device); 445 VkResult res = disp->AcquireNextImageKHR(device, swapchain, timeout, 446 semaphore, fence, pImageIndex); 447 return res; 448 } 449 450 /* 451 * This is the trampoline entrypoint 452 * for QueuePresentKHR 453 */ 454 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 455 vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) { 456 const VkLayerDispatchTable *disp; 457 disp = loader_get_dispatch(queue); 458 VkResult res = disp->QueuePresentKHR(queue, pPresentInfo); 459 return res; 460 } 461 462 #ifdef VK_USE_PLATFORM_WIN32_KHR 463 464 /* 465 * Functions for the VK_KHR_win32_surface extension: 466 */ 467 468 /* 469 * This is the trampoline entrypoint 470 * for CreateWin32SurfaceKHR 471 */ 472 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 473 vkCreateWin32SurfaceKHR(VkInstance instance, 474 const VkWin32SurfaceCreateInfoKHR *pCreateInfo, 475 const VkAllocationCallbacks *pAllocator, 476 VkSurfaceKHR *pSurface) { 477 const VkLayerInstanceDispatchTable *disp; 478 disp = loader_get_instance_dispatch(instance); 479 VkResult res; 480 481 res = disp->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, 482 pSurface); 483 return res; 484 } 485 486 /* 487 * This is the instance chain terminator function 488 * for CreateWin32SurfaceKHR 489 */ 490 VKAPI_ATTR VkResult VKAPI_CALL 491 terminator_CreateWin32SurfaceKHR(VkInstance instance, 492 const VkWin32SurfaceCreateInfoKHR *pCreateInfo, 493 const VkAllocationCallbacks *pAllocator, 494 VkSurfaceKHR *pSurface) { 495 struct loader_instance *ptr_instance = loader_get_instance(instance); 496 VkIcdSurfaceWin32 *pIcdSurface = NULL; 497 498 pIcdSurface = loader_heap_alloc(ptr_instance, sizeof(VkIcdSurfaceWin32), 499 VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); 500 if (pIcdSurface == NULL) { 501 return VK_ERROR_OUT_OF_HOST_MEMORY; 502 } 503 504 pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_WIN32; 505 pIcdSurface->hinstance = pCreateInfo->hinstance; 506 pIcdSurface->hwnd = pCreateInfo->hwnd; 507 508 *pSurface = (VkSurfaceKHR)pIcdSurface; 509 510 return VK_SUCCESS; 511 } 512 513 /* 514 * This is the trampoline entrypoint 515 * for GetPhysicalDeviceWin32PresentationSupportKHR 516 */ 517 LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL 518 vkGetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice, 519 uint32_t queueFamilyIndex) { 520 VkPhysicalDevice unwrapped_phys_dev = 521 loader_unwrap_physical_device(physicalDevice); 522 const VkLayerInstanceDispatchTable *disp; 523 disp = loader_get_instance_dispatch(physicalDevice); 524 VkBool32 res = disp->GetPhysicalDeviceWin32PresentationSupportKHR( 525 unwrapped_phys_dev, queueFamilyIndex); 526 return res; 527 } 528 529 /* 530 * This is the instance chain terminator function 531 * for GetPhysicalDeviceWin32PresentationSupportKHR 532 */ 533 VKAPI_ATTR VkBool32 VKAPI_CALL 534 terminator_GetPhysicalDeviceWin32PresentationSupportKHR( 535 VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex) { 536 struct loader_physical_device *phys_dev = 537 (struct loader_physical_device *)physicalDevice; 538 struct loader_icd *icd = phys_dev->this_icd; 539 540 assert(icd->GetPhysicalDeviceWin32PresentationSupportKHR && 541 "loader: null GetPhysicalDeviceWin32PresentationSupportKHR ICD " 542 "pointer"); 543 544 return icd->GetPhysicalDeviceWin32PresentationSupportKHR(phys_dev->phys_dev, 545 queueFamilyIndex); 546 } 547 #endif // VK_USE_PLATFORM_WIN32_KHR 548 549 #ifdef VK_USE_PLATFORM_MIR_KHR 550 551 /* 552 * Functions for the VK_KHR_mir_surface extension: 553 */ 554 555 /* 556 * This is the trampoline entrypoint 557 * for CreateMirSurfaceKHR 558 */ 559 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 560 vkCreateMirSurfaceKHR(VkInstance instance, 561 const VkMirSurfaceCreateInfoKHR *pCreateInfo, 562 const VkAllocationCallbacks *pAllocator, 563 VkSurfaceKHR *pSurface) { 564 const VkLayerInstanceDispatchTable *disp; 565 disp = loader_get_instance_dispatch(instance); 566 VkResult res; 567 568 res = 569 disp->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface); 570 return res; 571 } 572 573 /* 574 * This is the instance chain terminator function 575 * for CreateMirSurfaceKHR 576 */ 577 VKAPI_ATTR VkResult VKAPI_CALL 578 terminator_CreateMirSurfaceKHR(VkInstance instance, 579 const VkMirSurfaceCreateInfoKHR *pCreateInfo, 580 const VkAllocationCallbacks *pAllocator, 581 VkSurfaceKHR *pSurface) { 582 struct loader_instance *ptr_instance = loader_get_instance(instance); 583 VkIcdSurfaceMir *pIcdSurface = NULL; 584 585 pIcdSurface = loader_heap_alloc(ptr_instance, sizeof(VkIcdSurfaceMir), 586 VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); 587 if (pIcdSurface == NULL) { 588 return VK_ERROR_OUT_OF_HOST_MEMORY; 589 } 590 591 pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_MIR; 592 pIcdSurface->connection = pCreateInfo->connection; 593 pIcdSurface->mirSurface = pCreateInfo->mirSurface; 594 595 *pSurface = (VkSurfaceKHR)pIcdSurface; 596 597 return VK_SUCCESS; 598 } 599 600 /* 601 * This is the trampoline entrypoint 602 * for GetPhysicalDeviceMirPresentationSupportKHR 603 */ 604 LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL 605 vkGetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice, 606 uint32_t queueFamilyIndex, 607 MirConnection *connection) { 608 VkPhysicalDevice unwrapped_phys_dev = 609 loader_unwrap_physical_device(physicalDevice); 610 const VkLayerInstanceDispatchTable *disp; 611 disp = loader_get_instance_dispatch(physicalDevice); 612 VkBool32 res = disp->GetPhysicalDeviceMirPresentationSupportKHR( 613 unwrapped_phys_dev, queueFamilyIndex, connection); 614 return res; 615 } 616 617 /* 618 * This is the instance chain terminator function 619 * for GetPhysicalDeviceMirPresentationSupportKHR 620 */ 621 VKAPI_ATTR VkBool32 VKAPI_CALL 622 terminator_GetPhysicalDeviceMirPresentationSupportKHR( 623 VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, 624 MirConnection *connection) { 625 struct loader_physical_device *phys_dev = 626 (struct loader_physical_device *)physicalDevice; 627 struct loader_icd *icd = phys_dev->this_icd; 628 629 assert( 630 icd->GetPhysicalDeviceMirPresentationSupportKHR && 631 "loader: null GetPhysicalDeviceMirPresentationSupportKHR ICD pointer"); 632 633 return icd->GetPhysicalDeviceMirPresentationSupportKHR( 634 phys_dev->phys_dev, queueFamilyIndex, connection); 635 } 636 #endif // VK_USE_PLATFORM_MIR_KHR 637 638 #ifdef VK_USE_PLATFORM_WAYLAND_KHR 639 640 /* 641 * Functions for the VK_KHR_wayland_surface extension: 642 */ 643 644 /* 645 * This is the trampoline entrypoint 646 * for CreateWaylandSurfaceKHR 647 */ 648 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 649 vkCreateWaylandSurfaceKHR(VkInstance instance, 650 const VkWaylandSurfaceCreateInfoKHR *pCreateInfo, 651 const VkAllocationCallbacks *pAllocator, 652 VkSurfaceKHR *pSurface) { 653 const VkLayerInstanceDispatchTable *disp; 654 disp = loader_get_instance_dispatch(instance); 655 VkResult res; 656 657 res = disp->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, 658 pSurface); 659 return res; 660 } 661 662 /* 663 * This is the instance chain terminator function 664 * for CreateWaylandSurfaceKHR 665 */ 666 VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateWaylandSurfaceKHR( 667 VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo, 668 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) { 669 struct loader_instance *ptr_instance = loader_get_instance(instance); 670 VkIcdSurfaceWayland *pIcdSurface = NULL; 671 672 pIcdSurface = loader_heap_alloc(ptr_instance, sizeof(VkIcdSurfaceWayland), 673 VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); 674 if (pIcdSurface == NULL) { 675 return VK_ERROR_OUT_OF_HOST_MEMORY; 676 } 677 678 pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_WAYLAND; 679 pIcdSurface->display = pCreateInfo->display; 680 pIcdSurface->surface = pCreateInfo->surface; 681 682 *pSurface = (VkSurfaceKHR)pIcdSurface; 683 684 return VK_SUCCESS; 685 } 686 687 /* 688 * This is the trampoline entrypoint 689 * for GetPhysicalDeviceWaylandPresentationSupportKHR 690 */ 691 LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL 692 vkGetPhysicalDeviceWaylandPresentationSupportKHR( 693 VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, 694 struct wl_display *display) { 695 VkPhysicalDevice unwrapped_phys_dev = 696 loader_unwrap_physical_device(physicalDevice); 697 const VkLayerInstanceDispatchTable *disp; 698 disp = loader_get_instance_dispatch(physicalDevice); 699 VkBool32 res = disp->GetPhysicalDeviceWaylandPresentationSupportKHR( 700 unwrapped_phys_dev, queueFamilyIndex, display); 701 return res; 702 } 703 704 /* 705 * This is the instance chain terminator function 706 * for GetPhysicalDeviceWaylandPresentationSupportKHR 707 */ 708 VKAPI_ATTR VkBool32 VKAPI_CALL 709 terminator_GetPhysicalDeviceWaylandPresentationSupportKHR( 710 VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, 711 struct wl_display *display) { 712 struct loader_physical_device *phys_dev = 713 (struct loader_physical_device *)physicalDevice; 714 struct loader_icd *icd = phys_dev->this_icd; 715 716 assert(icd->GetPhysicalDeviceWaylandPresentationSupportKHR && 717 "loader: null GetPhysicalDeviceWaylandPresentationSupportKHR ICD " 718 "pointer"); 719 720 return icd->GetPhysicalDeviceWaylandPresentationSupportKHR( 721 phys_dev->phys_dev, queueFamilyIndex, display); 722 } 723 #endif // VK_USE_PLATFORM_WAYLAND_KHR 724 725 #ifdef VK_USE_PLATFORM_XCB_KHR 726 727 /* 728 * Functions for the VK_KHR_xcb_surface extension: 729 */ 730 731 /* 732 * This is the trampoline entrypoint 733 * for CreateXcbSurfaceKHR 734 */ 735 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 736 vkCreateXcbSurfaceKHR(VkInstance instance, 737 const VkXcbSurfaceCreateInfoKHR *pCreateInfo, 738 const VkAllocationCallbacks *pAllocator, 739 VkSurfaceKHR *pSurface) { 740 const VkLayerInstanceDispatchTable *disp; 741 disp = loader_get_instance_dispatch(instance); 742 VkResult res; 743 744 res = 745 disp->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface); 746 return res; 747 } 748 749 /* 750 * This is the instance chain terminator function 751 * for CreateXcbSurfaceKHR 752 */ 753 VKAPI_ATTR VkResult VKAPI_CALL 754 terminator_CreateXcbSurfaceKHR(VkInstance instance, 755 const VkXcbSurfaceCreateInfoKHR *pCreateInfo, 756 const VkAllocationCallbacks *pAllocator, 757 VkSurfaceKHR *pSurface) { 758 struct loader_instance *ptr_instance = loader_get_instance(instance); 759 VkIcdSurfaceXcb *pIcdSurface = NULL; 760 761 pIcdSurface = loader_heap_alloc(ptr_instance, sizeof(VkIcdSurfaceXcb), 762 VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); 763 if (pIcdSurface == NULL) { 764 return VK_ERROR_OUT_OF_HOST_MEMORY; 765 } 766 767 pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_XCB; 768 pIcdSurface->connection = pCreateInfo->connection; 769 pIcdSurface->window = pCreateInfo->window; 770 771 *pSurface = (VkSurfaceKHR)pIcdSurface; 772 773 return VK_SUCCESS; 774 } 775 776 /* 777 * This is the trampoline entrypoint 778 * for GetPhysicalDeviceXcbPresentationSupportKHR 779 */ 780 LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL 781 vkGetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice, 782 uint32_t queueFamilyIndex, 783 xcb_connection_t *connection, 784 xcb_visualid_t visual_id) { 785 VkPhysicalDevice unwrapped_phys_dev = 786 loader_unwrap_physical_device(physicalDevice); 787 const VkLayerInstanceDispatchTable *disp; 788 disp = loader_get_instance_dispatch(physicalDevice); 789 VkBool32 res = disp->GetPhysicalDeviceXcbPresentationSupportKHR( 790 unwrapped_phys_dev, queueFamilyIndex, connection, visual_id); 791 return res; 792 } 793 794 /* 795 * This is the instance chain terminator function 796 * for GetPhysicalDeviceXcbPresentationSupportKHR 797 */ 798 VKAPI_ATTR VkBool32 VKAPI_CALL 799 terminator_GetPhysicalDeviceXcbPresentationSupportKHR( 800 VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, 801 xcb_connection_t *connection, xcb_visualid_t visual_id) { 802 struct loader_physical_device *phys_dev = 803 (struct loader_physical_device *)physicalDevice; 804 struct loader_icd *icd = phys_dev->this_icd; 805 806 assert( 807 icd->GetPhysicalDeviceXcbPresentationSupportKHR && 808 "loader: null GetPhysicalDeviceXcbPresentationSupportKHR ICD pointer"); 809 810 return icd->GetPhysicalDeviceXcbPresentationSupportKHR( 811 phys_dev->phys_dev, queueFamilyIndex, connection, visual_id); 812 } 813 #endif // VK_USE_PLATFORM_XCB_KHR 814 815 #ifdef VK_USE_PLATFORM_XLIB_KHR 816 817 /* 818 * Functions for the VK_KHR_xlib_surface extension: 819 */ 820 821 /* 822 * This is the trampoline entrypoint 823 * for CreateXlibSurfaceKHR 824 */ 825 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 826 vkCreateXlibSurfaceKHR(VkInstance instance, 827 const VkXlibSurfaceCreateInfoKHR *pCreateInfo, 828 const VkAllocationCallbacks *pAllocator, 829 VkSurfaceKHR *pSurface) { 830 const VkLayerInstanceDispatchTable *disp; 831 disp = loader_get_instance_dispatch(instance); 832 VkResult res; 833 834 res = 835 disp->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface); 836 return res; 837 } 838 839 /* 840 * This is the instance chain terminator function 841 * for CreateXlibSurfaceKHR 842 */ 843 VKAPI_ATTR VkResult VKAPI_CALL 844 terminator_CreateXlibSurfaceKHR(VkInstance instance, 845 const VkXlibSurfaceCreateInfoKHR *pCreateInfo, 846 const VkAllocationCallbacks *pAllocator, 847 VkSurfaceKHR *pSurface) { 848 struct loader_instance *ptr_instance = loader_get_instance(instance); 849 VkIcdSurfaceXlib *pIcdSurface = NULL; 850 851 pIcdSurface = loader_heap_alloc(ptr_instance, sizeof(VkIcdSurfaceXlib), 852 VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); 853 if (pIcdSurface == NULL) { 854 return VK_ERROR_OUT_OF_HOST_MEMORY; 855 } 856 857 pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_XLIB; 858 pIcdSurface->dpy = pCreateInfo->dpy; 859 pIcdSurface->window = pCreateInfo->window; 860 861 *pSurface = (VkSurfaceKHR)pIcdSurface; 862 863 return VK_SUCCESS; 864 } 865 866 /* 867 * This is the trampoline entrypoint 868 * for GetPhysicalDeviceXlibPresentationSupportKHR 869 */ 870 LOADER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL 871 vkGetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice, 872 uint32_t queueFamilyIndex, 873 Display *dpy, VisualID visualID) { 874 VkPhysicalDevice unwrapped_phys_dev = 875 loader_unwrap_physical_device(physicalDevice); 876 const VkLayerInstanceDispatchTable *disp; 877 disp = loader_get_instance_dispatch(physicalDevice); 878 VkBool32 res = disp->GetPhysicalDeviceXlibPresentationSupportKHR( 879 unwrapped_phys_dev, queueFamilyIndex, dpy, visualID); 880 return res; 881 } 882 883 /* 884 * This is the instance chain terminator function 885 * for GetPhysicalDeviceXlibPresentationSupportKHR 886 */ 887 VKAPI_ATTR VkBool32 VKAPI_CALL 888 terminator_GetPhysicalDeviceXlibPresentationSupportKHR( 889 VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, Display *dpy, 890 VisualID visualID) { 891 struct loader_physical_device *phys_dev = 892 (struct loader_physical_device *)physicalDevice; 893 struct loader_icd *icd = phys_dev->this_icd; 894 895 assert( 896 icd->GetPhysicalDeviceXlibPresentationSupportKHR && 897 "loader: null GetPhysicalDeviceXlibPresentationSupportKHR ICD pointer"); 898 899 return icd->GetPhysicalDeviceXlibPresentationSupportKHR( 900 phys_dev->phys_dev, queueFamilyIndex, dpy, visualID); 901 } 902 #endif // VK_USE_PLATFORM_XLIB_KHR 903 904 #ifdef VK_USE_PLATFORM_ANDROID_KHR 905 906 /* 907 * Functions for the VK_KHR_android_surface extension: 908 */ 909 910 /* 911 * This is the trampoline entrypoint 912 * for CreateAndroidSurfaceKHR 913 */ 914 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 915 vkCreateAndroidSurfaceKHR(VkInstance instance, ANativeWindow *window, 916 const VkAllocationCallbacks *pAllocator, 917 VkSurfaceKHR *pSurface) { 918 const VkLayerInstanceDispatchTable *disp; 919 disp = loader_get_instance_dispatch(instance); 920 VkResult res; 921 922 res = disp->CreateAndroidSurfaceKHR(instance, window, pAllocator, pSurface); 923 return res; 924 } 925 926 /* 927 * This is the instance chain terminator function 928 * for CreateAndroidSurfaceKHR 929 */ 930 VKAPI_ATTR VkResult VKAPI_CALL 931 terminator_CreateAndroidSurfaceKHR(VkInstance instance, Window window, 932 const VkAllocationCallbacks *pAllocator, 933 VkSurfaceKHR *pSurface) { 934 struct loader_instance *ptr_instance = loader_get_instance(instance); 935 VkIcdSurfaceAndroid *pIcdSurface = NULL; 936 937 pIcdSurface = loader_heap_alloc(ptr_instance, sizeof(VkIcdSurfaceAndroid), 938 VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); 939 if (pIcdSurface == NULL) { 940 return VK_ERROR_OUT_OF_HOST_MEMORY; 941 } 942 943 pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_ANDROID; 944 pIcdSurface->dpy = dpy; 945 pIcdSurface->window = window; 946 947 *pSurface = (VkSurfaceKHR)pIcdSurface; 948 949 return VK_SUCCESS; 950 } 951 952 #endif // VK_USE_PLATFORM_ANDROID_KHR 953 954 955 /* 956 * Functions for the VK_KHR_display instance extension: 957 */ 958 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 959 vkGetPhysicalDeviceDisplayPropertiesKHR( 960 VkPhysicalDevice physicalDevice, 961 uint32_t* pPropertyCount, 962 VkDisplayPropertiesKHR* pProperties) 963 { 964 VkPhysicalDevice unwrapped_phys_dev = 965 loader_unwrap_physical_device(physicalDevice); 966 const VkLayerInstanceDispatchTable *disp; 967 disp = loader_get_instance_dispatch(physicalDevice); 968 VkResult res = disp->GetPhysicalDeviceDisplayPropertiesKHR( 969 unwrapped_phys_dev, pPropertyCount, pProperties); 970 return res; 971 } 972 973 VKAPI_ATTR VkResult VKAPI_CALL 974 terminator_GetPhysicalDeviceDisplayPropertiesKHR( 975 VkPhysicalDevice physicalDevice, 976 uint32_t* pPropertyCount, 977 VkDisplayPropertiesKHR* pProperties) 978 { 979 struct loader_physical_device *phys_dev = 980 (struct loader_physical_device *)physicalDevice; 981 struct loader_icd *icd = phys_dev->this_icd; 982 983 assert( 984 icd->GetPhysicalDeviceDisplayPropertiesKHR && 985 "loader: null GetPhysicalDeviceDisplayPropertiesKHR ICD pointer"); 986 987 return icd->GetPhysicalDeviceDisplayPropertiesKHR( 988 phys_dev->phys_dev, pPropertyCount, pProperties); 989 } 990 991 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 992 vkGetPhysicalDeviceDisplayPlanePropertiesKHR( 993 VkPhysicalDevice physicalDevice, 994 uint32_t* pPropertyCount, 995 VkDisplayPlanePropertiesKHR* pProperties) 996 { 997 VkPhysicalDevice unwrapped_phys_dev = 998 loader_unwrap_physical_device(physicalDevice); 999 const VkLayerInstanceDispatchTable *disp; 1000 disp = loader_get_instance_dispatch(physicalDevice); 1001 VkResult res = disp->GetPhysicalDeviceDisplayPlanePropertiesKHR( 1002 unwrapped_phys_dev, pPropertyCount, pProperties); 1003 return res; 1004 } 1005 1006 VKAPI_ATTR VkResult VKAPI_CALL 1007 terminator_GetPhysicalDeviceDisplayPlanePropertiesKHR( 1008 VkPhysicalDevice physicalDevice, 1009 uint32_t* pPropertyCount, 1010 VkDisplayPlanePropertiesKHR* pProperties) 1011 { 1012 struct loader_physical_device *phys_dev = 1013 (struct loader_physical_device *)physicalDevice; 1014 struct loader_icd *icd = phys_dev->this_icd; 1015 1016 assert( 1017 icd->GetPhysicalDeviceDisplayPlanePropertiesKHR && 1018 "loader: null GetPhysicalDeviceDisplayPlanePropertiesKHR ICD pointer"); 1019 1020 return icd->GetPhysicalDeviceDisplayPlanePropertiesKHR( 1021 phys_dev->phys_dev, pPropertyCount, pProperties); 1022 } 1023 1024 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1025 vkGetDisplayPlaneSupportedDisplaysKHR( 1026 VkPhysicalDevice physicalDevice, 1027 uint32_t planeIndex, 1028 uint32_t* pDisplayCount, 1029 VkDisplayKHR* pDisplays) 1030 { 1031 VkPhysicalDevice unwrapped_phys_dev = 1032 loader_unwrap_physical_device(physicalDevice); 1033 const VkLayerInstanceDispatchTable *disp; 1034 disp = loader_get_instance_dispatch(physicalDevice); 1035 VkResult res = disp->GetDisplayPlaneSupportedDisplaysKHR( 1036 unwrapped_phys_dev, planeIndex, pDisplayCount, pDisplays); 1037 return res; 1038 } 1039 1040 VKAPI_ATTR VkResult VKAPI_CALL 1041 terminator_GetDisplayPlaneSupportedDisplaysKHR( 1042 VkPhysicalDevice physicalDevice, 1043 uint32_t planeIndex, 1044 uint32_t* pDisplayCount, 1045 VkDisplayKHR* pDisplays) 1046 { 1047 struct loader_physical_device *phys_dev = 1048 (struct loader_physical_device *)physicalDevice; 1049 struct loader_icd *icd = phys_dev->this_icd; 1050 1051 assert( 1052 icd->GetDisplayPlaneSupportedDisplaysKHR && 1053 "loader: null GetDisplayPlaneSupportedDisplaysKHR ICD pointer"); 1054 1055 return icd->GetDisplayPlaneSupportedDisplaysKHR( 1056 phys_dev->phys_dev, planeIndex, pDisplayCount, pDisplays); 1057 } 1058 1059 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1060 vkGetDisplayModePropertiesKHR( 1061 VkPhysicalDevice physicalDevice, 1062 VkDisplayKHR display, 1063 uint32_t* pPropertyCount, 1064 VkDisplayModePropertiesKHR* pProperties) 1065 { 1066 VkPhysicalDevice unwrapped_phys_dev = 1067 loader_unwrap_physical_device(physicalDevice); 1068 const VkLayerInstanceDispatchTable *disp; 1069 disp = loader_get_instance_dispatch(physicalDevice); 1070 VkResult res = disp->GetDisplayModePropertiesKHR( 1071 unwrapped_phys_dev, display, pPropertyCount, pProperties); 1072 return res; 1073 } 1074 1075 VKAPI_ATTR VkResult VKAPI_CALL 1076 terminator_GetDisplayModePropertiesKHR( 1077 VkPhysicalDevice physicalDevice, 1078 VkDisplayKHR display, 1079 uint32_t* pPropertyCount, 1080 VkDisplayModePropertiesKHR* pProperties) 1081 { 1082 struct loader_physical_device *phys_dev = 1083 (struct loader_physical_device *)physicalDevice; 1084 struct loader_icd *icd = phys_dev->this_icd; 1085 1086 assert( 1087 icd->GetDisplayModePropertiesKHR && 1088 "loader: null GetDisplayModePropertiesKHR ICD pointer"); 1089 1090 return icd->GetDisplayModePropertiesKHR( 1091 phys_dev->phys_dev, display, pPropertyCount, pProperties); 1092 } 1093 1094 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1095 vkCreateDisplayModeKHR( 1096 VkPhysicalDevice physicalDevice, 1097 VkDisplayKHR display, 1098 const VkDisplayModeCreateInfoKHR* pCreateInfo, 1099 const VkAllocationCallbacks* pAllocator, 1100 VkDisplayModeKHR* pMode) 1101 { 1102 VkPhysicalDevice unwrapped_phys_dev = 1103 loader_unwrap_physical_device(physicalDevice); 1104 const VkLayerInstanceDispatchTable *disp; 1105 disp = loader_get_instance_dispatch(physicalDevice); 1106 VkResult res = disp->CreateDisplayModeKHR( 1107 unwrapped_phys_dev, display, pCreateInfo, pAllocator, pMode); 1108 return res; 1109 } 1110 1111 VKAPI_ATTR VkResult VKAPI_CALL 1112 terminator_CreateDisplayModeKHR( 1113 VkPhysicalDevice physicalDevice, 1114 VkDisplayKHR display, 1115 const VkDisplayModeCreateInfoKHR* pCreateInfo, 1116 const VkAllocationCallbacks* pAllocator, 1117 VkDisplayModeKHR* pMode) 1118 { 1119 struct loader_physical_device *phys_dev = 1120 (struct loader_physical_device *)physicalDevice; 1121 struct loader_icd *icd = phys_dev->this_icd; 1122 1123 assert( 1124 icd->CreateDisplayModeKHR && 1125 "loader: null CreateDisplayModeKHR ICD pointer"); 1126 1127 return icd->CreateDisplayModeKHR( 1128 phys_dev->phys_dev, display, pCreateInfo, pAllocator, pMode); 1129 } 1130 1131 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1132 vkGetDisplayPlaneCapabilitiesKHR( 1133 VkPhysicalDevice physicalDevice, 1134 VkDisplayModeKHR mode, 1135 uint32_t planeIndex, 1136 VkDisplayPlaneCapabilitiesKHR* pCapabilities) 1137 { 1138 VkPhysicalDevice unwrapped_phys_dev = 1139 loader_unwrap_physical_device(physicalDevice); 1140 const VkLayerInstanceDispatchTable *disp; 1141 disp = loader_get_instance_dispatch(physicalDevice); 1142 VkResult res = disp->GetDisplayPlaneCapabilitiesKHR( 1143 unwrapped_phys_dev, mode, planeIndex, pCapabilities); 1144 return res; 1145 } 1146 1147 VKAPI_ATTR VkResult VKAPI_CALL 1148 terminator_GetDisplayPlaneCapabilitiesKHR( 1149 VkPhysicalDevice physicalDevice, 1150 VkDisplayModeKHR mode, 1151 uint32_t planeIndex, 1152 VkDisplayPlaneCapabilitiesKHR* pCapabilities) 1153 { 1154 struct loader_physical_device *phys_dev = 1155 (struct loader_physical_device *)physicalDevice; 1156 struct loader_icd *icd = phys_dev->this_icd; 1157 1158 assert( 1159 icd->GetDisplayPlaneCapabilitiesKHR && 1160 "loader: null GetDisplayPlaneCapabilitiesKHR ICD pointer"); 1161 1162 return icd->GetDisplayPlaneCapabilitiesKHR( 1163 phys_dev->phys_dev, mode, planeIndex, pCapabilities); 1164 } 1165 1166 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1167 vkCreateDisplayPlaneSurfaceKHR( 1168 VkInstance instance, 1169 const VkDisplaySurfaceCreateInfoKHR* pCreateInfo, 1170 const VkAllocationCallbacks* pAllocator, 1171 VkSurfaceKHR* pSurface) 1172 { 1173 const VkLayerInstanceDispatchTable *disp; 1174 disp = loader_get_instance_dispatch(instance); 1175 VkResult res; 1176 1177 res = disp->CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, 1178 pSurface); 1179 return res; 1180 } 1181 1182 VKAPI_ATTR VkResult VKAPI_CALL 1183 terminator_CreateDisplayPlaneSurfaceKHR( 1184 VkInstance instance, 1185 const VkDisplaySurfaceCreateInfoKHR* pCreateInfo, 1186 const VkAllocationCallbacks* pAllocator, 1187 VkSurfaceKHR* pSurface) 1188 { 1189 struct loader_instance *inst = loader_get_instance(instance); 1190 VkIcdSurfaceDisplay *pIcdSurface = NULL; 1191 1192 pIcdSurface = loader_heap_alloc(inst, sizeof(VkIcdSurfaceDisplay), 1193 VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); 1194 if (pIcdSurface == NULL) { 1195 return VK_ERROR_OUT_OF_HOST_MEMORY; 1196 } 1197 1198 pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_DISPLAY; 1199 pIcdSurface->displayMode = pCreateInfo->displayMode; 1200 pIcdSurface->planeIndex = pCreateInfo->planeIndex; 1201 pIcdSurface->planeStackIndex = pCreateInfo->planeStackIndex; 1202 pIcdSurface->transform = pCreateInfo->transform; 1203 pIcdSurface->globalAlpha = pCreateInfo->globalAlpha; 1204 pIcdSurface->alphaMode = pCreateInfo->alphaMode; 1205 pIcdSurface->imageExtent = pCreateInfo->imageExtent; 1206 1207 *pSurface = (VkSurfaceKHR)pIcdSurface; 1208 1209 return VK_SUCCESS; 1210 } 1211 1212 bool wsi_swapchain_instance_gpa(struct loader_instance *ptr_instance, 1213 const char *name, void **addr) { 1214 *addr = NULL; 1215 1216 /* 1217 * Functions for the VK_KHR_surface extension: 1218 */ 1219 if (!strcmp("vkDestroySurfaceKHR", name)) { 1220 *addr = ptr_instance->wsi_surface_enabled ? (void *)vkDestroySurfaceKHR 1221 : NULL; 1222 return true; 1223 } 1224 if (!strcmp("vkGetPhysicalDeviceSurfaceSupportKHR", name)) { 1225 *addr = ptr_instance->wsi_surface_enabled 1226 ? (void *)vkGetPhysicalDeviceSurfaceSupportKHR 1227 : NULL; 1228 return true; 1229 } 1230 if (!strcmp("vkGetPhysicalDeviceSurfaceCapabilitiesKHR", name)) { 1231 *addr = ptr_instance->wsi_surface_enabled 1232 ? (void *)vkGetPhysicalDeviceSurfaceCapabilitiesKHR 1233 : NULL; 1234 return true; 1235 } 1236 if (!strcmp("vkGetPhysicalDeviceSurfaceFormatsKHR", name)) { 1237 *addr = ptr_instance->wsi_surface_enabled 1238 ? (void *)vkGetPhysicalDeviceSurfaceFormatsKHR 1239 : NULL; 1240 return true; 1241 } 1242 if (!strcmp("vkGetPhysicalDeviceSurfacePresentModesKHR", name)) { 1243 *addr = ptr_instance->wsi_surface_enabled 1244 ? (void *)vkGetPhysicalDeviceSurfacePresentModesKHR 1245 : NULL; 1246 return true; 1247 } 1248 1249 /* 1250 * Functions for the VK_KHR_swapchain extension: 1251 * 1252 * Note: This is a device extension, and its functions are statically 1253 * exported from the loader. Per Khronos decisions, the the loader's GIPA 1254 * function will return the trampoline function for such device-extension 1255 * functions, regardless of whether the extension has been enabled. 1256 */ 1257 if (!strcmp("vkCreateSwapchainKHR", name)) { 1258 *addr = (void *)vkCreateSwapchainKHR; 1259 return true; 1260 } 1261 if (!strcmp("vkDestroySwapchainKHR", name)) { 1262 *addr = (void *)vkDestroySwapchainKHR; 1263 return true; 1264 } 1265 if (!strcmp("vkGetSwapchainImagesKHR", name)) { 1266 *addr = (void *)vkGetSwapchainImagesKHR; 1267 return true; 1268 } 1269 if (!strcmp("vkAcquireNextImageKHR", name)) { 1270 *addr = (void *)vkAcquireNextImageKHR; 1271 return true; 1272 } 1273 if (!strcmp("vkQueuePresentKHR", name)) { 1274 *addr = (void *)vkQueuePresentKHR; 1275 return true; 1276 } 1277 1278 #ifdef VK_USE_PLATFORM_WIN32_KHR 1279 /* 1280 * Functions for the VK_KHR_win32_surface extension: 1281 */ 1282 if (!strcmp("vkCreateWin32SurfaceKHR", name)) { 1283 *addr = ptr_instance->wsi_win32_surface_enabled 1284 ? (void *)vkCreateWin32SurfaceKHR 1285 : NULL; 1286 return true; 1287 } 1288 if (!strcmp("vkGetPhysicalDeviceWin32PresentationSupportKHR", name)) { 1289 *addr = ptr_instance->wsi_win32_surface_enabled 1290 ? (void *)vkGetPhysicalDeviceWin32PresentationSupportKHR 1291 : NULL; 1292 return true; 1293 } 1294 #endif // VK_USE_PLATFORM_WIN32_KHR 1295 #ifdef VK_USE_PLATFORM_MIR_KHR 1296 /* 1297 * Functions for the VK_KHR_mir_surface extension: 1298 */ 1299 if (!strcmp("vkCreateMirSurfaceKHR", name)) { 1300 *addr = ptr_instance->wsi_mir_surface_enabled 1301 ? (void *)vkCreateMirSurfaceKHR 1302 : NULL; 1303 return true; 1304 } 1305 if (!strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name)) { 1306 *addr = ptr_instance->wsi_mir_surface_enabled 1307 ? (void *)vkGetPhysicalDeviceMirPresentationSupportKHR 1308 : NULL; 1309 return true; 1310 } 1311 #endif // VK_USE_PLATFORM_MIR_KHR 1312 #ifdef VK_USE_PLATFORM_WAYLAND_KHR 1313 /* 1314 * Functions for the VK_KHR_wayland_surface extension: 1315 */ 1316 if (!strcmp("vkCreateWaylandSurfaceKHR", name)) { 1317 *addr = ptr_instance->wsi_wayland_surface_enabled 1318 ? (void *)vkCreateWaylandSurfaceKHR 1319 : NULL; 1320 return true; 1321 } 1322 if (!strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name)) { 1323 *addr = ptr_instance->wsi_wayland_surface_enabled 1324 ? (void *)vkGetPhysicalDeviceWaylandPresentationSupportKHR 1325 : NULL; 1326 return true; 1327 } 1328 #endif // VK_USE_PLATFORM_WAYLAND_KHR 1329 #ifdef VK_USE_PLATFORM_XCB_KHR 1330 /* 1331 * Functions for the VK_KHR_xcb_surface extension: 1332 */ 1333 if (!strcmp("vkCreateXcbSurfaceKHR", name)) { 1334 *addr = ptr_instance->wsi_xcb_surface_enabled 1335 ? (void *)vkCreateXcbSurfaceKHR 1336 : NULL; 1337 return true; 1338 } 1339 if (!strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name)) { 1340 *addr = ptr_instance->wsi_xcb_surface_enabled 1341 ? (void *)vkGetPhysicalDeviceXcbPresentationSupportKHR 1342 : NULL; 1343 return true; 1344 } 1345 #endif // VK_USE_PLATFORM_XCB_KHR 1346 #ifdef VK_USE_PLATFORM_XLIB_KHR 1347 /* 1348 * Functions for the VK_KHR_xlib_surface extension: 1349 */ 1350 if (!strcmp("vkCreateXlibSurfaceKHR", name)) { 1351 *addr = ptr_instance->wsi_xlib_surface_enabled 1352 ? (void *)vkCreateXlibSurfaceKHR 1353 : NULL; 1354 return true; 1355 } 1356 if (!strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name)) { 1357 *addr = ptr_instance->wsi_xlib_surface_enabled 1358 ? (void *)vkGetPhysicalDeviceXlibPresentationSupportKHR 1359 : NULL; 1360 return true; 1361 } 1362 #endif // VK_USE_PLATFORM_XLIB_KHR 1363 #ifdef VK_USE_PLATFORM_ANDROID_KHR 1364 /* 1365 * Functions for the VK_KHR_android_surface extension: 1366 */ 1367 if (!strcmp("vkCreateAndroidSurfaceKHR", name)) { 1368 *addr = ptr_instance->wsi_xlib_surface_enabled 1369 ? (void *)vkCreateAndroidSurfaceKHR 1370 : NULL; 1371 return true; 1372 } 1373 #endif // VK_USE_PLATFORM_ANDROID_KHR 1374 1375 /* 1376 * Functions for VK_KHR_display extension: 1377 */ 1378 if (!strcmp("vkGetPhysicalDeviceDisplayPropertiesKHR", name)) { 1379 *addr = ptr_instance->wsi_display_enabled 1380 ? (void *)vkGetPhysicalDeviceDisplayPropertiesKHR 1381 : NULL; 1382 return true; 1383 } 1384 if (!strcmp("vkGetPhysicalDeviceDisplayPlanePropertiesKHR", name)) { 1385 *addr = ptr_instance->wsi_display_enabled 1386 ? (void *)vkGetPhysicalDeviceDisplayPlanePropertiesKHR 1387 : NULL; 1388 return true; 1389 } 1390 if (!strcmp("vkGetDisplayPlaneSupportedDisplaysKHR", name)) { 1391 *addr = ptr_instance->wsi_display_enabled 1392 ? (void *)vkGetDisplayPlaneSupportedDisplaysKHR 1393 : NULL; 1394 return true; 1395 } 1396 if (!strcmp("vkGetDisplayModePropertiesKHR", name)) { 1397 *addr = ptr_instance->wsi_display_enabled 1398 ? (void *)vkGetDisplayModePropertiesKHR 1399 : NULL; 1400 return true; 1401 } 1402 if (!strcmp("vkCreateDisplayModeKHR", name)) { 1403 *addr = ptr_instance->wsi_display_enabled 1404 ? (void *)vkCreateDisplayModeKHR 1405 : NULL; 1406 return true; 1407 } 1408 if (!strcmp("vkGetDisplayPlaneCapabilitiesKHR", name)) { 1409 *addr = ptr_instance->wsi_display_enabled 1410 ? (void *)vkGetDisplayPlaneCapabilitiesKHR 1411 : NULL; 1412 return true; 1413 } 1414 if (!strcmp("vkCreateDisplayPlaneSurfaceKHR", name)) { 1415 *addr = ptr_instance->wsi_display_enabled 1416 ? (void *)vkCreateDisplayPlaneSurfaceKHR 1417 : NULL; 1418 return true; 1419 } 1420 return false; 1421 }