Home | History | Annotate | Download | only in loader
      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) 2016 Google Inc.
      7  *
      8  * Licensed under the Apache License, Version 2.0 (the "License");
      9  * you may not use this file except in compliance with the License.
     10  * You may obtain a copy of the License at
     11  *
     12  *     http://www.apache.org/licenses/LICENSE-2.0
     13  *
     14  * Unless required by applicable law or agreed to in writing, software
     15  * distributed under the License is distributed on an "AS IS" BASIS,
     16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     17  * See the License for the specific language governing permissions and
     18  * limitations under the License.
     19  *
     20  * Author: Courtney Goeltzenleuchter <courtney (at) lunarg.com>
     21  * Author: Jon Ashburn <jon (at) lunarg.com>
     22  * Author: Ian Elliott <ian (at) LunarG.com>
     23  * Author: Tony Barbour <tony (at) LunarG.com>
     24  */
     25 
     26 #include <vulkan/vulkan.h>
     27 #include <vulkan/vk_layer.h>
     28 #include <string.h>
     29 #include "loader.h"
     30 #include "vk_loader_platform.h"
     31 
     32 static VkResult vkDevExtError(VkDevice dev) {
     33     struct loader_device *found_dev;
     34     struct loader_icd *icd = loader_get_icd_and_device(dev, &found_dev, NULL);
     35 
     36     if (icd)
     37         loader_log(icd->this_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
     38                    "Bad destination in loader trampoline dispatch,"
     39                    "Are layers and extensions that you are calling enabled?");
     40     return VK_ERROR_EXTENSION_NOT_PRESENT;
     41 }
     42 
     43 static inline void
     44 loader_init_device_dispatch_table(struct loader_dev_dispatch_table *dev_table,
     45                                   PFN_vkGetDeviceProcAddr gpa, VkDevice dev) {
     46     VkLayerDispatchTable *table = &dev_table->core_dispatch;
     47     for (uint32_t i = 0; i < MAX_NUM_DEV_EXTS; i++)
     48         dev_table->ext_dispatch.dev_ext[i] = (PFN_vkDevExt)vkDevExtError;
     49 
     50     table->GetDeviceProcAddr =
     51         (PFN_vkGetDeviceProcAddr)gpa(dev, "vkGetDeviceProcAddr");
     52     table->DestroyDevice = (PFN_vkDestroyDevice)gpa(dev, "vkDestroyDevice");
     53     table->GetDeviceQueue = (PFN_vkGetDeviceQueue)gpa(dev, "vkGetDeviceQueue");
     54     table->QueueSubmit = (PFN_vkQueueSubmit)gpa(dev, "vkQueueSubmit");
     55     table->QueueWaitIdle = (PFN_vkQueueWaitIdle)gpa(dev, "vkQueueWaitIdle");
     56     table->DeviceWaitIdle = (PFN_vkDeviceWaitIdle)gpa(dev, "vkDeviceWaitIdle");
     57     table->AllocateMemory = (PFN_vkAllocateMemory)gpa(dev, "vkAllocateMemory");
     58     table->FreeMemory = (PFN_vkFreeMemory)gpa(dev, "vkFreeMemory");
     59     table->MapMemory = (PFN_vkMapMemory)gpa(dev, "vkMapMemory");
     60     table->UnmapMemory = (PFN_vkUnmapMemory)gpa(dev, "vkUnmapMemory");
     61     table->FlushMappedMemoryRanges =
     62         (PFN_vkFlushMappedMemoryRanges)gpa(dev, "vkFlushMappedMemoryRanges");
     63     table->InvalidateMappedMemoryRanges =
     64         (PFN_vkInvalidateMappedMemoryRanges)gpa(
     65             dev, "vkInvalidateMappedMemoryRanges");
     66     table->GetDeviceMemoryCommitment = (PFN_vkGetDeviceMemoryCommitment)gpa(
     67         dev, "vkGetDeviceMemoryCommitment");
     68     table->GetImageSparseMemoryRequirements =
     69         (PFN_vkGetImageSparseMemoryRequirements)gpa(
     70             dev, "vkGetImageSparseMemoryRequirements");
     71     table->GetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements)gpa(
     72         dev, "vkGetBufferMemoryRequirements");
     73     table->GetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements)gpa(
     74         dev, "vkGetImageMemoryRequirements");
     75     table->BindBufferMemory =
     76         (PFN_vkBindBufferMemory)gpa(dev, "vkBindBufferMemory");
     77     table->BindImageMemory =
     78         (PFN_vkBindImageMemory)gpa(dev, "vkBindImageMemory");
     79     table->QueueBindSparse =
     80         (PFN_vkQueueBindSparse)gpa(dev, "vkQueueBindSparse");
     81     table->CreateFence = (PFN_vkCreateFence)gpa(dev, "vkCreateFence");
     82     table->DestroyFence = (PFN_vkDestroyFence)gpa(dev, "vkDestroyFence");
     83     table->ResetFences = (PFN_vkResetFences)gpa(dev, "vkResetFences");
     84     table->GetFenceStatus = (PFN_vkGetFenceStatus)gpa(dev, "vkGetFenceStatus");
     85     table->WaitForFences = (PFN_vkWaitForFences)gpa(dev, "vkWaitForFences");
     86     table->CreateSemaphore =
     87         (PFN_vkCreateSemaphore)gpa(dev, "vkCreateSemaphore");
     88     table->DestroySemaphore =
     89         (PFN_vkDestroySemaphore)gpa(dev, "vkDestroySemaphore");
     90     table->CreateEvent = (PFN_vkCreateEvent)gpa(dev, "vkCreateEvent");
     91     table->DestroyEvent = (PFN_vkDestroyEvent)gpa(dev, "vkDestroyEvent");
     92     table->GetEventStatus = (PFN_vkGetEventStatus)gpa(dev, "vkGetEventStatus");
     93     table->SetEvent = (PFN_vkSetEvent)gpa(dev, "vkSetEvent");
     94     table->ResetEvent = (PFN_vkResetEvent)gpa(dev, "vkResetEvent");
     95     table->CreateQueryPool =
     96         (PFN_vkCreateQueryPool)gpa(dev, "vkCreateQueryPool");
     97     table->DestroyQueryPool =
     98         (PFN_vkDestroyQueryPool)gpa(dev, "vkDestroyQueryPool");
     99     table->GetQueryPoolResults =
    100         (PFN_vkGetQueryPoolResults)gpa(dev, "vkGetQueryPoolResults");
    101     table->CreateBuffer = (PFN_vkCreateBuffer)gpa(dev, "vkCreateBuffer");
    102     table->DestroyBuffer = (PFN_vkDestroyBuffer)gpa(dev, "vkDestroyBuffer");
    103     table->CreateBufferView =
    104         (PFN_vkCreateBufferView)gpa(dev, "vkCreateBufferView");
    105     table->DestroyBufferView =
    106         (PFN_vkDestroyBufferView)gpa(dev, "vkDestroyBufferView");
    107     table->CreateImage = (PFN_vkCreateImage)gpa(dev, "vkCreateImage");
    108     table->DestroyImage = (PFN_vkDestroyImage)gpa(dev, "vkDestroyImage");
    109     table->GetImageSubresourceLayout = (PFN_vkGetImageSubresourceLayout)gpa(
    110         dev, "vkGetImageSubresourceLayout");
    111     table->CreateImageView =
    112         (PFN_vkCreateImageView)gpa(dev, "vkCreateImageView");
    113     table->DestroyImageView =
    114         (PFN_vkDestroyImageView)gpa(dev, "vkDestroyImageView");
    115     table->CreateShaderModule =
    116         (PFN_vkCreateShaderModule)gpa(dev, "vkCreateShaderModule");
    117     table->DestroyShaderModule =
    118         (PFN_vkDestroyShaderModule)gpa(dev, "vkDestroyShaderModule");
    119     table->CreatePipelineCache =
    120         (PFN_vkCreatePipelineCache)gpa(dev, "vkCreatePipelineCache");
    121     table->DestroyPipelineCache =
    122         (PFN_vkDestroyPipelineCache)gpa(dev, "vkDestroyPipelineCache");
    123     table->GetPipelineCacheData =
    124         (PFN_vkGetPipelineCacheData)gpa(dev, "vkGetPipelineCacheData");
    125     table->MergePipelineCaches =
    126         (PFN_vkMergePipelineCaches)gpa(dev, "vkMergePipelineCaches");
    127     table->CreateGraphicsPipelines =
    128         (PFN_vkCreateGraphicsPipelines)gpa(dev, "vkCreateGraphicsPipelines");
    129     table->CreateComputePipelines =
    130         (PFN_vkCreateComputePipelines)gpa(dev, "vkCreateComputePipelines");
    131     table->DestroyPipeline =
    132         (PFN_vkDestroyPipeline)gpa(dev, "vkDestroyPipeline");
    133     table->CreatePipelineLayout =
    134         (PFN_vkCreatePipelineLayout)gpa(dev, "vkCreatePipelineLayout");
    135     table->DestroyPipelineLayout =
    136         (PFN_vkDestroyPipelineLayout)gpa(dev, "vkDestroyPipelineLayout");
    137     table->CreateSampler = (PFN_vkCreateSampler)gpa(dev, "vkCreateSampler");
    138     table->DestroySampler = (PFN_vkDestroySampler)gpa(dev, "vkDestroySampler");
    139     table->CreateDescriptorSetLayout = (PFN_vkCreateDescriptorSetLayout)gpa(
    140         dev, "vkCreateDescriptorSetLayout");
    141     table->DestroyDescriptorSetLayout = (PFN_vkDestroyDescriptorSetLayout)gpa(
    142         dev, "vkDestroyDescriptorSetLayout");
    143     table->CreateDescriptorPool =
    144         (PFN_vkCreateDescriptorPool)gpa(dev, "vkCreateDescriptorPool");
    145     table->DestroyDescriptorPool =
    146         (PFN_vkDestroyDescriptorPool)gpa(dev, "vkDestroyDescriptorPool");
    147     table->ResetDescriptorPool =
    148         (PFN_vkResetDescriptorPool)gpa(dev, "vkResetDescriptorPool");
    149     table->AllocateDescriptorSets =
    150         (PFN_vkAllocateDescriptorSets)gpa(dev, "vkAllocateDescriptorSets");
    151     table->FreeDescriptorSets =
    152         (PFN_vkFreeDescriptorSets)gpa(dev, "vkFreeDescriptorSets");
    153     table->UpdateDescriptorSets =
    154         (PFN_vkUpdateDescriptorSets)gpa(dev, "vkUpdateDescriptorSets");
    155     table->CreateFramebuffer =
    156         (PFN_vkCreateFramebuffer)gpa(dev, "vkCreateFramebuffer");
    157     table->DestroyFramebuffer =
    158         (PFN_vkDestroyFramebuffer)gpa(dev, "vkDestroyFramebuffer");
    159     table->CreateRenderPass =
    160         (PFN_vkCreateRenderPass)gpa(dev, "vkCreateRenderPass");
    161     table->DestroyRenderPass =
    162         (PFN_vkDestroyRenderPass)gpa(dev, "vkDestroyRenderPass");
    163     table->GetRenderAreaGranularity =
    164         (PFN_vkGetRenderAreaGranularity)gpa(dev, "vkGetRenderAreaGranularity");
    165     table->CreateCommandPool =
    166         (PFN_vkCreateCommandPool)gpa(dev, "vkCreateCommandPool");
    167     table->DestroyCommandPool =
    168         (PFN_vkDestroyCommandPool)gpa(dev, "vkDestroyCommandPool");
    169     table->ResetCommandPool =
    170         (PFN_vkResetCommandPool)gpa(dev, "vkResetCommandPool");
    171     table->AllocateCommandBuffers =
    172         (PFN_vkAllocateCommandBuffers)gpa(dev, "vkAllocateCommandBuffers");
    173     table->FreeCommandBuffers =
    174         (PFN_vkFreeCommandBuffers)gpa(dev, "vkFreeCommandBuffers");
    175     table->BeginCommandBuffer =
    176         (PFN_vkBeginCommandBuffer)gpa(dev, "vkBeginCommandBuffer");
    177     table->EndCommandBuffer =
    178         (PFN_vkEndCommandBuffer)gpa(dev, "vkEndCommandBuffer");
    179     table->ResetCommandBuffer =
    180         (PFN_vkResetCommandBuffer)gpa(dev, "vkResetCommandBuffer");
    181     table->CmdBindPipeline =
    182         (PFN_vkCmdBindPipeline)gpa(dev, "vkCmdBindPipeline");
    183     table->CmdSetViewport = (PFN_vkCmdSetViewport)gpa(dev, "vkCmdSetViewport");
    184     table->CmdSetScissor = (PFN_vkCmdSetScissor)gpa(dev, "vkCmdSetScissor");
    185     table->CmdSetLineWidth =
    186         (PFN_vkCmdSetLineWidth)gpa(dev, "vkCmdSetLineWidth");
    187     table->CmdSetDepthBias =
    188         (PFN_vkCmdSetDepthBias)gpa(dev, "vkCmdSetDepthBias");
    189     table->CmdSetBlendConstants =
    190         (PFN_vkCmdSetBlendConstants)gpa(dev, "vkCmdSetBlendConstants");
    191     table->CmdSetDepthBounds =
    192         (PFN_vkCmdSetDepthBounds)gpa(dev, "vkCmdSetDepthBounds");
    193     table->CmdSetStencilCompareMask =
    194         (PFN_vkCmdSetStencilCompareMask)gpa(dev, "vkCmdSetStencilCompareMask");
    195     table->CmdSetStencilWriteMask =
    196         (PFN_vkCmdSetStencilWriteMask)gpa(dev, "vkCmdSetStencilWriteMask");
    197     table->CmdSetStencilReference =
    198         (PFN_vkCmdSetStencilReference)gpa(dev, "vkCmdSetStencilReference");
    199     table->CmdBindDescriptorSets =
    200         (PFN_vkCmdBindDescriptorSets)gpa(dev, "vkCmdBindDescriptorSets");
    201     table->CmdBindVertexBuffers =
    202         (PFN_vkCmdBindVertexBuffers)gpa(dev, "vkCmdBindVertexBuffers");
    203     table->CmdBindIndexBuffer =
    204         (PFN_vkCmdBindIndexBuffer)gpa(dev, "vkCmdBindIndexBuffer");
    205     table->CmdDraw = (PFN_vkCmdDraw)gpa(dev, "vkCmdDraw");
    206     table->CmdDrawIndexed = (PFN_vkCmdDrawIndexed)gpa(dev, "vkCmdDrawIndexed");
    207     table->CmdDrawIndirect =
    208         (PFN_vkCmdDrawIndirect)gpa(dev, "vkCmdDrawIndirect");
    209     table->CmdDrawIndexedIndirect =
    210         (PFN_vkCmdDrawIndexedIndirect)gpa(dev, "vkCmdDrawIndexedIndirect");
    211     table->CmdDispatch = (PFN_vkCmdDispatch)gpa(dev, "vkCmdDispatch");
    212     table->CmdDispatchIndirect =
    213         (PFN_vkCmdDispatchIndirect)gpa(dev, "vkCmdDispatchIndirect");
    214     table->CmdCopyBuffer = (PFN_vkCmdCopyBuffer)gpa(dev, "vkCmdCopyBuffer");
    215     table->CmdCopyImage = (PFN_vkCmdCopyImage)gpa(dev, "vkCmdCopyImage");
    216     table->CmdBlitImage = (PFN_vkCmdBlitImage)gpa(dev, "vkCmdBlitImage");
    217     table->CmdCopyBufferToImage =
    218         (PFN_vkCmdCopyBufferToImage)gpa(dev, "vkCmdCopyBufferToImage");
    219     table->CmdCopyImageToBuffer =
    220         (PFN_vkCmdCopyImageToBuffer)gpa(dev, "vkCmdCopyImageToBuffer");
    221     table->CmdUpdateBuffer =
    222         (PFN_vkCmdUpdateBuffer)gpa(dev, "vkCmdUpdateBuffer");
    223     table->CmdFillBuffer = (PFN_vkCmdFillBuffer)gpa(dev, "vkCmdFillBuffer");
    224     table->CmdClearColorImage =
    225         (PFN_vkCmdClearColorImage)gpa(dev, "vkCmdClearColorImage");
    226     table->CmdClearDepthStencilImage = (PFN_vkCmdClearDepthStencilImage)gpa(
    227         dev, "vkCmdClearDepthStencilImage");
    228     table->CmdClearAttachments =
    229         (PFN_vkCmdClearAttachments)gpa(dev, "vkCmdClearAttachments");
    230     table->CmdResolveImage =
    231         (PFN_vkCmdResolveImage)gpa(dev, "vkCmdResolveImage");
    232     table->CmdSetEvent = (PFN_vkCmdSetEvent)gpa(dev, "vkCmdSetEvent");
    233     table->CmdResetEvent = (PFN_vkCmdResetEvent)gpa(dev, "vkCmdResetEvent");
    234     table->CmdWaitEvents = (PFN_vkCmdWaitEvents)gpa(dev, "vkCmdWaitEvents");
    235     table->CmdPipelineBarrier =
    236         (PFN_vkCmdPipelineBarrier)gpa(dev, "vkCmdPipelineBarrier");
    237     table->CmdBeginQuery = (PFN_vkCmdBeginQuery)gpa(dev, "vkCmdBeginQuery");
    238     table->CmdEndQuery = (PFN_vkCmdEndQuery)gpa(dev, "vkCmdEndQuery");
    239     table->CmdResetQueryPool =
    240         (PFN_vkCmdResetQueryPool)gpa(dev, "vkCmdResetQueryPool");
    241     table->CmdWriteTimestamp =
    242         (PFN_vkCmdWriteTimestamp)gpa(dev, "vkCmdWriteTimestamp");
    243     table->CmdCopyQueryPoolResults =
    244         (PFN_vkCmdCopyQueryPoolResults)gpa(dev, "vkCmdCopyQueryPoolResults");
    245     table->CmdPushConstants =
    246         (PFN_vkCmdPushConstants)gpa(dev, "vkCmdPushConstants");
    247     table->CmdBeginRenderPass =
    248         (PFN_vkCmdBeginRenderPass)gpa(dev, "vkCmdBeginRenderPass");
    249     table->CmdNextSubpass = (PFN_vkCmdNextSubpass)gpa(dev, "vkCmdNextSubpass");
    250     table->CmdEndRenderPass =
    251         (PFN_vkCmdEndRenderPass)gpa(dev, "vkCmdEndRenderPass");
    252     table->CmdExecuteCommands =
    253         (PFN_vkCmdExecuteCommands)gpa(dev, "vkCmdExecuteCommands");
    254 }
    255 
    256 static inline void loader_init_device_extension_dispatch_table(
    257     struct loader_dev_dispatch_table *dev_table, PFN_vkGetDeviceProcAddr gpa,
    258     VkDevice dev) {
    259     VkLayerDispatchTable *table = &dev_table->core_dispatch;
    260     table->AcquireNextImageKHR =
    261         (PFN_vkAcquireNextImageKHR)gpa(dev, "vkAcquireNextImageKHR");
    262     table->CreateSwapchainKHR =
    263         (PFN_vkCreateSwapchainKHR)gpa(dev, "vkCreateSwapchainKHR");
    264     table->DestroySwapchainKHR =
    265         (PFN_vkDestroySwapchainKHR)gpa(dev, "vkDestroySwapchainKHR");
    266     table->GetSwapchainImagesKHR =
    267         (PFN_vkGetSwapchainImagesKHR)gpa(dev, "vkGetSwapchainImagesKHR");
    268     table->QueuePresentKHR =
    269         (PFN_vkQueuePresentKHR)gpa(dev, "vkQueuePresentKHR");
    270     table->CmdDrawIndirectCountAMD =
    271         (PFN_vkCmdDrawIndirectCountAMD)gpa(dev, "vkCmdDrawIndirectCountAMD");
    272     table->CmdDrawIndexedIndirectCountAMD =
    273         (PFN_vkCmdDrawIndexedIndirectCountAMD)gpa(
    274             dev, "vkCmdDrawIndexedIndirectCountAMD");
    275 #ifdef VK_USE_PLATFORM_WIN32_KHR
    276     table->GetMemoryWin32HandleNV =
    277         (PFN_vkGetMemoryWin32HandleNV)gpa(dev, "vkGetMemoryWin32HandleNV");
    278 #endif // VK_USE_PLATFORM_WIN32_KHR
    279     table->CreateSharedSwapchainsKHR =
    280         (PFN_vkCreateSharedSwapchainsKHR)gpa(dev, "vkCreateSharedSwapchainsKHR");
    281     table->DebugMarkerSetObjectTagEXT =
    282         (PFN_vkDebugMarkerSetObjectTagEXT)gpa(dev, "vkDebugMarkerSetObjectTagEXT");
    283     table->DebugMarkerSetObjectNameEXT =
    284         (PFN_vkDebugMarkerSetObjectNameEXT)gpa(dev, "vkDebugMarkerSetObjectNameEXT");
    285     table->CmdDebugMarkerBeginEXT =
    286         (PFN_vkCmdDebugMarkerBeginEXT)gpa(dev, "vkCmdDebugMarkerBeginEXT");
    287     table->CmdDebugMarkerEndEXT =
    288         (PFN_vkCmdDebugMarkerEndEXT)gpa(dev, "vkCmdDebugMarkerEndEXT");
    289     table->CmdDebugMarkerInsertEXT =
    290         (PFN_vkCmdDebugMarkerInsertEXT)gpa(dev, "vkCmdDebugMarkerInsertEXT");
    291 }
    292 
    293 static inline void *
    294 loader_lookup_device_dispatch_table(const VkLayerDispatchTable *table,
    295                                     const char *name) {
    296     if (!name || name[0] != 'v' || name[1] != 'k')
    297         return NULL;
    298 
    299     name += 2;
    300     if (!strcmp(name, "GetDeviceProcAddr"))
    301         return (void *)table->GetDeviceProcAddr;
    302     if (!strcmp(name, "DestroyDevice"))
    303         return (void *)table->DestroyDevice;
    304     if (!strcmp(name, "GetDeviceQueue"))
    305         return (void *)table->GetDeviceQueue;
    306     if (!strcmp(name, "QueueSubmit"))
    307         return (void *)table->QueueSubmit;
    308     if (!strcmp(name, "QueueWaitIdle"))
    309         return (void *)table->QueueWaitIdle;
    310     if (!strcmp(name, "DeviceWaitIdle"))
    311         return (void *)table->DeviceWaitIdle;
    312     if (!strcmp(name, "AllocateMemory"))
    313         return (void *)table->AllocateMemory;
    314     if (!strcmp(name, "FreeMemory"))
    315         return (void *)table->FreeMemory;
    316     if (!strcmp(name, "MapMemory"))
    317         return (void *)table->MapMemory;
    318     if (!strcmp(name, "UnmapMemory"))
    319         return (void *)table->UnmapMemory;
    320     if (!strcmp(name, "FlushMappedMemoryRanges"))
    321         return (void *)table->FlushMappedMemoryRanges;
    322     if (!strcmp(name, "InvalidateMappedMemoryRanges"))
    323         return (void *)table->InvalidateMappedMemoryRanges;
    324     if (!strcmp(name, "GetDeviceMemoryCommitment"))
    325         return (void *)table->GetDeviceMemoryCommitment;
    326     if (!strcmp(name, "GetImageSparseMemoryRequirements"))
    327         return (void *)table->GetImageSparseMemoryRequirements;
    328     if (!strcmp(name, "GetBufferMemoryRequirements"))
    329         return (void *)table->GetBufferMemoryRequirements;
    330     if (!strcmp(name, "GetImageMemoryRequirements"))
    331         return (void *)table->GetImageMemoryRequirements;
    332     if (!strcmp(name, "BindBufferMemory"))
    333         return (void *)table->BindBufferMemory;
    334     if (!strcmp(name, "BindImageMemory"))
    335         return (void *)table->BindImageMemory;
    336     if (!strcmp(name, "QueueBindSparse"))
    337         return (void *)table->QueueBindSparse;
    338     if (!strcmp(name, "CreateFence"))
    339         return (void *)table->CreateFence;
    340     if (!strcmp(name, "DestroyFence"))
    341         return (void *)table->DestroyFence;
    342     if (!strcmp(name, "ResetFences"))
    343         return (void *)table->ResetFences;
    344     if (!strcmp(name, "GetFenceStatus"))
    345         return (void *)table->GetFenceStatus;
    346     if (!strcmp(name, "WaitForFences"))
    347         return (void *)table->WaitForFences;
    348     if (!strcmp(name, "CreateSemaphore"))
    349         return (void *)table->CreateSemaphore;
    350     if (!strcmp(name, "DestroySemaphore"))
    351         return (void *)table->DestroySemaphore;
    352     if (!strcmp(name, "CreateEvent"))
    353         return (void *)table->CreateEvent;
    354     if (!strcmp(name, "DestroyEvent"))
    355         return (void *)table->DestroyEvent;
    356     if (!strcmp(name, "GetEventStatus"))
    357         return (void *)table->GetEventStatus;
    358     if (!strcmp(name, "SetEvent"))
    359         return (void *)table->SetEvent;
    360     if (!strcmp(name, "ResetEvent"))
    361         return (void *)table->ResetEvent;
    362     if (!strcmp(name, "CreateQueryPool"))
    363         return (void *)table->CreateQueryPool;
    364     if (!strcmp(name, "DestroyQueryPool"))
    365         return (void *)table->DestroyQueryPool;
    366     if (!strcmp(name, "GetQueryPoolResults"))
    367         return (void *)table->GetQueryPoolResults;
    368     if (!strcmp(name, "CreateBuffer"))
    369         return (void *)table->CreateBuffer;
    370     if (!strcmp(name, "DestroyBuffer"))
    371         return (void *)table->DestroyBuffer;
    372     if (!strcmp(name, "CreateBufferView"))
    373         return (void *)table->CreateBufferView;
    374     if (!strcmp(name, "DestroyBufferView"))
    375         return (void *)table->DestroyBufferView;
    376     if (!strcmp(name, "CreateImage"))
    377         return (void *)table->CreateImage;
    378     if (!strcmp(name, "DestroyImage"))
    379         return (void *)table->DestroyImage;
    380     if (!strcmp(name, "GetImageSubresourceLayout"))
    381         return (void *)table->GetImageSubresourceLayout;
    382     if (!strcmp(name, "CreateImageView"))
    383         return (void *)table->CreateImageView;
    384     if (!strcmp(name, "DestroyImageView"))
    385         return (void *)table->DestroyImageView;
    386     if (!strcmp(name, "CreateShaderModule"))
    387         return (void *)table->CreateShaderModule;
    388     if (!strcmp(name, "DestroyShaderModule"))
    389         return (void *)table->DestroyShaderModule;
    390     if (!strcmp(name, "CreatePipelineCache"))
    391         return (void *)vkCreatePipelineCache;
    392     if (!strcmp(name, "DestroyPipelineCache"))
    393         return (void *)vkDestroyPipelineCache;
    394     if (!strcmp(name, "GetPipelineCacheData"))
    395         return (void *)vkGetPipelineCacheData;
    396     if (!strcmp(name, "MergePipelineCaches"))
    397         return (void *)vkMergePipelineCaches;
    398     if (!strcmp(name, "CreateGraphicsPipelines"))
    399         return (void *)vkCreateGraphicsPipelines;
    400     if (!strcmp(name, "CreateComputePipelines"))
    401         return (void *)vkCreateComputePipelines;
    402     if (!strcmp(name, "DestroyPipeline"))
    403         return (void *)table->DestroyPipeline;
    404     if (!strcmp(name, "CreatePipelineLayout"))
    405         return (void *)table->CreatePipelineLayout;
    406     if (!strcmp(name, "DestroyPipelineLayout"))
    407         return (void *)table->DestroyPipelineLayout;
    408     if (!strcmp(name, "CreateSampler"))
    409         return (void *)table->CreateSampler;
    410     if (!strcmp(name, "DestroySampler"))
    411         return (void *)table->DestroySampler;
    412     if (!strcmp(name, "CreateDescriptorSetLayout"))
    413         return (void *)table->CreateDescriptorSetLayout;
    414     if (!strcmp(name, "DestroyDescriptorSetLayout"))
    415         return (void *)table->DestroyDescriptorSetLayout;
    416     if (!strcmp(name, "CreateDescriptorPool"))
    417         return (void *)table->CreateDescriptorPool;
    418     if (!strcmp(name, "DestroyDescriptorPool"))
    419         return (void *)table->DestroyDescriptorPool;
    420     if (!strcmp(name, "ResetDescriptorPool"))
    421         return (void *)table->ResetDescriptorPool;
    422     if (!strcmp(name, "AllocateDescriptorSets"))
    423         return (void *)table->AllocateDescriptorSets;
    424     if (!strcmp(name, "FreeDescriptorSets"))
    425         return (void *)table->FreeDescriptorSets;
    426     if (!strcmp(name, "UpdateDescriptorSets"))
    427         return (void *)table->UpdateDescriptorSets;
    428     if (!strcmp(name, "CreateFramebuffer"))
    429         return (void *)table->CreateFramebuffer;
    430     if (!strcmp(name, "DestroyFramebuffer"))
    431         return (void *)table->DestroyFramebuffer;
    432     if (!strcmp(name, "CreateRenderPass"))
    433         return (void *)table->CreateRenderPass;
    434     if (!strcmp(name, "DestroyRenderPass"))
    435         return (void *)table->DestroyRenderPass;
    436     if (!strcmp(name, "GetRenderAreaGranularity"))
    437         return (void *)table->GetRenderAreaGranularity;
    438     if (!strcmp(name, "CreateCommandPool"))
    439         return (void *)table->CreateCommandPool;
    440     if (!strcmp(name, "DestroyCommandPool"))
    441         return (void *)table->DestroyCommandPool;
    442     if (!strcmp(name, "ResetCommandPool"))
    443         return (void *)table->ResetCommandPool;
    444     if (!strcmp(name, "AllocateCommandBuffers"))
    445         return (void *)table->AllocateCommandBuffers;
    446     if (!strcmp(name, "FreeCommandBuffers"))
    447         return (void *)table->FreeCommandBuffers;
    448     if (!strcmp(name, "BeginCommandBuffer"))
    449         return (void *)table->BeginCommandBuffer;
    450     if (!strcmp(name, "EndCommandBuffer"))
    451         return (void *)table->EndCommandBuffer;
    452     if (!strcmp(name, "ResetCommandBuffer"))
    453         return (void *)table->ResetCommandBuffer;
    454     if (!strcmp(name, "CmdBindPipeline"))
    455         return (void *)table->CmdBindPipeline;
    456     if (!strcmp(name, "CmdSetViewport"))
    457         return (void *)table->CmdSetViewport;
    458     if (!strcmp(name, "CmdSetScissor"))
    459         return (void *)table->CmdSetScissor;
    460     if (!strcmp(name, "CmdSetLineWidth"))
    461         return (void *)table->CmdSetLineWidth;
    462     if (!strcmp(name, "CmdSetDepthBias"))
    463         return (void *)table->CmdSetDepthBias;
    464     if (!strcmp(name, "CmdSetBlendConstants"))
    465         return (void *)table->CmdSetBlendConstants;
    466     if (!strcmp(name, "CmdSetDepthBounds"))
    467         return (void *)table->CmdSetDepthBounds;
    468     if (!strcmp(name, "CmdSetStencilCompareMask"))
    469         return (void *)table->CmdSetStencilCompareMask;
    470     if (!strcmp(name, "CmdSetStencilwriteMask"))
    471         return (void *)table->CmdSetStencilWriteMask;
    472     if (!strcmp(name, "CmdSetStencilReference"))
    473         return (void *)table->CmdSetStencilReference;
    474     if (!strcmp(name, "CmdBindDescriptorSets"))
    475         return (void *)table->CmdBindDescriptorSets;
    476     if (!strcmp(name, "CmdBindVertexBuffers"))
    477         return (void *)table->CmdBindVertexBuffers;
    478     if (!strcmp(name, "CmdBindIndexBuffer"))
    479         return (void *)table->CmdBindIndexBuffer;
    480     if (!strcmp(name, "CmdDraw"))
    481         return (void *)table->CmdDraw;
    482     if (!strcmp(name, "CmdDrawIndexed"))
    483         return (void *)table->CmdDrawIndexed;
    484     if (!strcmp(name, "CmdDrawIndirect"))
    485         return (void *)table->CmdDrawIndirect;
    486     if (!strcmp(name, "CmdDrawIndexedIndirect"))
    487         return (void *)table->CmdDrawIndexedIndirect;
    488     if (!strcmp(name, "CmdDispatch"))
    489         return (void *)table->CmdDispatch;
    490     if (!strcmp(name, "CmdDispatchIndirect"))
    491         return (void *)table->CmdDispatchIndirect;
    492     if (!strcmp(name, "CmdCopyBuffer"))
    493         return (void *)table->CmdCopyBuffer;
    494     if (!strcmp(name, "CmdCopyImage"))
    495         return (void *)table->CmdCopyImage;
    496     if (!strcmp(name, "CmdBlitImage"))
    497         return (void *)table->CmdBlitImage;
    498     if (!strcmp(name, "CmdCopyBufferToImage"))
    499         return (void *)table->CmdCopyBufferToImage;
    500     if (!strcmp(name, "CmdCopyImageToBuffer"))
    501         return (void *)table->CmdCopyImageToBuffer;
    502     if (!strcmp(name, "CmdUpdateBuffer"))
    503         return (void *)table->CmdUpdateBuffer;
    504     if (!strcmp(name, "CmdFillBuffer"))
    505         return (void *)table->CmdFillBuffer;
    506     if (!strcmp(name, "CmdClearColorImage"))
    507         return (void *)table->CmdClearColorImage;
    508     if (!strcmp(name, "CmdClearDepthStencilImage"))
    509         return (void *)table->CmdClearDepthStencilImage;
    510     if (!strcmp(name, "CmdClearAttachments"))
    511         return (void *)table->CmdClearAttachments;
    512     if (!strcmp(name, "CmdResolveImage"))
    513         return (void *)table->CmdResolveImage;
    514     if (!strcmp(name, "CmdSetEvent"))
    515         return (void *)table->CmdSetEvent;
    516     if (!strcmp(name, "CmdResetEvent"))
    517         return (void *)table->CmdResetEvent;
    518     if (!strcmp(name, "CmdWaitEvents"))
    519         return (void *)table->CmdWaitEvents;
    520     if (!strcmp(name, "CmdPipelineBarrier"))
    521         return (void *)table->CmdPipelineBarrier;
    522     if (!strcmp(name, "CmdBeginQuery"))
    523         return (void *)table->CmdBeginQuery;
    524     if (!strcmp(name, "CmdEndQuery"))
    525         return (void *)table->CmdEndQuery;
    526     if (!strcmp(name, "CmdResetQueryPool"))
    527         return (void *)table->CmdResetQueryPool;
    528     if (!strcmp(name, "CmdWriteTimestamp"))
    529         return (void *)table->CmdWriteTimestamp;
    530     if (!strcmp(name, "CmdCopyQueryPoolResults"))
    531         return (void *)table->CmdCopyQueryPoolResults;
    532     if (!strcmp(name, "CmdPushConstants"))
    533         return (void *)table->CmdPushConstants;
    534     if (!strcmp(name, "CmdBeginRenderPass"))
    535         return (void *)table->CmdBeginRenderPass;
    536     if (!strcmp(name, "CmdNextSubpass"))
    537         return (void *)table->CmdNextSubpass;
    538     if (!strcmp(name, "CmdEndRenderPass"))
    539         return (void *)table->CmdEndRenderPass;
    540     if (!strcmp(name, "CmdExecuteCommands"))
    541         return (void *)table->CmdExecuteCommands;
    542 
    543     if (!strcmp(name, "CreateSwapchainKHR")) {
    544         // For CreateSwapChainKHR we need to use trampoline and terminator
    545         // functions to properly unwrap the SurfaceKHR object.
    546         return (void *)vkCreateSwapchainKHR;
    547     }
    548     if (!strcmp(name, "DestroySwapchainKHR"))
    549         return (void *)table->DestroySwapchainKHR;
    550     if (!strcmp(name, "GetSwapchainImagesKHR"))
    551         return (void *)table->GetSwapchainImagesKHR;
    552     if (!strcmp(name, "AcquireNextImageKHR"))
    553         return (void *)table->AcquireNextImageKHR;
    554     if (!strcmp(name, "QueuePresentKHR"))
    555         return (void *)table->QueuePresentKHR;
    556 
    557     return NULL;
    558 }
    559 
    560 static inline void
    561 loader_init_instance_core_dispatch_table(VkLayerInstanceDispatchTable *table,
    562                                          PFN_vkGetInstanceProcAddr gpa,
    563                                          VkInstance inst) {
    564     table->GetInstanceProcAddr =
    565         (PFN_vkGetInstanceProcAddr)gpa(inst, "vkGetInstanceProcAddr");
    566     table->DestroyInstance =
    567         (PFN_vkDestroyInstance)gpa(inst, "vkDestroyInstance");
    568     table->EnumeratePhysicalDevices =
    569         (PFN_vkEnumeratePhysicalDevices)gpa(inst, "vkEnumeratePhysicalDevices");
    570     table->GetPhysicalDeviceFeatures = (PFN_vkGetPhysicalDeviceFeatures)gpa(
    571         inst, "vkGetPhysicalDeviceFeatures");
    572     table->GetPhysicalDeviceImageFormatProperties =
    573         (PFN_vkGetPhysicalDeviceImageFormatProperties)gpa(
    574             inst, "vkGetPhysicalDeviceImageFormatProperties");
    575     table->GetPhysicalDeviceFormatProperties =
    576         (PFN_vkGetPhysicalDeviceFormatProperties)gpa(
    577             inst, "vkGetPhysicalDeviceFormatProperties");
    578     table->GetPhysicalDeviceSparseImageFormatProperties =
    579         (PFN_vkGetPhysicalDeviceSparseImageFormatProperties)gpa(
    580             inst, "vkGetPhysicalDeviceSparseImageFormatProperties");
    581     table->GetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties)gpa(
    582         inst, "vkGetPhysicalDeviceProperties");
    583     table->GetPhysicalDeviceQueueFamilyProperties =
    584         (PFN_vkGetPhysicalDeviceQueueFamilyProperties)gpa(
    585             inst, "vkGetPhysicalDeviceQueueFamilyProperties");
    586     table->GetPhysicalDeviceMemoryProperties =
    587         (PFN_vkGetPhysicalDeviceMemoryProperties)gpa(
    588             inst, "vkGetPhysicalDeviceMemoryProperties");
    589     table->EnumerateDeviceExtensionProperties =
    590         (PFN_vkEnumerateDeviceExtensionProperties)gpa(
    591             inst, "vkEnumerateDeviceExtensionProperties");
    592     table->EnumerateDeviceLayerProperties =
    593         (PFN_vkEnumerateDeviceLayerProperties)gpa(
    594             inst, "vkEnumerateDeviceLayerProperties");
    595 }
    596 
    597 static inline void loader_init_instance_extension_dispatch_table(
    598     VkLayerInstanceDispatchTable *table, PFN_vkGetInstanceProcAddr gpa,
    599     VkInstance inst) {
    600     table->DestroySurfaceKHR =
    601         (PFN_vkDestroySurfaceKHR)gpa(inst, "vkDestroySurfaceKHR");
    602     table->CreateDebugReportCallbackEXT =
    603         (PFN_vkCreateDebugReportCallbackEXT)gpa(
    604             inst, "vkCreateDebugReportCallbackEXT");
    605     table->DestroyDebugReportCallbackEXT =
    606         (PFN_vkDestroyDebugReportCallbackEXT)gpa(
    607             inst, "vkDestroyDebugReportCallbackEXT");
    608     table->DebugReportMessageEXT =
    609         (PFN_vkDebugReportMessageEXT)gpa(inst, "vkDebugReportMessageEXT");
    610     table->GetPhysicalDeviceSurfaceSupportKHR =
    611         (PFN_vkGetPhysicalDeviceSurfaceSupportKHR)gpa(
    612             inst, "vkGetPhysicalDeviceSurfaceSupportKHR");
    613     table->GetPhysicalDeviceSurfaceCapabilitiesKHR =
    614         (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)gpa(
    615             inst, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR");
    616     table->GetPhysicalDeviceSurfaceFormatsKHR =
    617         (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)gpa(
    618             inst, "vkGetPhysicalDeviceSurfaceFormatsKHR");
    619     table->GetPhysicalDeviceSurfacePresentModesKHR =
    620         (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)gpa(
    621             inst, "vkGetPhysicalDeviceSurfacePresentModesKHR");
    622     table->GetPhysicalDeviceExternalImageFormatPropertiesNV =
    623         (PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV)gpa(
    624             inst, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV");
    625 #ifdef VK_USE_PLATFORM_MIR_KHR
    626     table->CreateMirSurfaceKHR =
    627         (PFN_vkCreateMirSurfaceKHR)gpa(inst, "vkCreateMirSurfaceKHR");
    628     table->GetPhysicalDeviceMirPresentationSupportKHR =
    629         (PFN_vkGetPhysicalDeviceMirPresentationSupportKHR)gpa(
    630             inst, "vkGetPhysicalDeviceMirPresentationSupportKHR");
    631 #endif
    632 #ifdef VK_USE_PLATFORM_WAYLAND_KHR
    633     table->CreateWaylandSurfaceKHR =
    634         (PFN_vkCreateWaylandSurfaceKHR)gpa(inst, "vkCreateWaylandSurfaceKHR");
    635     table->GetPhysicalDeviceWaylandPresentationSupportKHR =
    636         (PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)gpa(
    637             inst, "vkGetPhysicalDeviceWaylandPresentationSupportKHR");
    638 #endif
    639 #ifdef VK_USE_PLATFORM_WIN32_KHR
    640     table->CreateWin32SurfaceKHR =
    641         (PFN_vkCreateWin32SurfaceKHR)gpa(inst, "vkCreateWin32SurfaceKHR");
    642     table->GetPhysicalDeviceWin32PresentationSupportKHR =
    643         (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)gpa(
    644             inst, "vkGetPhysicalDeviceWin32PresentationSupportKHR");
    645 #endif
    646 #ifdef VK_USE_PLATFORM_XCB_KHR
    647     table->CreateXcbSurfaceKHR =
    648         (PFN_vkCreateXcbSurfaceKHR)gpa(inst, "vkCreateXcbSurfaceKHR");
    649     table->GetPhysicalDeviceXcbPresentationSupportKHR =
    650         (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)gpa(
    651             inst, "vkGetPhysicalDeviceXcbPresentationSupportKHR");
    652 #endif
    653 #ifdef VK_USE_PLATFORM_XLIB_KHR
    654     table->CreateXlibSurfaceKHR =
    655         (PFN_vkCreateXlibSurfaceKHR)gpa(inst, "vkCreateXlibSurfaceKHR");
    656     table->GetPhysicalDeviceXlibPresentationSupportKHR =
    657         (PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)gpa(
    658             inst, "vkGetPhysicalDeviceXlibPresentationSupportKHR");
    659 #endif
    660     table->GetPhysicalDeviceDisplayPropertiesKHR =
    661         (PFN_vkGetPhysicalDeviceDisplayPropertiesKHR)gpa(
    662             inst, "vkGetPhysicalDeviceDisplayPropertiesKHR");
    663     table->GetPhysicalDeviceDisplayPlanePropertiesKHR =
    664         (PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)gpa(
    665             inst, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR");
    666     table->GetDisplayPlaneSupportedDisplaysKHR =
    667         (PFN_vkGetDisplayPlaneSupportedDisplaysKHR)gpa(
    668             inst, "vkGetDisplayPlaneSupportedDisplaysKHR");
    669     table->GetDisplayModePropertiesKHR = (PFN_vkGetDisplayModePropertiesKHR)gpa(
    670         inst, "vkGetDisplayModePropertiesKHR");
    671     table->CreateDisplayModeKHR =
    672         (PFN_vkCreateDisplayModeKHR)gpa(inst, "vkCreateDisplayModeKHR");
    673     table->GetDisplayPlaneCapabilitiesKHR =
    674         (PFN_vkGetDisplayPlaneCapabilitiesKHR)gpa(
    675             inst, "vkGetDisplayPlaneCapabilitiesKHR");
    676     table->CreateDisplayPlaneSurfaceKHR =
    677         (PFN_vkCreateDisplayPlaneSurfaceKHR)gpa(
    678             inst, "vkCreateDisplayPlaneSurfaceKHR");
    679 }
    680 
    681 static inline void *
    682 loader_lookup_instance_dispatch_table(const VkLayerInstanceDispatchTable *table,
    683                                       const char *name, bool *found_name) {
    684     if (!name || name[0] != 'v' || name[1] != 'k') {
    685         *found_name = false;
    686         return NULL;
    687     }
    688 
    689     *found_name = true;
    690     name += 2;
    691     if (!strcmp(name, "DestroyInstance"))
    692         return (void *)table->DestroyInstance;
    693     if (!strcmp(name, "EnumeratePhysicalDevices"))
    694         return (void *)table->EnumeratePhysicalDevices;
    695     if (!strcmp(name, "GetPhysicalDeviceFeatures"))
    696         return (void *)table->GetPhysicalDeviceFeatures;
    697     if (!strcmp(name, "GetPhysicalDeviceImageFormatProperties"))
    698         return (void *)table->GetPhysicalDeviceImageFormatProperties;
    699     if (!strcmp(name, "GetPhysicalDeviceFormatProperties"))
    700         return (void *)table->GetPhysicalDeviceFormatProperties;
    701     if (!strcmp(name, "GetPhysicalDeviceSparseImageFormatProperties"))
    702         return (void *)table->GetPhysicalDeviceSparseImageFormatProperties;
    703     if (!strcmp(name, "GetPhysicalDeviceProperties"))
    704         return (void *)table->GetPhysicalDeviceProperties;
    705     if (!strcmp(name, "GetPhysicalDeviceQueueFamilyProperties"))
    706         return (void *)table->GetPhysicalDeviceQueueFamilyProperties;
    707     if (!strcmp(name, "GetPhysicalDeviceMemoryProperties"))
    708         return (void *)table->GetPhysicalDeviceMemoryProperties;
    709     if (!strcmp(name, "GetInstanceProcAddr"))
    710         return (void *)table->GetInstanceProcAddr;
    711     if (!strcmp(name, "EnumerateDeviceExtensionProperties"))
    712         return (void *)table->EnumerateDeviceExtensionProperties;
    713     if (!strcmp(name, "EnumerateDeviceLayerProperties"))
    714         return (void *)table->EnumerateDeviceLayerProperties;
    715     if (!strcmp(name, "DestroySurfaceKHR"))
    716         return (void *)table->DestroySurfaceKHR;
    717     if (!strcmp(name, "GetPhysicalDeviceSurfaceSupportKHR"))
    718         return (void *)table->GetPhysicalDeviceSurfaceSupportKHR;
    719     if (!strcmp(name, "GetPhysicalDeviceSurfaceCapabilitiesKHR"))
    720         return (void *)table->GetPhysicalDeviceSurfaceCapabilitiesKHR;
    721     if (!strcmp(name, "GetPhysicalDeviceSurfaceFormatsKHR"))
    722         return (void *)table->GetPhysicalDeviceSurfaceFormatsKHR;
    723     if (!strcmp(name, "GetPhysicalDeviceSurfacePresentModesKHR"))
    724         return (void *)table->GetPhysicalDeviceSurfacePresentModesKHR;
    725     if (!strcmp(name, "GetPhysicalDeviceExternalImageFormatPropertiesNV"))
    726         return (void *)table->GetPhysicalDeviceExternalImageFormatPropertiesNV;
    727 #ifdef VK_USE_PLATFORM_MIR_KHR
    728     if (!strcmp(name, "CreateMirSurfaceKHR"))
    729         return (void *)table->CreateMirSurfaceKHR;
    730     if (!strcmp(name, "GetPhysicalDeviceMirPresentationSupportKHR"))
    731         return (void *)table->GetPhysicalDeviceMirPresentationSupportKHR;
    732 #endif
    733 #ifdef VK_USE_PLATFORM_WAYLAND_KHR
    734     if (!strcmp(name, "CreateWaylandSurfaceKHR"))
    735         return (void *)table->CreateWaylandSurfaceKHR;
    736     if (!strcmp(name, "GetPhysicalDeviceWaylandPresentationSupportKHR"))
    737         return (void *)table->GetPhysicalDeviceWaylandPresentationSupportKHR;
    738 #endif
    739 #ifdef VK_USE_PLATFORM_WIN32_KHR
    740     if (!strcmp(name, "CreateWin32SurfaceKHR"))
    741         return (void *)table->CreateWin32SurfaceKHR;
    742     if (!strcmp(name, "GetPhysicalDeviceWin32PresentationSupportKHR"))
    743         return (void *)table->GetPhysicalDeviceWin32PresentationSupportKHR;
    744 #endif
    745 #ifdef VK_USE_PLATFORM_XCB_KHR
    746     if (!strcmp(name, "CreateXcbSurfaceKHR"))
    747         return (void *)table->CreateXcbSurfaceKHR;
    748     if (!strcmp(name, "GetPhysicalDeviceXcbPresentationSupportKHR"))
    749         return (void *)table->GetPhysicalDeviceXcbPresentationSupportKHR;
    750 #endif
    751 #ifdef VK_USE_PLATFORM_XLIB_KHR
    752     if (!strcmp(name, "CreateXlibSurfaceKHR"))
    753         return (void *)table->CreateXlibSurfaceKHR;
    754     if (!strcmp(name, "GetPhysicalDeviceXlibPresentationSupportKHR"))
    755         return (void *)table->GetPhysicalDeviceXlibPresentationSupportKHR;
    756 #endif
    757     if (!strcmp(name, "GetPhysicalDeviceDisplayPropertiesKHR"))
    758         return (void *)table->GetPhysicalDeviceDisplayPropertiesKHR;
    759     if (!strcmp(name, "GetPhysicalDeviceDisplayPlanePropertiesKHR"))
    760         return (void *)table->GetPhysicalDeviceDisplayPlanePropertiesKHR;
    761     if (!strcmp(name, "GetDisplayPlaneSupportedDisplaysKHR"))
    762         return (void *)table->GetDisplayPlaneSupportedDisplaysKHR;
    763     if (!strcmp(name, "GetDisplayModePropertiesKHR"))
    764         return (void *)table->GetDisplayModePropertiesKHR;
    765     if (!strcmp(name, "CreateDisplayModeKHR"))
    766         return (void *)table->CreateDisplayModeKHR;
    767     if (!strcmp(name, "GetDisplayPlaneCapabilitiesKHR"))
    768         return (void *)table->GetDisplayPlaneCapabilitiesKHR;
    769     if (!strcmp(name, "CreateDisplayPlaneSurfaceKHR"))
    770         return (void *)table->CreateDisplayPlaneSurfaceKHR;
    771 
    772     if (!strcmp(name, "CreateDebugReportCallbackEXT"))
    773         return (void *)table->CreateDebugReportCallbackEXT;
    774     if (!strcmp(name, "DestroyDebugReportCallbackEXT"))
    775         return (void *)table->DestroyDebugReportCallbackEXT;
    776     if (!strcmp(name, "DebugReportMessageEXT"))
    777         return (void *)table->DebugReportMessageEXT;
    778 
    779     *found_name = false;
    780     return NULL;
    781 }
    782