1 /* 2 * 3 * Copyright (c) 2015-2016 The Khronos Group Inc. 4 * Copyright (c) 2015-2016 Valve Corporation 5 * Copyright (c) 2015-2016 LunarG, Inc. 6 * Copyright (C) 2015 Google Inc. 7 * 8 * Permission is hereby granted, free of charge, to any person obtaining a copy 9 * of this software and/or associated documentation files (the "Materials"), to 10 * deal in the Materials without restriction, including without limitation the 11 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 12 * sell copies of the Materials, and to permit persons to whom the Materials are 13 * furnished to do so, subject to the following conditions: 14 * 15 * The above copyright notice(s) and this permission notice shall be included in 16 * all copies or substantial portions of the Materials. 17 * 18 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 21 * 22 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 23 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 24 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE 25 * USE OR OTHER DEALINGS IN THE MATERIALS. 26 * 27 * Author: Courtney Goeltzenleuchter <courtney (at) lunarg.com> 28 * Author: Jon Ashburn <jon (at) lunarg.com> 29 * Author: Tony Barbour <tony (at) LunarG.com> 30 * Author: Chia-I Wu <olv (at) lunarg.com> 31 */ 32 #define _GNU_SOURCE 33 #include <stdlib.h> 34 #include <string.h> 35 36 #include "vk_loader_platform.h" 37 #include "loader.h" 38 #include "debug_report.h" 39 #include "wsi.h" 40 #include "gpa_helper.h" 41 #include "table_ops.h" 42 43 /* Trampoline entrypoints are in this file for core Vulkan commands */ 44 /** 45 * Get an instance level or global level entry point address. 46 * @param instance 47 * @param pName 48 * @return 49 * If instance == NULL returns a global level functions only 50 * If instance is valid returns a trampoline entry point for all dispatchable 51 * Vulkan 52 * functions both core and extensions. 53 */ 54 LOADER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL 55 vkGetInstanceProcAddr(VkInstance instance, const char *pName) { 56 57 void *addr; 58 59 addr = globalGetProcAddr(pName); 60 if (instance == VK_NULL_HANDLE) { 61 // get entrypoint addresses that are global (no dispatchable object) 62 63 return addr; 64 } else { 65 // if a global entrypoint return NULL 66 if (addr) 67 return NULL; 68 } 69 70 struct loader_instance *ptr_instance = loader_get_instance(instance); 71 if (ptr_instance == NULL) 72 return NULL; 73 // Return trampoline code for non-global entrypoints including any 74 // extensions. 75 // Device extensions are returned if a layer or ICD supports the extension. 76 // Instance extensions are returned if the extension is enabled and the 77 // loader 78 // or someone else supports the extension 79 return trampolineGetProcAddr(ptr_instance, pName); 80 } 81 82 /** 83 * Get a device level or global level entry point address. 84 * @param device 85 * @param pName 86 * @return 87 * If device is valid, returns a device relative entry point for device level 88 * entry points both core and extensions. 89 * Device relative means call down the device chain. 90 */ 91 LOADER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL 92 vkGetDeviceProcAddr(VkDevice device, const char *pName) { 93 void *addr; 94 95 /* for entrypoints that loader must handle (ie non-dispatchable or create 96 object) 97 make sure the loader entrypoint is returned */ 98 addr = loader_non_passthrough_gdpa(pName); 99 if (addr) { 100 return addr; 101 } 102 103 /* Although CreateDevice is on device chain it's dispatchable object isn't 104 * a VkDevice or child of VkDevice so return NULL. 105 */ 106 if (!strcmp(pName, "CreateDevice")) 107 return NULL; 108 109 /* return the dispatch table entrypoint for the fastest case */ 110 const VkLayerDispatchTable *disp_table = *(VkLayerDispatchTable **)device; 111 if (disp_table == NULL) 112 return NULL; 113 114 addr = loader_lookup_device_dispatch_table(disp_table, pName); 115 if (addr) 116 return addr; 117 118 if (disp_table->GetDeviceProcAddr == NULL) 119 return NULL; 120 return disp_table->GetDeviceProcAddr(device, pName); 121 } 122 123 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 124 vkEnumerateInstanceExtensionProperties(const char *pLayerName, 125 uint32_t *pPropertyCount, 126 VkExtensionProperties *pProperties) { 127 struct loader_extension_list *global_ext_list = NULL; 128 struct loader_layer_list instance_layers; 129 struct loader_extension_list icd_extensions; 130 struct loader_icd_libs icd_libs; 131 uint32_t copy_size; 132 133 tls_instance = NULL; 134 memset(&icd_extensions, 0, sizeof(icd_extensions)); 135 memset(&instance_layers, 0, sizeof(instance_layers)); 136 loader_platform_thread_once(&once_init, loader_initialize); 137 138 /* get layer libraries if needed */ 139 if (pLayerName && strlen(pLayerName) != 0) { 140 if (vk_string_validate(MaxLoaderStringLength, pLayerName) == 141 VK_STRING_ERROR_NONE) { 142 loader_layer_scan(NULL, &instance_layers, NULL); 143 for (uint32_t i = 0; i < instance_layers.count; i++) { 144 struct loader_layer_properties *props = 145 &instance_layers.list[i]; 146 if (strcmp(props->info.layerName, pLayerName) == 0) { 147 global_ext_list = &props->instance_extension_list; 148 } 149 } 150 } else { 151 assert(VK_FALSE && "vkEnumerateInstanceExtensionProperties: " 152 "pLayerName is too long or is badly formed"); 153 return VK_ERROR_EXTENSION_NOT_PRESENT; 154 } 155 } else { 156 /* Scan/discover all ICD libraries */ 157 memset(&icd_libs, 0, sizeof(struct loader_icd_libs)); 158 loader_icd_scan(NULL, &icd_libs); 159 /* get extensions from all ICD's, merge so no duplicates */ 160 loader_get_icd_loader_instance_extensions(NULL, &icd_libs, 161 &icd_extensions); 162 loader_scanned_icd_clear(NULL, &icd_libs); 163 global_ext_list = &icd_extensions; 164 } 165 166 if (global_ext_list == NULL) { 167 loader_destroy_layer_list(NULL, &instance_layers); 168 return VK_ERROR_LAYER_NOT_PRESENT; 169 } 170 171 if (pProperties == NULL) { 172 *pPropertyCount = global_ext_list->count; 173 loader_destroy_layer_list(NULL, &instance_layers); 174 loader_destroy_generic_list( 175 NULL, (struct loader_generic_list *)&icd_extensions); 176 return VK_SUCCESS; 177 } 178 179 copy_size = *pPropertyCount < global_ext_list->count 180 ? *pPropertyCount 181 : global_ext_list->count; 182 for (uint32_t i = 0; i < copy_size; i++) { 183 memcpy(&pProperties[i], &global_ext_list->list[i], 184 sizeof(VkExtensionProperties)); 185 } 186 *pPropertyCount = copy_size; 187 loader_destroy_generic_list(NULL, 188 (struct loader_generic_list *)&icd_extensions); 189 190 if (copy_size < global_ext_list->count) { 191 loader_destroy_layer_list(NULL, &instance_layers); 192 return VK_INCOMPLETE; 193 } 194 195 loader_destroy_layer_list(NULL, &instance_layers); 196 return VK_SUCCESS; 197 } 198 199 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 200 vkEnumerateInstanceLayerProperties(uint32_t *pPropertyCount, 201 VkLayerProperties *pProperties) { 202 203 struct loader_layer_list instance_layer_list; 204 tls_instance = NULL; 205 206 loader_platform_thread_once(&once_init, loader_initialize); 207 208 uint32_t copy_size; 209 210 /* get layer libraries */ 211 memset(&instance_layer_list, 0, sizeof(instance_layer_list)); 212 loader_layer_scan(NULL, &instance_layer_list, NULL); 213 214 if (pProperties == NULL) { 215 *pPropertyCount = instance_layer_list.count; 216 loader_destroy_layer_list(NULL, &instance_layer_list); 217 return VK_SUCCESS; 218 } 219 220 copy_size = (*pPropertyCount < instance_layer_list.count) 221 ? *pPropertyCount 222 : instance_layer_list.count; 223 for (uint32_t i = 0; i < copy_size; i++) { 224 memcpy(&pProperties[i], &instance_layer_list.list[i].info, 225 sizeof(VkLayerProperties)); 226 } 227 228 *pPropertyCount = copy_size; 229 loader_destroy_layer_list(NULL, &instance_layer_list); 230 231 if (copy_size < instance_layer_list.count) { 232 return VK_INCOMPLETE; 233 } 234 235 return VK_SUCCESS; 236 } 237 238 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 239 vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, 240 const VkAllocationCallbacks *pAllocator, 241 VkInstance *pInstance) { 242 struct loader_instance *ptr_instance = NULL; 243 VkInstance created_instance = VK_NULL_HANDLE; 244 VkResult res = VK_ERROR_INITIALIZATION_FAILED; 245 VkDebugReportCallbackEXT instance_callback = VK_NULL_HANDLE; 246 void *pNext = (void *)pCreateInfo->pNext; 247 248 loader_platform_thread_once(&once_init, loader_initialize); 249 250 #if 0 251 if (pAllocator) { 252 ptr_instance = (struct loader_instance *) pAllocator->pfnAllocation( 253 pAllocator->pUserData, 254 sizeof(struct loader_instance), 255 sizeof(int *), 256 VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); 257 } else { 258 #endif 259 ptr_instance = 260 (struct loader_instance *)malloc(sizeof(struct loader_instance)); 261 //} 262 if (ptr_instance == NULL) { 263 return VK_ERROR_OUT_OF_HOST_MEMORY; 264 } 265 266 tls_instance = ptr_instance; 267 loader_platform_thread_lock_mutex(&loader_lock); 268 memset(ptr_instance, 0, sizeof(struct loader_instance)); 269 #if 0 270 if (pAllocator) { 271 ptr_instance->alloc_callbacks = *pAllocator; 272 } 273 #endif 274 275 /* 276 * Look for a debug report create info structure 277 * and setup a callback if found. 278 */ 279 while (pNext) { 280 if (((VkInstanceCreateInfo *)pNext)->sType == 281 VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT) { 282 instance_callback = (VkDebugReportCallbackEXT)ptr_instance; 283 if (util_CreateDebugReportCallback(ptr_instance, pNext, NULL, 284 instance_callback)) { 285 loader_heap_free(ptr_instance, ptr_instance); 286 loader_platform_thread_unlock_mutex(&loader_lock); 287 return VK_ERROR_OUT_OF_HOST_MEMORY; 288 } 289 } 290 pNext = (void *)((VkInstanceCreateInfo *)pNext)->pNext; 291 } 292 293 /* Due to implicit layers need to get layer list even if 294 * enabledLayerCount == 0 and VK_INSTANCE_LAYERS is unset. For now always 295 * get layer list (both instance and device) via loader_layer_scan(). */ 296 memset(&ptr_instance->instance_layer_list, 0, 297 sizeof(ptr_instance->instance_layer_list)); 298 memset(&ptr_instance->device_layer_list, 0, 299 sizeof(ptr_instance->device_layer_list)); 300 loader_layer_scan(ptr_instance, &ptr_instance->instance_layer_list, 301 &ptr_instance->device_layer_list); 302 303 /* validate the app requested layers to be enabled */ 304 if (pCreateInfo->enabledLayerCount > 0) { 305 res = 306 loader_validate_layers(ptr_instance, pCreateInfo->enabledLayerCount, 307 pCreateInfo->ppEnabledLayerNames, 308 &ptr_instance->instance_layer_list); 309 if (res != VK_SUCCESS) { 310 util_DestroyDebugReportCallback(ptr_instance, instance_callback, 311 NULL); 312 loader_heap_free(ptr_instance, ptr_instance); 313 loader_platform_thread_unlock_mutex(&loader_lock); 314 return res; 315 } 316 } 317 318 /* convert any meta layers to the actual layers makes a copy of layer name*/ 319 uint32_t saved_layer_count = pCreateInfo->enabledLayerCount; 320 char **saved_layer_names; 321 char **saved_layer_ptr; 322 saved_layer_names = 323 loader_stack_alloc(sizeof(char *) * pCreateInfo->enabledLayerCount); 324 for (uint32_t i = 0; i < saved_layer_count; i++) { 325 saved_layer_names[i] = (char *)pCreateInfo->ppEnabledLayerNames[i]; 326 } 327 saved_layer_ptr = (char **)pCreateInfo->ppEnabledLayerNames; 328 329 loader_expand_layer_names( 330 ptr_instance, std_validation_str, 331 sizeof(std_validation_names) / sizeof(std_validation_names[0]), 332 std_validation_names, (uint32_t *)&pCreateInfo->enabledLayerCount, 333 (char ***)&pCreateInfo->ppEnabledLayerNames); 334 335 /* Scan/discover all ICD libraries */ 336 memset(&ptr_instance->icd_libs, 0, sizeof(ptr_instance->icd_libs)); 337 loader_icd_scan(ptr_instance, &ptr_instance->icd_libs); 338 339 /* get extensions from all ICD's, merge so no duplicates, then validate */ 340 loader_get_icd_loader_instance_extensions( 341 ptr_instance, &ptr_instance->icd_libs, &ptr_instance->ext_list); 342 res = loader_validate_instance_extensions( 343 ptr_instance, &ptr_instance->ext_list, 344 &ptr_instance->instance_layer_list, pCreateInfo); 345 if (res != VK_SUCCESS) { 346 loader_unexpand_inst_layer_names(ptr_instance, saved_layer_count, 347 saved_layer_names, saved_layer_ptr, 348 pCreateInfo); 349 loader_delete_layer_properties(ptr_instance, 350 &ptr_instance->device_layer_list); 351 loader_delete_layer_properties(ptr_instance, 352 &ptr_instance->instance_layer_list); 353 loader_scanned_icd_clear(ptr_instance, &ptr_instance->icd_libs); 354 loader_destroy_generic_list( 355 ptr_instance, 356 (struct loader_generic_list *)&ptr_instance->ext_list); 357 util_DestroyDebugReportCallback(ptr_instance, instance_callback, NULL); 358 loader_platform_thread_unlock_mutex(&loader_lock); 359 loader_heap_free(ptr_instance, ptr_instance); 360 return res; 361 } 362 363 ptr_instance->disp = 364 loader_heap_alloc(ptr_instance, sizeof(VkLayerInstanceDispatchTable), 365 VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); 366 if (ptr_instance->disp == NULL) { 367 loader_unexpand_inst_layer_names(ptr_instance, saved_layer_count, 368 saved_layer_names, saved_layer_ptr, 369 pCreateInfo); 370 loader_delete_layer_properties(ptr_instance, 371 &ptr_instance->device_layer_list); 372 loader_delete_layer_properties(ptr_instance, 373 &ptr_instance->instance_layer_list); 374 loader_scanned_icd_clear(ptr_instance, &ptr_instance->icd_libs); 375 loader_destroy_generic_list( 376 ptr_instance, 377 (struct loader_generic_list *)&ptr_instance->ext_list); 378 util_DestroyDebugReportCallback(ptr_instance, instance_callback, NULL); 379 loader_platform_thread_unlock_mutex(&loader_lock); 380 loader_heap_free(ptr_instance, ptr_instance); 381 return VK_ERROR_OUT_OF_HOST_MEMORY; 382 } 383 memcpy(ptr_instance->disp, &instance_disp, sizeof(instance_disp)); 384 ptr_instance->next = loader.instances; 385 loader.instances = ptr_instance; 386 387 /* activate any layers on instance chain */ 388 res = loader_enable_instance_layers(ptr_instance, pCreateInfo, 389 &ptr_instance->instance_layer_list); 390 if (res != VK_SUCCESS) { 391 loader_unexpand_inst_layer_names(ptr_instance, saved_layer_count, 392 saved_layer_names, saved_layer_ptr, 393 pCreateInfo); 394 loader_delete_layer_properties(ptr_instance, 395 &ptr_instance->device_layer_list); 396 loader_delete_layer_properties(ptr_instance, 397 &ptr_instance->instance_layer_list); 398 loader_scanned_icd_clear(ptr_instance, &ptr_instance->icd_libs); 399 loader_destroy_generic_list( 400 ptr_instance, 401 (struct loader_generic_list *)&ptr_instance->ext_list); 402 loader.instances = ptr_instance->next; 403 util_DestroyDebugReportCallback(ptr_instance, instance_callback, NULL); 404 loader_platform_thread_unlock_mutex(&loader_lock); 405 loader_heap_free(ptr_instance, ptr_instance->disp); 406 loader_heap_free(ptr_instance, ptr_instance); 407 return res; 408 } 409 410 created_instance = (VkInstance)ptr_instance; 411 res = loader_create_instance_chain(pCreateInfo, pAllocator, ptr_instance, 412 &created_instance); 413 414 if (res == VK_SUCCESS) { 415 wsi_create_instance(ptr_instance, pCreateInfo); 416 debug_report_create_instance(ptr_instance, pCreateInfo); 417 418 *pInstance = created_instance; 419 420 /* 421 * Finally have the layers in place and everyone has seen 422 * the CreateInstance command go by. This allows the layer's 423 * GetInstanceProcAddr functions to return valid extension functions 424 * if enabled. 425 */ 426 loader_activate_instance_layer_extensions(ptr_instance, *pInstance); 427 } else { 428 // TODO: cleanup here. 429 } 430 431 /* Remove temporary debug_report callback */ 432 util_DestroyDebugReportCallback(ptr_instance, instance_callback, NULL); 433 loader_unexpand_inst_layer_names(ptr_instance, saved_layer_count, 434 saved_layer_names, saved_layer_ptr, 435 pCreateInfo); 436 loader_platform_thread_unlock_mutex(&loader_lock); 437 return res; 438 } 439 440 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 441 vkDestroyInstance(VkInstance instance, 442 const VkAllocationCallbacks *pAllocator) { 443 const VkLayerInstanceDispatchTable *disp; 444 struct loader_instance *ptr_instance = NULL; 445 disp = loader_get_instance_dispatch(instance); 446 447 loader_platform_thread_lock_mutex(&loader_lock); 448 449 /* TODO: Do we need a temporary callback here to catch cleanup issues? */ 450 451 ptr_instance = loader_get_instance(instance); 452 disp->DestroyInstance(instance, pAllocator); 453 454 loader_deactivate_instance_layers(ptr_instance); 455 if (ptr_instance->phys_devs) 456 loader_heap_free(ptr_instance, ptr_instance->phys_devs); 457 loader_heap_free(ptr_instance, ptr_instance->disp); 458 loader_heap_free(ptr_instance, ptr_instance); 459 loader_platform_thread_unlock_mutex(&loader_lock); 460 } 461 462 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 463 vkEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, 464 VkPhysicalDevice *pPhysicalDevices) { 465 const VkLayerInstanceDispatchTable *disp; 466 VkResult res; 467 uint32_t count, i; 468 struct loader_instance *inst; 469 disp = loader_get_instance_dispatch(instance); 470 471 loader_platform_thread_lock_mutex(&loader_lock); 472 res = disp->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, 473 pPhysicalDevices); 474 475 if (res != VK_SUCCESS && res != VK_INCOMPLETE) { 476 loader_platform_thread_unlock_mutex(&loader_lock); 477 return res; 478 } 479 480 if (!pPhysicalDevices) { 481 loader_platform_thread_unlock_mutex(&loader_lock); 482 return res; 483 } 484 485 // wrap the PhysDev object for loader usage, return wrapped objects 486 inst = loader_get_instance(instance); 487 if (!inst) { 488 loader_platform_thread_unlock_mutex(&loader_lock); 489 return VK_ERROR_INITIALIZATION_FAILED; 490 } 491 if (inst->phys_devs) 492 loader_heap_free(inst, inst->phys_devs); 493 count = inst->total_gpu_count; 494 inst->phys_devs = (struct loader_physical_device *)loader_heap_alloc( 495 inst, count * sizeof(struct loader_physical_device), 496 VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); 497 if (!inst->phys_devs) { 498 loader_platform_thread_unlock_mutex(&loader_lock); 499 return VK_ERROR_OUT_OF_HOST_MEMORY; 500 } 501 502 for (i = 0; i < count; i++) { 503 504 // initialize the loader's physicalDevice object 505 loader_set_dispatch((void *)&inst->phys_devs[i], inst->disp); 506 inst->phys_devs[i].this_icd = inst->phys_devs_term[i].this_icd; 507 inst->phys_devs[i].phys_dev = pPhysicalDevices[i]; 508 509 // copy wrapped object into Application provided array 510 pPhysicalDevices[i] = (VkPhysicalDevice)&inst->phys_devs[i]; 511 } 512 loader_platform_thread_unlock_mutex(&loader_lock); 513 return res; 514 } 515 516 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 517 vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, 518 VkPhysicalDeviceFeatures *pFeatures) { 519 const VkLayerInstanceDispatchTable *disp; 520 VkPhysicalDevice unwrapped_phys_dev = 521 loader_unwrap_physical_device(physicalDevice); 522 disp = loader_get_instance_dispatch(physicalDevice); 523 disp->GetPhysicalDeviceFeatures(unwrapped_phys_dev, pFeatures); 524 } 525 526 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 527 vkGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, 528 VkFormat format, 529 VkFormatProperties *pFormatInfo) { 530 const VkLayerInstanceDispatchTable *disp; 531 VkPhysicalDevice unwrapped_pd = 532 loader_unwrap_physical_device(physicalDevice); 533 disp = loader_get_instance_dispatch(physicalDevice); 534 disp->GetPhysicalDeviceFormatProperties(unwrapped_pd, format, pFormatInfo); 535 } 536 537 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 538 vkGetPhysicalDeviceImageFormatProperties( 539 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, 540 VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, 541 VkImageFormatProperties *pImageFormatProperties) { 542 const VkLayerInstanceDispatchTable *disp; 543 VkPhysicalDevice unwrapped_phys_dev = 544 loader_unwrap_physical_device(physicalDevice); 545 disp = loader_get_instance_dispatch(physicalDevice); 546 return disp->GetPhysicalDeviceImageFormatProperties( 547 unwrapped_phys_dev, format, type, tiling, usage, flags, 548 pImageFormatProperties); 549 } 550 551 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 552 vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, 553 VkPhysicalDeviceProperties *pProperties) { 554 const VkLayerInstanceDispatchTable *disp; 555 VkPhysicalDevice unwrapped_phys_dev = 556 loader_unwrap_physical_device(physicalDevice); 557 disp = loader_get_instance_dispatch(physicalDevice); 558 disp->GetPhysicalDeviceProperties(unwrapped_phys_dev, pProperties); 559 } 560 561 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 562 vkGetPhysicalDeviceQueueFamilyProperties( 563 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, 564 VkQueueFamilyProperties *pQueueProperties) { 565 const VkLayerInstanceDispatchTable *disp; 566 VkPhysicalDevice unwrapped_phys_dev = 567 loader_unwrap_physical_device(physicalDevice); 568 disp = loader_get_instance_dispatch(physicalDevice); 569 disp->GetPhysicalDeviceQueueFamilyProperties( 570 unwrapped_phys_dev, pQueueFamilyPropertyCount, pQueueProperties); 571 } 572 573 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceMemoryProperties( 574 VkPhysicalDevice physicalDevice, 575 VkPhysicalDeviceMemoryProperties *pMemoryProperties) { 576 const VkLayerInstanceDispatchTable *disp; 577 VkPhysicalDevice unwrapped_phys_dev = 578 loader_unwrap_physical_device(physicalDevice); 579 disp = loader_get_instance_dispatch(physicalDevice); 580 disp->GetPhysicalDeviceMemoryProperties(unwrapped_phys_dev, 581 pMemoryProperties); 582 } 583 584 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 585 vkCreateDevice(VkPhysicalDevice physicalDevice, 586 const VkDeviceCreateInfo *pCreateInfo, 587 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) { 588 VkResult res; 589 struct loader_physical_device *phys_dev; 590 struct loader_icd *icd; 591 struct loader_device *dev; 592 struct loader_instance *inst; 593 struct loader_layer_list activated_layer_list = {0}; 594 595 assert(pCreateInfo->queueCreateInfoCount >= 1); 596 597 loader_platform_thread_lock_mutex(&loader_lock); 598 599 phys_dev = (struct loader_physical_device *)physicalDevice; 600 icd = phys_dev->this_icd; 601 if (!icd) { 602 loader_platform_thread_unlock_mutex(&loader_lock); 603 return VK_ERROR_INITIALIZATION_FAILED; 604 } 605 606 inst = (struct loader_instance *)phys_dev->this_icd->this_instance; 607 608 if (!icd->CreateDevice) { 609 loader_platform_thread_unlock_mutex(&loader_lock); 610 return VK_ERROR_INITIALIZATION_FAILED; 611 } 612 613 /* validate any app enabled layers are available */ 614 if (pCreateInfo->enabledLayerCount > 0) { 615 res = loader_validate_layers(inst, pCreateInfo->enabledLayerCount, 616 pCreateInfo->ppEnabledLayerNames, 617 &inst->device_layer_list); 618 if (res != VK_SUCCESS) { 619 loader_platform_thread_unlock_mutex(&loader_lock); 620 return res; 621 } 622 } 623 624 /* Get the physical device (ICD) extensions */ 625 struct loader_extension_list icd_exts; 626 if (!loader_init_generic_list(inst, (struct loader_generic_list *)&icd_exts, 627 sizeof(VkExtensionProperties))) { 628 loader_platform_thread_unlock_mutex(&loader_lock); 629 return VK_ERROR_OUT_OF_HOST_MEMORY; 630 } 631 632 //TODO handle more than one phys dev per icd (icd->phys_devs[0]) 633 res = loader_add_device_extensions( 634 inst, icd, icd->phys_devs[0], 635 phys_dev->this_icd->this_icd_lib->lib_name, &icd_exts); 636 if (res != VK_SUCCESS) { 637 loader_platform_thread_unlock_mutex(&loader_lock); 638 return res; 639 } 640 641 /* convert any meta layers to the actual layers makes a copy of layer name*/ 642 uint32_t saved_layer_count = pCreateInfo->enabledLayerCount; 643 char **saved_layer_names; 644 char **saved_layer_ptr; 645 saved_layer_names = 646 loader_stack_alloc(sizeof(char *) * pCreateInfo->enabledLayerCount); 647 for (uint32_t i = 0; i < saved_layer_count; i++) { 648 saved_layer_names[i] = (char *)pCreateInfo->ppEnabledLayerNames[i]; 649 } 650 saved_layer_ptr = (char **)pCreateInfo->ppEnabledLayerNames; 651 652 loader_expand_layer_names( 653 inst, std_validation_str, 654 sizeof(std_validation_names) / sizeof(std_validation_names[0]), 655 std_validation_names, (uint32_t *)&pCreateInfo->enabledLayerCount, 656 (char ***)&pCreateInfo->ppEnabledLayerNames); 657 658 /* fetch a list of all layers activated, explicit and implicit */ 659 res = loader_enable_device_layers(inst, icd, &activated_layer_list, 660 pCreateInfo, &inst->device_layer_list); 661 if (res != VK_SUCCESS) { 662 loader_unexpand_dev_layer_names(inst, saved_layer_count, 663 saved_layer_names, saved_layer_ptr, 664 pCreateInfo); 665 loader_platform_thread_unlock_mutex(&loader_lock); 666 return res; 667 } 668 669 /* make sure requested extensions to be enabled are supported */ 670 res = loader_validate_device_extensions(phys_dev, &activated_layer_list, 671 &icd_exts, pCreateInfo); 672 if (res != VK_SUCCESS) { 673 loader_unexpand_dev_layer_names(inst, saved_layer_count, 674 saved_layer_names, saved_layer_ptr, 675 pCreateInfo); 676 loader_destroy_generic_list( 677 inst, (struct loader_generic_list *)&activated_layer_list); 678 loader_platform_thread_unlock_mutex(&loader_lock); 679 return res; 680 } 681 682 dev = loader_add_logical_device(inst, &icd->logical_device_list); 683 if (dev == NULL) { 684 loader_unexpand_dev_layer_names(inst, saved_layer_count, 685 saved_layer_names, saved_layer_ptr, 686 pCreateInfo); 687 loader_destroy_generic_list( 688 inst, (struct loader_generic_list *)&activated_layer_list); 689 loader_platform_thread_unlock_mutex(&loader_lock); 690 return VK_ERROR_OUT_OF_HOST_MEMORY; 691 } 692 693 /* move the locally filled layer list into the device, and pass ownership of 694 * the memory */ 695 dev->activated_layer_list.capacity = activated_layer_list.capacity; 696 dev->activated_layer_list.count = activated_layer_list.count; 697 dev->activated_layer_list.list = activated_layer_list.list; 698 memset(&activated_layer_list, 0, sizeof(activated_layer_list)); 699 700 /* activate any layers on device chain which terminates with device*/ 701 res = loader_enable_device_layers(inst, icd, &dev->activated_layer_list, 702 pCreateInfo, &inst->device_layer_list); 703 if (res != VK_SUCCESS) { 704 loader_unexpand_dev_layer_names(inst, saved_layer_count, 705 saved_layer_names, saved_layer_ptr, 706 pCreateInfo); 707 loader_remove_logical_device(inst, icd, dev); 708 loader_platform_thread_unlock_mutex(&loader_lock); 709 return res; 710 } 711 712 res = loader_create_device_chain(phys_dev, pCreateInfo, pAllocator, inst, 713 icd, dev); 714 if (res != VK_SUCCESS) { 715 loader_unexpand_dev_layer_names(inst, saved_layer_count, 716 saved_layer_names, saved_layer_ptr, 717 pCreateInfo); 718 loader_remove_logical_device(inst, icd, dev); 719 loader_platform_thread_unlock_mutex(&loader_lock); 720 return res; 721 } 722 723 *pDevice = dev->device; 724 725 /* initialize any device extension dispatch entry's from the instance list*/ 726 loader_init_dispatch_dev_ext(inst, dev); 727 728 /* initialize WSI device extensions as part of core dispatch since loader 729 * has 730 * dedicated trampoline code for these*/ 731 loader_init_device_extension_dispatch_table( 732 &dev->loader_dispatch, 733 dev->loader_dispatch.core_dispatch.GetDeviceProcAddr, *pDevice); 734 735 loader_unexpand_dev_layer_names(inst, saved_layer_count, saved_layer_names, 736 saved_layer_ptr, pCreateInfo); 737 738 loader_platform_thread_unlock_mutex(&loader_lock); 739 return res; 740 } 741 742 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 743 vkDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) { 744 const VkLayerDispatchTable *disp; 745 struct loader_device *dev; 746 747 loader_platform_thread_lock_mutex(&loader_lock); 748 749 struct loader_icd *icd = loader_get_icd_and_device(device, &dev); 750 const struct loader_instance *inst = icd->this_instance; 751 disp = loader_get_dispatch(device); 752 753 disp->DestroyDevice(device, pAllocator); 754 dev->device = NULL; 755 loader_remove_logical_device(inst, icd, dev); 756 757 loader_platform_thread_unlock_mutex(&loader_lock); 758 } 759 760 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 761 vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, 762 const char *pLayerName, 763 uint32_t *pPropertyCount, 764 VkExtensionProperties *pProperties) { 765 VkResult res = VK_SUCCESS; 766 struct loader_physical_device *phys_dev; 767 phys_dev = (struct loader_physical_device *)physicalDevice; 768 769 loader_platform_thread_lock_mutex(&loader_lock); 770 771 /* If pLayerName == NULL, then querying ICD extensions, pass this call 772 down the instance chain which will terminate in the ICD. This allows 773 layers to filter the extensions coming back up the chain. 774 If pLayerName != NULL then get layer extensions from manifest file. */ 775 if (pLayerName == NULL || strlen(pLayerName) == 0) { 776 const VkLayerInstanceDispatchTable *disp; 777 778 disp = loader_get_instance_dispatch(physicalDevice); 779 res = disp->EnumerateDeviceExtensionProperties( 780 phys_dev->phys_dev, NULL, pPropertyCount, pProperties); 781 } else { 782 783 uint32_t count; 784 uint32_t copy_size; 785 const struct loader_instance *inst = phys_dev->this_icd->this_instance; 786 if (vk_string_validate(MaxLoaderStringLength, pLayerName) == 787 VK_STRING_ERROR_NONE) { 788 789 struct loader_device_extension_list *dev_ext_list = NULL; 790 for (uint32_t i = 0; i < inst->device_layer_list.count; i++) { 791 struct loader_layer_properties *props = 792 &inst->device_layer_list.list[i]; 793 if (strcmp(props->info.layerName, pLayerName) == 0) { 794 dev_ext_list = &props->device_extension_list; 795 } 796 } 797 count = (dev_ext_list == NULL) ? 0 : dev_ext_list->count; 798 if (pProperties == NULL) { 799 *pPropertyCount = count; 800 loader_platform_thread_unlock_mutex(&loader_lock); 801 return VK_SUCCESS; 802 } 803 804 copy_size = *pPropertyCount < count ? *pPropertyCount : count; 805 for (uint32_t i = 0; i < copy_size; i++) { 806 memcpy(&pProperties[i], &dev_ext_list->list[i].props, 807 sizeof(VkExtensionProperties)); 808 } 809 *pPropertyCount = copy_size; 810 811 if (copy_size < count) { 812 loader_platform_thread_unlock_mutex(&loader_lock); 813 return VK_INCOMPLETE; 814 } 815 } else { 816 loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, 817 "vkEnumerateDeviceExtensionProperties: pLayerName " 818 "is too long or is badly formed"); 819 loader_platform_thread_unlock_mutex(&loader_lock); 820 return VK_ERROR_EXTENSION_NOT_PRESENT; 821 } 822 } 823 824 loader_platform_thread_unlock_mutex(&loader_lock); 825 return res; 826 } 827 828 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 829 vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, 830 uint32_t *pPropertyCount, 831 VkLayerProperties *pProperties) { 832 uint32_t copy_size; 833 struct loader_physical_device *phys_dev; 834 835 loader_platform_thread_lock_mutex(&loader_lock); 836 837 /* Don't dispatch this call down the instance chain, want all device layers 838 enumerated and instance chain may not contain all device layers */ 839 840 phys_dev = (struct loader_physical_device *)physicalDevice; 841 const struct loader_instance *inst = phys_dev->this_icd->this_instance; 842 uint32_t count = inst->device_layer_list.count; 843 844 if (pProperties == NULL) { 845 *pPropertyCount = count; 846 loader_platform_thread_unlock_mutex(&loader_lock); 847 return VK_SUCCESS; 848 } 849 850 copy_size = (*pPropertyCount < count) ? *pPropertyCount : count; 851 for (uint32_t i = 0; i < copy_size; i++) { 852 memcpy(&pProperties[i], &(inst->device_layer_list.list[i].info), 853 sizeof(VkLayerProperties)); 854 } 855 *pPropertyCount = copy_size; 856 857 if (copy_size < count) { 858 loader_platform_thread_unlock_mutex(&loader_lock); 859 return VK_INCOMPLETE; 860 } 861 862 loader_platform_thread_unlock_mutex(&loader_lock); 863 return VK_SUCCESS; 864 } 865 866 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 867 vkGetDeviceQueue(VkDevice device, uint32_t queueNodeIndex, uint32_t queueIndex, 868 VkQueue *pQueue) { 869 const VkLayerDispatchTable *disp; 870 871 disp = loader_get_dispatch(device); 872 873 disp->GetDeviceQueue(device, queueNodeIndex, queueIndex, pQueue); 874 loader_set_dispatch(*pQueue, disp); 875 } 876 877 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 878 vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, 879 VkFence fence) { 880 const VkLayerDispatchTable *disp; 881 882 disp = loader_get_dispatch(queue); 883 884 return disp->QueueSubmit(queue, submitCount, pSubmits, fence); 885 } 886 887 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(VkQueue queue) { 888 const VkLayerDispatchTable *disp; 889 890 disp = loader_get_dispatch(queue); 891 892 return disp->QueueWaitIdle(queue); 893 } 894 895 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(VkDevice device) { 896 const VkLayerDispatchTable *disp; 897 898 disp = loader_get_dispatch(device); 899 900 return disp->DeviceWaitIdle(device); 901 } 902 903 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 904 vkAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo, 905 const VkAllocationCallbacks *pAllocator, 906 VkDeviceMemory *pMemory) { 907 const VkLayerDispatchTable *disp; 908 909 disp = loader_get_dispatch(device); 910 911 return disp->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory); 912 } 913 914 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 915 vkFreeMemory(VkDevice device, VkDeviceMemory mem, 916 const VkAllocationCallbacks *pAllocator) { 917 const VkLayerDispatchTable *disp; 918 919 disp = loader_get_dispatch(device); 920 921 disp->FreeMemory(device, mem, pAllocator); 922 } 923 924 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 925 vkMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, 926 VkDeviceSize size, VkFlags flags, void **ppData) { 927 const VkLayerDispatchTable *disp; 928 929 disp = loader_get_dispatch(device); 930 931 return disp->MapMemory(device, mem, offset, size, flags, ppData); 932 } 933 934 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 935 vkUnmapMemory(VkDevice device, VkDeviceMemory mem) { 936 const VkLayerDispatchTable *disp; 937 938 disp = loader_get_dispatch(device); 939 940 disp->UnmapMemory(device, mem); 941 } 942 943 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 944 vkFlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, 945 const VkMappedMemoryRange *pMemoryRanges) { 946 const VkLayerDispatchTable *disp; 947 948 disp = loader_get_dispatch(device); 949 950 return disp->FlushMappedMemoryRanges(device, memoryRangeCount, 951 pMemoryRanges); 952 } 953 954 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 955 vkInvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, 956 const VkMappedMemoryRange *pMemoryRanges) { 957 const VkLayerDispatchTable *disp; 958 959 disp = loader_get_dispatch(device); 960 961 return disp->InvalidateMappedMemoryRanges(device, memoryRangeCount, 962 pMemoryRanges); 963 } 964 965 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 966 vkGetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, 967 VkDeviceSize *pCommittedMemoryInBytes) { 968 const VkLayerDispatchTable *disp; 969 970 disp = loader_get_dispatch(device); 971 972 disp->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes); 973 } 974 975 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 976 vkBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem, 977 VkDeviceSize offset) { 978 const VkLayerDispatchTable *disp; 979 980 disp = loader_get_dispatch(device); 981 982 return disp->BindBufferMemory(device, buffer, mem, offset); 983 } 984 985 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 986 vkBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem, 987 VkDeviceSize offset) { 988 const VkLayerDispatchTable *disp; 989 990 disp = loader_get_dispatch(device); 991 992 return disp->BindImageMemory(device, image, mem, offset); 993 } 994 995 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 996 vkGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, 997 VkMemoryRequirements *pMemoryRequirements) { 998 const VkLayerDispatchTable *disp; 999 1000 disp = loader_get_dispatch(device); 1001 1002 disp->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements); 1003 } 1004 1005 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1006 vkGetImageMemoryRequirements(VkDevice device, VkImage image, 1007 VkMemoryRequirements *pMemoryRequirements) { 1008 const VkLayerDispatchTable *disp; 1009 1010 disp = loader_get_dispatch(device); 1011 1012 disp->GetImageMemoryRequirements(device, image, pMemoryRequirements); 1013 } 1014 1015 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageSparseMemoryRequirements( 1016 VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount, 1017 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) { 1018 const VkLayerDispatchTable *disp; 1019 1020 disp = loader_get_dispatch(device); 1021 1022 disp->GetImageSparseMemoryRequirements(device, image, 1023 pSparseMemoryRequirementCount, 1024 pSparseMemoryRequirements); 1025 } 1026 1027 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1028 vkGetPhysicalDeviceSparseImageFormatProperties( 1029 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, 1030 VkSampleCountFlagBits samples, VkImageUsageFlags usage, 1031 VkImageTiling tiling, uint32_t *pPropertyCount, 1032 VkSparseImageFormatProperties *pProperties) { 1033 const VkLayerInstanceDispatchTable *disp; 1034 VkPhysicalDevice unwrapped_phys_dev = 1035 loader_unwrap_physical_device(physicalDevice); 1036 disp = loader_get_instance_dispatch(physicalDevice); 1037 1038 disp->GetPhysicalDeviceSparseImageFormatProperties( 1039 unwrapped_phys_dev, format, type, samples, usage, tiling, 1040 pPropertyCount, pProperties); 1041 } 1042 1043 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1044 vkQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, 1045 const VkBindSparseInfo *pBindInfo, VkFence fence) { 1046 const VkLayerDispatchTable *disp; 1047 1048 disp = loader_get_dispatch(queue); 1049 1050 return disp->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence); 1051 } 1052 1053 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1054 vkCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, 1055 const VkAllocationCallbacks *pAllocator, VkFence *pFence) { 1056 const VkLayerDispatchTable *disp; 1057 1058 disp = loader_get_dispatch(device); 1059 1060 return disp->CreateFence(device, pCreateInfo, pAllocator, pFence); 1061 } 1062 1063 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1064 vkDestroyFence(VkDevice device, VkFence fence, 1065 const VkAllocationCallbacks *pAllocator) { 1066 const VkLayerDispatchTable *disp; 1067 1068 disp = loader_get_dispatch(device); 1069 1070 disp->DestroyFence(device, fence, pAllocator); 1071 } 1072 1073 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1074 vkResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) { 1075 const VkLayerDispatchTable *disp; 1076 1077 disp = loader_get_dispatch(device); 1078 1079 return disp->ResetFences(device, fenceCount, pFences); 1080 } 1081 1082 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1083 vkGetFenceStatus(VkDevice device, VkFence fence) { 1084 const VkLayerDispatchTable *disp; 1085 1086 disp = loader_get_dispatch(device); 1087 1088 return disp->GetFenceStatus(device, fence); 1089 } 1090 1091 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1092 vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, 1093 VkBool32 waitAll, uint64_t timeout) { 1094 const VkLayerDispatchTable *disp; 1095 1096 disp = loader_get_dispatch(device); 1097 1098 return disp->WaitForFences(device, fenceCount, pFences, waitAll, timeout); 1099 } 1100 1101 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1102 vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo, 1103 const VkAllocationCallbacks *pAllocator, 1104 VkSemaphore *pSemaphore) { 1105 const VkLayerDispatchTable *disp; 1106 1107 disp = loader_get_dispatch(device); 1108 1109 return disp->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore); 1110 } 1111 1112 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1113 vkDestroySemaphore(VkDevice device, VkSemaphore semaphore, 1114 const VkAllocationCallbacks *pAllocator) { 1115 const VkLayerDispatchTable *disp; 1116 1117 disp = loader_get_dispatch(device); 1118 1119 disp->DestroySemaphore(device, semaphore, pAllocator); 1120 } 1121 1122 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1123 vkCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, 1124 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) { 1125 const VkLayerDispatchTable *disp; 1126 1127 disp = loader_get_dispatch(device); 1128 1129 return disp->CreateEvent(device, pCreateInfo, pAllocator, pEvent); 1130 } 1131 1132 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1133 vkDestroyEvent(VkDevice device, VkEvent event, 1134 const VkAllocationCallbacks *pAllocator) { 1135 const VkLayerDispatchTable *disp; 1136 1137 disp = loader_get_dispatch(device); 1138 1139 disp->DestroyEvent(device, event, pAllocator); 1140 } 1141 1142 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1143 vkGetEventStatus(VkDevice device, VkEvent event) { 1144 const VkLayerDispatchTable *disp; 1145 1146 disp = loader_get_dispatch(device); 1147 1148 return disp->GetEventStatus(device, event); 1149 } 1150 1151 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1152 vkSetEvent(VkDevice device, VkEvent event) { 1153 const VkLayerDispatchTable *disp; 1154 1155 disp = loader_get_dispatch(device); 1156 1157 return disp->SetEvent(device, event); 1158 } 1159 1160 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1161 vkResetEvent(VkDevice device, VkEvent event) { 1162 const VkLayerDispatchTable *disp; 1163 1164 disp = loader_get_dispatch(device); 1165 1166 return disp->ResetEvent(device, event); 1167 } 1168 1169 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1170 vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo, 1171 const VkAllocationCallbacks *pAllocator, 1172 VkQueryPool *pQueryPool) { 1173 const VkLayerDispatchTable *disp; 1174 1175 disp = loader_get_dispatch(device); 1176 1177 return disp->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool); 1178 } 1179 1180 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1181 vkDestroyQueryPool(VkDevice device, VkQueryPool queryPool, 1182 const VkAllocationCallbacks *pAllocator) { 1183 const VkLayerDispatchTable *disp; 1184 1185 disp = loader_get_dispatch(device); 1186 1187 disp->DestroyQueryPool(device, queryPool, pAllocator); 1188 } 1189 1190 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1191 vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, 1192 uint32_t firstQuery, uint32_t queryCount, size_t dataSize, 1193 void *pData, VkDeviceSize stride, 1194 VkQueryResultFlags flags) { 1195 const VkLayerDispatchTable *disp; 1196 1197 disp = loader_get_dispatch(device); 1198 1199 return disp->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, 1200 dataSize, pData, stride, flags); 1201 } 1202 1203 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1204 vkCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, 1205 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) { 1206 const VkLayerDispatchTable *disp; 1207 1208 disp = loader_get_dispatch(device); 1209 1210 return disp->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer); 1211 } 1212 1213 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1214 vkDestroyBuffer(VkDevice device, VkBuffer buffer, 1215 const VkAllocationCallbacks *pAllocator) { 1216 const VkLayerDispatchTable *disp; 1217 1218 disp = loader_get_dispatch(device); 1219 1220 disp->DestroyBuffer(device, buffer, pAllocator); 1221 } 1222 1223 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1224 vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo, 1225 const VkAllocationCallbacks *pAllocator, 1226 VkBufferView *pView) { 1227 const VkLayerDispatchTable *disp; 1228 1229 disp = loader_get_dispatch(device); 1230 1231 return disp->CreateBufferView(device, pCreateInfo, pAllocator, pView); 1232 } 1233 1234 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1235 vkDestroyBufferView(VkDevice device, VkBufferView bufferView, 1236 const VkAllocationCallbacks *pAllocator) { 1237 const VkLayerDispatchTable *disp; 1238 1239 disp = loader_get_dispatch(device); 1240 1241 disp->DestroyBufferView(device, bufferView, pAllocator); 1242 } 1243 1244 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1245 vkCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo, 1246 const VkAllocationCallbacks *pAllocator, VkImage *pImage) { 1247 const VkLayerDispatchTable *disp; 1248 1249 disp = loader_get_dispatch(device); 1250 1251 return disp->CreateImage(device, pCreateInfo, pAllocator, pImage); 1252 } 1253 1254 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1255 vkDestroyImage(VkDevice device, VkImage image, 1256 const VkAllocationCallbacks *pAllocator) { 1257 const VkLayerDispatchTable *disp; 1258 1259 disp = loader_get_dispatch(device); 1260 1261 disp->DestroyImage(device, image, pAllocator); 1262 } 1263 1264 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1265 vkGetImageSubresourceLayout(VkDevice device, VkImage image, 1266 const VkImageSubresource *pSubresource, 1267 VkSubresourceLayout *pLayout) { 1268 const VkLayerDispatchTable *disp; 1269 1270 disp = loader_get_dispatch(device); 1271 1272 disp->GetImageSubresourceLayout(device, image, pSubresource, pLayout); 1273 } 1274 1275 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1276 vkCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo, 1277 const VkAllocationCallbacks *pAllocator, VkImageView *pView) { 1278 const VkLayerDispatchTable *disp; 1279 1280 disp = loader_get_dispatch(device); 1281 1282 return disp->CreateImageView(device, pCreateInfo, pAllocator, pView); 1283 } 1284 1285 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1286 vkDestroyImageView(VkDevice device, VkImageView imageView, 1287 const VkAllocationCallbacks *pAllocator) { 1288 const VkLayerDispatchTable *disp; 1289 1290 disp = loader_get_dispatch(device); 1291 1292 disp->DestroyImageView(device, imageView, pAllocator); 1293 } 1294 1295 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1296 vkCreateShaderModule(VkDevice device, 1297 const VkShaderModuleCreateInfo *pCreateInfo, 1298 const VkAllocationCallbacks *pAllocator, 1299 VkShaderModule *pShader) { 1300 const VkLayerDispatchTable *disp; 1301 1302 disp = loader_get_dispatch(device); 1303 1304 return disp->CreateShaderModule(device, pCreateInfo, pAllocator, pShader); 1305 } 1306 1307 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1308 vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule, 1309 const VkAllocationCallbacks *pAllocator) { 1310 const VkLayerDispatchTable *disp; 1311 1312 disp = loader_get_dispatch(device); 1313 1314 disp->DestroyShaderModule(device, shaderModule, pAllocator); 1315 } 1316 1317 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1318 vkCreatePipelineCache(VkDevice device, 1319 const VkPipelineCacheCreateInfo *pCreateInfo, 1320 const VkAllocationCallbacks *pAllocator, 1321 VkPipelineCache *pPipelineCache) { 1322 const VkLayerDispatchTable *disp; 1323 1324 disp = loader_get_dispatch(device); 1325 1326 return disp->CreatePipelineCache(device, pCreateInfo, pAllocator, 1327 pPipelineCache); 1328 } 1329 1330 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1331 vkDestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, 1332 const VkAllocationCallbacks *pAllocator) { 1333 const VkLayerDispatchTable *disp; 1334 1335 disp = loader_get_dispatch(device); 1336 1337 disp->DestroyPipelineCache(device, pipelineCache, pAllocator); 1338 } 1339 1340 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1341 vkGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, 1342 size_t *pDataSize, void *pData) { 1343 const VkLayerDispatchTable *disp; 1344 1345 disp = loader_get_dispatch(device); 1346 1347 return disp->GetPipelineCacheData(device, pipelineCache, pDataSize, pData); 1348 } 1349 1350 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1351 vkMergePipelineCaches(VkDevice device, VkPipelineCache dstCache, 1352 uint32_t srcCacheCount, 1353 const VkPipelineCache *pSrcCaches) { 1354 const VkLayerDispatchTable *disp; 1355 1356 disp = loader_get_dispatch(device); 1357 1358 return disp->MergePipelineCaches(device, dstCache, srcCacheCount, 1359 pSrcCaches); 1360 } 1361 1362 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1363 vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, 1364 uint32_t createInfoCount, 1365 const VkGraphicsPipelineCreateInfo *pCreateInfos, 1366 const VkAllocationCallbacks *pAllocator, 1367 VkPipeline *pPipelines) { 1368 const VkLayerDispatchTable *disp; 1369 1370 disp = loader_get_dispatch(device); 1371 1372 return disp->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, 1373 pCreateInfos, pAllocator, pPipelines); 1374 } 1375 1376 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1377 vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, 1378 uint32_t createInfoCount, 1379 const VkComputePipelineCreateInfo *pCreateInfos, 1380 const VkAllocationCallbacks *pAllocator, 1381 VkPipeline *pPipelines) { 1382 const VkLayerDispatchTable *disp; 1383 1384 disp = loader_get_dispatch(device); 1385 1386 return disp->CreateComputePipelines(device, pipelineCache, createInfoCount, 1387 pCreateInfos, pAllocator, pPipelines); 1388 } 1389 1390 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1391 vkDestroyPipeline(VkDevice device, VkPipeline pipeline, 1392 const VkAllocationCallbacks *pAllocator) { 1393 const VkLayerDispatchTable *disp; 1394 1395 disp = loader_get_dispatch(device); 1396 1397 disp->DestroyPipeline(device, pipeline, pAllocator); 1398 } 1399 1400 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1401 vkCreatePipelineLayout(VkDevice device, 1402 const VkPipelineLayoutCreateInfo *pCreateInfo, 1403 const VkAllocationCallbacks *pAllocator, 1404 VkPipelineLayout *pPipelineLayout) { 1405 const VkLayerDispatchTable *disp; 1406 1407 disp = loader_get_dispatch(device); 1408 1409 return disp->CreatePipelineLayout(device, pCreateInfo, pAllocator, 1410 pPipelineLayout); 1411 } 1412 1413 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1414 vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, 1415 const VkAllocationCallbacks *pAllocator) { 1416 const VkLayerDispatchTable *disp; 1417 1418 disp = loader_get_dispatch(device); 1419 1420 disp->DestroyPipelineLayout(device, pipelineLayout, pAllocator); 1421 } 1422 1423 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1424 vkCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo, 1425 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) { 1426 const VkLayerDispatchTable *disp; 1427 1428 disp = loader_get_dispatch(device); 1429 1430 return disp->CreateSampler(device, pCreateInfo, pAllocator, pSampler); 1431 } 1432 1433 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1434 vkDestroySampler(VkDevice device, VkSampler sampler, 1435 const VkAllocationCallbacks *pAllocator) { 1436 const VkLayerDispatchTable *disp; 1437 1438 disp = loader_get_dispatch(device); 1439 1440 disp->DestroySampler(device, sampler, pAllocator); 1441 } 1442 1443 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1444 vkCreateDescriptorSetLayout(VkDevice device, 1445 const VkDescriptorSetLayoutCreateInfo *pCreateInfo, 1446 const VkAllocationCallbacks *pAllocator, 1447 VkDescriptorSetLayout *pSetLayout) { 1448 const VkLayerDispatchTable *disp; 1449 1450 disp = loader_get_dispatch(device); 1451 1452 return disp->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, 1453 pSetLayout); 1454 } 1455 1456 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1457 vkDestroyDescriptorSetLayout(VkDevice device, 1458 VkDescriptorSetLayout descriptorSetLayout, 1459 const VkAllocationCallbacks *pAllocator) { 1460 const VkLayerDispatchTable *disp; 1461 1462 disp = loader_get_dispatch(device); 1463 1464 disp->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator); 1465 } 1466 1467 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1468 vkCreateDescriptorPool(VkDevice device, 1469 const VkDescriptorPoolCreateInfo *pCreateInfo, 1470 const VkAllocationCallbacks *pAllocator, 1471 VkDescriptorPool *pDescriptorPool) { 1472 const VkLayerDispatchTable *disp; 1473 1474 disp = loader_get_dispatch(device); 1475 1476 return disp->CreateDescriptorPool(device, pCreateInfo, pAllocator, 1477 pDescriptorPool); 1478 } 1479 1480 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1481 vkDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, 1482 const VkAllocationCallbacks *pAllocator) { 1483 const VkLayerDispatchTable *disp; 1484 1485 disp = loader_get_dispatch(device); 1486 1487 disp->DestroyDescriptorPool(device, descriptorPool, pAllocator); 1488 } 1489 1490 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1491 vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, 1492 VkDescriptorPoolResetFlags flags) { 1493 const VkLayerDispatchTable *disp; 1494 1495 disp = loader_get_dispatch(device); 1496 1497 return disp->ResetDescriptorPool(device, descriptorPool, flags); 1498 } 1499 1500 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1501 vkAllocateDescriptorSets(VkDevice device, 1502 const VkDescriptorSetAllocateInfo *pAllocateInfo, 1503 VkDescriptorSet *pDescriptorSets) { 1504 const VkLayerDispatchTable *disp; 1505 1506 disp = loader_get_dispatch(device); 1507 1508 return disp->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets); 1509 } 1510 1511 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1512 vkFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, 1513 uint32_t descriptorSetCount, 1514 const VkDescriptorSet *pDescriptorSets) { 1515 const VkLayerDispatchTable *disp; 1516 1517 disp = loader_get_dispatch(device); 1518 1519 return disp->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, 1520 pDescriptorSets); 1521 } 1522 1523 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1524 vkUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, 1525 const VkWriteDescriptorSet *pDescriptorWrites, 1526 uint32_t descriptorCopyCount, 1527 const VkCopyDescriptorSet *pDescriptorCopies) { 1528 const VkLayerDispatchTable *disp; 1529 1530 disp = loader_get_dispatch(device); 1531 1532 disp->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, 1533 descriptorCopyCount, pDescriptorCopies); 1534 } 1535 1536 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1537 vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo, 1538 const VkAllocationCallbacks *pAllocator, 1539 VkFramebuffer *pFramebuffer) { 1540 const VkLayerDispatchTable *disp; 1541 1542 disp = loader_get_dispatch(device); 1543 1544 return disp->CreateFramebuffer(device, pCreateInfo, pAllocator, 1545 pFramebuffer); 1546 } 1547 1548 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1549 vkDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, 1550 const VkAllocationCallbacks *pAllocator) { 1551 const VkLayerDispatchTable *disp; 1552 1553 disp = loader_get_dispatch(device); 1554 1555 disp->DestroyFramebuffer(device, framebuffer, pAllocator); 1556 } 1557 1558 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1559 vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo, 1560 const VkAllocationCallbacks *pAllocator, 1561 VkRenderPass *pRenderPass) { 1562 const VkLayerDispatchTable *disp; 1563 1564 disp = loader_get_dispatch(device); 1565 1566 return disp->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass); 1567 } 1568 1569 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1570 vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass, 1571 const VkAllocationCallbacks *pAllocator) { 1572 const VkLayerDispatchTable *disp; 1573 1574 disp = loader_get_dispatch(device); 1575 1576 disp->DestroyRenderPass(device, renderPass, pAllocator); 1577 } 1578 1579 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1580 vkGetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, 1581 VkExtent2D *pGranularity) { 1582 const VkLayerDispatchTable *disp; 1583 1584 disp = loader_get_dispatch(device); 1585 1586 disp->GetRenderAreaGranularity(device, renderPass, pGranularity); 1587 } 1588 1589 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1590 vkCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo, 1591 const VkAllocationCallbacks *pAllocator, 1592 VkCommandPool *pCommandPool) { 1593 const VkLayerDispatchTable *disp; 1594 1595 disp = loader_get_dispatch(device); 1596 1597 return disp->CreateCommandPool(device, pCreateInfo, pAllocator, 1598 pCommandPool); 1599 } 1600 1601 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1602 vkDestroyCommandPool(VkDevice device, VkCommandPool commandPool, 1603 const VkAllocationCallbacks *pAllocator) { 1604 const VkLayerDispatchTable *disp; 1605 1606 disp = loader_get_dispatch(device); 1607 1608 disp->DestroyCommandPool(device, commandPool, pAllocator); 1609 } 1610 1611 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1612 vkResetCommandPool(VkDevice device, VkCommandPool commandPool, 1613 VkCommandPoolResetFlags flags) { 1614 const VkLayerDispatchTable *disp; 1615 1616 disp = loader_get_dispatch(device); 1617 1618 return disp->ResetCommandPool(device, commandPool, flags); 1619 } 1620 1621 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1622 vkAllocateCommandBuffers(VkDevice device, 1623 const VkCommandBufferAllocateInfo *pAllocateInfo, 1624 VkCommandBuffer *pCommandBuffers) { 1625 const VkLayerDispatchTable *disp; 1626 VkResult res; 1627 1628 disp = loader_get_dispatch(device); 1629 1630 res = disp->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers); 1631 if (res == VK_SUCCESS) { 1632 for (uint32_t i = 0; i < pAllocateInfo->commandBufferCount; i++) { 1633 if (pCommandBuffers[i]) { 1634 loader_init_dispatch(pCommandBuffers[i], disp); 1635 } 1636 } 1637 } 1638 1639 return res; 1640 } 1641 1642 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1643 vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool, 1644 uint32_t commandBufferCount, 1645 const VkCommandBuffer *pCommandBuffers) { 1646 const VkLayerDispatchTable *disp; 1647 1648 disp = loader_get_dispatch(device); 1649 1650 disp->FreeCommandBuffers(device, commandPool, commandBufferCount, 1651 pCommandBuffers); 1652 } 1653 1654 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1655 vkBeginCommandBuffer(VkCommandBuffer commandBuffer, 1656 const VkCommandBufferBeginInfo *pBeginInfo) { 1657 const VkLayerDispatchTable *disp; 1658 1659 disp = loader_get_dispatch(commandBuffer); 1660 1661 return disp->BeginCommandBuffer(commandBuffer, pBeginInfo); 1662 } 1663 1664 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1665 vkEndCommandBuffer(VkCommandBuffer commandBuffer) { 1666 const VkLayerDispatchTable *disp; 1667 1668 disp = loader_get_dispatch(commandBuffer); 1669 1670 return disp->EndCommandBuffer(commandBuffer); 1671 } 1672 1673 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL 1674 vkResetCommandBuffer(VkCommandBuffer commandBuffer, 1675 VkCommandBufferResetFlags flags) { 1676 const VkLayerDispatchTable *disp; 1677 1678 disp = loader_get_dispatch(commandBuffer); 1679 1680 return disp->ResetCommandBuffer(commandBuffer, flags); 1681 } 1682 1683 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1684 vkCmdBindPipeline(VkCommandBuffer commandBuffer, 1685 VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) { 1686 const VkLayerDispatchTable *disp; 1687 1688 disp = loader_get_dispatch(commandBuffer); 1689 1690 disp->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline); 1691 } 1692 1693 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1694 vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, 1695 uint32_t viewportCount, const VkViewport *pViewports) { 1696 const VkLayerDispatchTable *disp; 1697 1698 disp = loader_get_dispatch(commandBuffer); 1699 1700 disp->CmdSetViewport(commandBuffer, firstViewport, viewportCount, 1701 pViewports); 1702 } 1703 1704 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1705 vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, 1706 uint32_t scissorCount, const VkRect2D *pScissors) { 1707 const VkLayerDispatchTable *disp; 1708 1709 disp = loader_get_dispatch(commandBuffer); 1710 1711 disp->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors); 1712 } 1713 1714 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1715 vkCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) { 1716 const VkLayerDispatchTable *disp; 1717 1718 disp = loader_get_dispatch(commandBuffer); 1719 1720 disp->CmdSetLineWidth(commandBuffer, lineWidth); 1721 } 1722 1723 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1724 vkCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, 1725 float depthBiasClamp, float depthBiasSlopeFactor) { 1726 const VkLayerDispatchTable *disp; 1727 1728 disp = loader_get_dispatch(commandBuffer); 1729 1730 disp->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, 1731 depthBiasClamp, depthBiasSlopeFactor); 1732 } 1733 1734 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1735 vkCmdSetBlendConstants(VkCommandBuffer commandBuffer, 1736 const float blendConstants[4]) { 1737 const VkLayerDispatchTable *disp; 1738 1739 disp = loader_get_dispatch(commandBuffer); 1740 1741 disp->CmdSetBlendConstants(commandBuffer, blendConstants); 1742 } 1743 1744 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1745 vkCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, 1746 float maxDepthBounds) { 1747 const VkLayerDispatchTable *disp; 1748 1749 disp = loader_get_dispatch(commandBuffer); 1750 1751 disp->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds); 1752 } 1753 1754 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1755 vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, 1756 VkStencilFaceFlags faceMask, uint32_t compareMask) { 1757 const VkLayerDispatchTable *disp; 1758 1759 disp = loader_get_dispatch(commandBuffer); 1760 1761 disp->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask); 1762 } 1763 1764 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1765 vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, 1766 VkStencilFaceFlags faceMask, uint32_t writeMask) { 1767 const VkLayerDispatchTable *disp; 1768 1769 disp = loader_get_dispatch(commandBuffer); 1770 1771 disp->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask); 1772 } 1773 1774 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1775 vkCmdSetStencilReference(VkCommandBuffer commandBuffer, 1776 VkStencilFaceFlags faceMask, uint32_t reference) { 1777 const VkLayerDispatchTable *disp; 1778 1779 disp = loader_get_dispatch(commandBuffer); 1780 1781 disp->CmdSetStencilReference(commandBuffer, faceMask, reference); 1782 } 1783 1784 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorSets( 1785 VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, 1786 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount, 1787 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount, 1788 const uint32_t *pDynamicOffsets) { 1789 const VkLayerDispatchTable *disp; 1790 1791 disp = loader_get_dispatch(commandBuffer); 1792 1793 disp->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, 1794 firstSet, descriptorSetCount, pDescriptorSets, 1795 dynamicOffsetCount, pDynamicOffsets); 1796 } 1797 1798 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1799 vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, 1800 VkDeviceSize offset, VkIndexType indexType) { 1801 const VkLayerDispatchTable *disp; 1802 1803 disp = loader_get_dispatch(commandBuffer); 1804 1805 disp->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType); 1806 } 1807 1808 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1809 vkCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, 1810 uint32_t bindingCount, const VkBuffer *pBuffers, 1811 const VkDeviceSize *pOffsets) { 1812 const VkLayerDispatchTable *disp; 1813 1814 disp = loader_get_dispatch(commandBuffer); 1815 1816 disp->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, 1817 pBuffers, pOffsets); 1818 } 1819 1820 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1821 vkCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, 1822 uint32_t instanceCount, uint32_t firstVertex, 1823 uint32_t firstInstance) { 1824 const VkLayerDispatchTable *disp; 1825 1826 disp = loader_get_dispatch(commandBuffer); 1827 1828 disp->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, 1829 firstInstance); 1830 } 1831 1832 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1833 vkCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, 1834 uint32_t instanceCount, uint32_t firstIndex, 1835 int32_t vertexOffset, uint32_t firstInstance) { 1836 const VkLayerDispatchTable *disp; 1837 1838 disp = loader_get_dispatch(commandBuffer); 1839 1840 disp->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, 1841 vertexOffset, firstInstance); 1842 } 1843 1844 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1845 vkCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, 1846 VkDeviceSize offset, uint32_t drawCount, uint32_t stride) { 1847 const VkLayerDispatchTable *disp; 1848 1849 disp = loader_get_dispatch(commandBuffer); 1850 1851 disp->CmdDrawIndirect(commandBuffer, buffer, offset, drawCount, stride); 1852 } 1853 1854 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1855 vkCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, 1856 VkDeviceSize offset, uint32_t drawCount, 1857 uint32_t stride) { 1858 const VkLayerDispatchTable *disp; 1859 1860 disp = loader_get_dispatch(commandBuffer); 1861 1862 disp->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, drawCount, 1863 stride); 1864 } 1865 1866 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1867 vkCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, 1868 uint32_t z) { 1869 const VkLayerDispatchTable *disp; 1870 1871 disp = loader_get_dispatch(commandBuffer); 1872 1873 disp->CmdDispatch(commandBuffer, x, y, z); 1874 } 1875 1876 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1877 vkCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, 1878 VkDeviceSize offset) { 1879 const VkLayerDispatchTable *disp; 1880 1881 disp = loader_get_dispatch(commandBuffer); 1882 1883 disp->CmdDispatchIndirect(commandBuffer, buffer, offset); 1884 } 1885 1886 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1887 vkCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, 1888 VkBuffer dstBuffer, uint32_t regionCount, 1889 const VkBufferCopy *pRegions) { 1890 const VkLayerDispatchTable *disp; 1891 1892 disp = loader_get_dispatch(commandBuffer); 1893 1894 disp->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, 1895 pRegions); 1896 } 1897 1898 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1899 vkCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, 1900 VkImageLayout srcImageLayout, VkImage dstImage, 1901 VkImageLayout dstImageLayout, uint32_t regionCount, 1902 const VkImageCopy *pRegions) { 1903 const VkLayerDispatchTable *disp; 1904 1905 disp = loader_get_dispatch(commandBuffer); 1906 1907 disp->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, 1908 dstImageLayout, regionCount, pRegions); 1909 } 1910 1911 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1912 vkCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, 1913 VkImageLayout srcImageLayout, VkImage dstImage, 1914 VkImageLayout dstImageLayout, uint32_t regionCount, 1915 const VkImageBlit *pRegions, VkFilter filter) { 1916 const VkLayerDispatchTable *disp; 1917 1918 disp = loader_get_dispatch(commandBuffer); 1919 1920 disp->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, 1921 dstImageLayout, regionCount, pRegions, filter); 1922 } 1923 1924 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1925 vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, 1926 VkImage dstImage, VkImageLayout dstImageLayout, 1927 uint32_t regionCount, 1928 const VkBufferImageCopy *pRegions) { 1929 const VkLayerDispatchTable *disp; 1930 1931 disp = loader_get_dispatch(commandBuffer); 1932 1933 disp->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, 1934 dstImageLayout, regionCount, pRegions); 1935 } 1936 1937 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1938 vkCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, 1939 VkImageLayout srcImageLayout, VkBuffer dstBuffer, 1940 uint32_t regionCount, 1941 const VkBufferImageCopy *pRegions) { 1942 const VkLayerDispatchTable *disp; 1943 1944 disp = loader_get_dispatch(commandBuffer); 1945 1946 disp->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, 1947 dstBuffer, regionCount, pRegions); 1948 } 1949 1950 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1951 vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, 1952 VkDeviceSize dstOffset, VkDeviceSize dataSize, 1953 const uint32_t *pData) { 1954 const VkLayerDispatchTable *disp; 1955 1956 disp = loader_get_dispatch(commandBuffer); 1957 1958 disp->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData); 1959 } 1960 1961 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1962 vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, 1963 VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) { 1964 const VkLayerDispatchTable *disp; 1965 1966 disp = loader_get_dispatch(commandBuffer); 1967 1968 disp->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data); 1969 } 1970 1971 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1972 vkCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, 1973 VkImageLayout imageLayout, const VkClearColorValue *pColor, 1974 uint32_t rangeCount, 1975 const VkImageSubresourceRange *pRanges) { 1976 const VkLayerDispatchTable *disp; 1977 1978 disp = loader_get_dispatch(commandBuffer); 1979 1980 disp->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, 1981 rangeCount, pRanges); 1982 } 1983 1984 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1985 vkCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, 1986 VkImageLayout imageLayout, 1987 const VkClearDepthStencilValue *pDepthStencil, 1988 uint32_t rangeCount, 1989 const VkImageSubresourceRange *pRanges) { 1990 const VkLayerDispatchTable *disp; 1991 1992 disp = loader_get_dispatch(commandBuffer); 1993 1994 disp->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, 1995 pDepthStencil, rangeCount, pRanges); 1996 } 1997 1998 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 1999 vkCmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount, 2000 const VkClearAttachment *pAttachments, uint32_t rectCount, 2001 const VkClearRect *pRects) { 2002 const VkLayerDispatchTable *disp; 2003 2004 disp = loader_get_dispatch(commandBuffer); 2005 2006 disp->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, 2007 rectCount, pRects); 2008 } 2009 2010 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 2011 vkCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, 2012 VkImageLayout srcImageLayout, VkImage dstImage, 2013 VkImageLayout dstImageLayout, uint32_t regionCount, 2014 const VkImageResolve *pRegions) { 2015 const VkLayerDispatchTable *disp; 2016 2017 disp = loader_get_dispatch(commandBuffer); 2018 2019 disp->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, 2020 dstImageLayout, regionCount, pRegions); 2021 } 2022 2023 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 2024 vkCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, 2025 VkPipelineStageFlags stageMask) { 2026 const VkLayerDispatchTable *disp; 2027 2028 disp = loader_get_dispatch(commandBuffer); 2029 2030 disp->CmdSetEvent(commandBuffer, event, stageMask); 2031 } 2032 2033 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 2034 vkCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, 2035 VkPipelineStageFlags stageMask) { 2036 const VkLayerDispatchTable *disp; 2037 2038 disp = loader_get_dispatch(commandBuffer); 2039 2040 disp->CmdResetEvent(commandBuffer, event, stageMask); 2041 } 2042 2043 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 2044 vkCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, 2045 const VkEvent *pEvents, VkPipelineStageFlags sourceStageMask, 2046 VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, 2047 const VkMemoryBarrier *pMemoryBarriers, 2048 uint32_t bufferMemoryBarrierCount, 2049 const VkBufferMemoryBarrier *pBufferMemoryBarriers, 2050 uint32_t imageMemoryBarrierCount, 2051 const VkImageMemoryBarrier *pImageMemoryBarriers) { 2052 const VkLayerDispatchTable *disp; 2053 2054 disp = loader_get_dispatch(commandBuffer); 2055 2056 disp->CmdWaitEvents(commandBuffer, eventCount, pEvents, sourceStageMask, 2057 dstStageMask, memoryBarrierCount, pMemoryBarriers, 2058 bufferMemoryBarrierCount, pBufferMemoryBarriers, 2059 imageMemoryBarrierCount, pImageMemoryBarriers); 2060 } 2061 2062 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier( 2063 VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, 2064 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, 2065 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, 2066 uint32_t bufferMemoryBarrierCount, 2067 const VkBufferMemoryBarrier *pBufferMemoryBarriers, 2068 uint32_t imageMemoryBarrierCount, 2069 const VkImageMemoryBarrier *pImageMemoryBarriers) { 2070 const VkLayerDispatchTable *disp; 2071 2072 disp = loader_get_dispatch(commandBuffer); 2073 2074 disp->CmdPipelineBarrier( 2075 commandBuffer, srcStageMask, dstStageMask, dependencyFlags, 2076 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, 2077 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers); 2078 } 2079 2080 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 2081 vkCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, 2082 uint32_t slot, VkFlags flags) { 2083 const VkLayerDispatchTable *disp; 2084 2085 disp = loader_get_dispatch(commandBuffer); 2086 2087 disp->CmdBeginQuery(commandBuffer, queryPool, slot, flags); 2088 } 2089 2090 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 2091 vkCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, 2092 uint32_t slot) { 2093 const VkLayerDispatchTable *disp; 2094 2095 disp = loader_get_dispatch(commandBuffer); 2096 2097 disp->CmdEndQuery(commandBuffer, queryPool, slot); 2098 } 2099 2100 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 2101 vkCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, 2102 uint32_t firstQuery, uint32_t queryCount) { 2103 const VkLayerDispatchTable *disp; 2104 2105 disp = loader_get_dispatch(commandBuffer); 2106 2107 disp->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount); 2108 } 2109 2110 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 2111 vkCmdWriteTimestamp(VkCommandBuffer commandBuffer, 2112 VkPipelineStageFlagBits pipelineStage, 2113 VkQueryPool queryPool, uint32_t slot) { 2114 const VkLayerDispatchTable *disp; 2115 2116 disp = loader_get_dispatch(commandBuffer); 2117 2118 disp->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, slot); 2119 } 2120 2121 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 2122 vkCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, 2123 uint32_t firstQuery, uint32_t queryCount, 2124 VkBuffer dstBuffer, VkDeviceSize dstOffset, 2125 VkDeviceSize stride, VkFlags flags) { 2126 const VkLayerDispatchTable *disp; 2127 2128 disp = loader_get_dispatch(commandBuffer); 2129 2130 disp->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, 2131 queryCount, dstBuffer, dstOffset, stride, 2132 flags); 2133 } 2134 2135 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 2136 vkCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, 2137 VkShaderStageFlags stageFlags, uint32_t offset, 2138 uint32_t size, const void *pValues) { 2139 const VkLayerDispatchTable *disp; 2140 2141 disp = loader_get_dispatch(commandBuffer); 2142 2143 disp->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, 2144 pValues); 2145 } 2146 2147 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 2148 vkCmdBeginRenderPass(VkCommandBuffer commandBuffer, 2149 const VkRenderPassBeginInfo *pRenderPassBegin, 2150 VkSubpassContents contents) { 2151 const VkLayerDispatchTable *disp; 2152 2153 disp = loader_get_dispatch(commandBuffer); 2154 2155 disp->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents); 2156 } 2157 2158 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 2159 vkCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) { 2160 const VkLayerDispatchTable *disp; 2161 2162 disp = loader_get_dispatch(commandBuffer); 2163 2164 disp->CmdNextSubpass(commandBuffer, contents); 2165 } 2166 2167 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 2168 vkCmdEndRenderPass(VkCommandBuffer commandBuffer) { 2169 const VkLayerDispatchTable *disp; 2170 2171 disp = loader_get_dispatch(commandBuffer); 2172 2173 disp->CmdEndRenderPass(commandBuffer); 2174 } 2175 2176 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL 2177 vkCmdExecuteCommands(VkCommandBuffer commandBuffer, 2178 uint32_t commandBuffersCount, 2179 const VkCommandBuffer *pCommandBuffers) { 2180 const VkLayerDispatchTable *disp; 2181 2182 disp = loader_get_dispatch(commandBuffer); 2183 2184 disp->CmdExecuteCommands(commandBuffer, commandBuffersCount, 2185 pCommandBuffers); 2186 } 2187