blob: cb4f6227501ad392c7df38ebc918d901b5ed6b6d [file] [log] [blame]
Jon Ashburnd55a3942015-05-06 09:02:10 -06001/*
Jon Ashburnd55a3942015-05-06 09:02:10 -06002 *
Jon Ashburn23d36b12016-02-02 17:47:28 -07003 * 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.
Jon Ashburnd55a3942015-05-06 09:02:10 -06007 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06008 * 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
Jon Ashburnd55a3942015-05-06 09:02:10 -060011 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060012 * http://www.apache.org/licenses/LICENSE-2.0
Jon Ashburnd55a3942015-05-06 09:02:10 -060013 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060014 * 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.
Jon Ashburn23d36b12016-02-02 17:47:28 -070019 *
20 * Author: Courtney Goeltzenleuchter <courtney@lunarg.com>
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060021 * Author: Jon Ashburn <jon@lunarg.com>
Jon Ashburn23d36b12016-02-02 17:47:28 -070022 * Author: Ian Elliott <ian@LunarG.com>
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060023 * Author: Tony Barbour <tony@LunarG.com>
Jon Ashburnd55a3942015-05-06 09:02:10 -060024 */
25
David Pinedo9316d3b2015-11-06 12:54:48 -070026#include <vulkan/vulkan.h>
27#include <vulkan/vk_layer.h>
Jon Ashburnd55a3942015-05-06 09:02:10 -060028#include <string.h>
Jon Ashburn27cd5842015-05-12 17:26:48 -060029#include "loader.h"
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060030#include "vk_loader_platform.h"
Jon Ashburnd55a3942015-05-06 09:02:10 -060031
Jamie Madill3fbf0772016-12-21 13:09:59 -050032static VkResult VKAPI_CALL vkDevExtError(VkDevice dev) {
Jon Ashburn2e37d752016-02-12 08:20:06 -070033 struct loader_device *found_dev;
Mark Young65cb3662016-11-07 13:27:02 -070034 // The device going in is a trampoline device
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070035 struct loader_icd_term *icd_term = loader_get_icd_and_device(dev, &found_dev, NULL);
Jon Ashburn2e37d752016-02-12 08:20:06 -070036
Mark Young0153e0b2016-11-03 14:27:13 -060037 if (icd_term)
38 loader_log(icd_term->this_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
Jon Ashburn2e37d752016-02-12 08:20:06 -070039 "Bad destination in loader trampoline dispatch,"
40 "Are layers and extensions that you are calling enabled?");
41 return VK_ERROR_EXTENSION_NOT_PRESENT;
Jon Ashburnfc1031e2015-11-17 15:31:02 -070042}
43
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070044static inline void loader_init_device_dispatch_table(struct loader_dev_dispatch_table *dev_table, PFN_vkGetDeviceProcAddr gpa,
45 VkDevice dev) {
Jon Ashburnfc1031e2015-11-17 15:31:02 -070046 VkLayerDispatchTable *table = &dev_table->core_dispatch;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070047 for (uint32_t i = 0; i < MAX_NUM_UNKNOWN_EXTS; i++) dev_table->ext_dispatch.dev_ext[i] = (PFN_vkDevExt)vkDevExtError;
Jon Ashburn8fd08252015-05-28 16:25:02 -060048
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070049 table->GetDeviceProcAddr = (PFN_vkGetDeviceProcAddr)gpa(dev, "vkGetDeviceProcAddr");
Jon Ashburn23d36b12016-02-02 17:47:28 -070050 table->DestroyDevice = (PFN_vkDestroyDevice)gpa(dev, "vkDestroyDevice");
51 table->GetDeviceQueue = (PFN_vkGetDeviceQueue)gpa(dev, "vkGetDeviceQueue");
52 table->QueueSubmit = (PFN_vkQueueSubmit)gpa(dev, "vkQueueSubmit");
53 table->QueueWaitIdle = (PFN_vkQueueWaitIdle)gpa(dev, "vkQueueWaitIdle");
54 table->DeviceWaitIdle = (PFN_vkDeviceWaitIdle)gpa(dev, "vkDeviceWaitIdle");
55 table->AllocateMemory = (PFN_vkAllocateMemory)gpa(dev, "vkAllocateMemory");
56 table->FreeMemory = (PFN_vkFreeMemory)gpa(dev, "vkFreeMemory");
57 table->MapMemory = (PFN_vkMapMemory)gpa(dev, "vkMapMemory");
58 table->UnmapMemory = (PFN_vkUnmapMemory)gpa(dev, "vkUnmapMemory");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070059 table->FlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges)gpa(dev, "vkFlushMappedMemoryRanges");
60 table->InvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges)gpa(dev, "vkInvalidateMappedMemoryRanges");
61 table->GetDeviceMemoryCommitment = (PFN_vkGetDeviceMemoryCommitment)gpa(dev, "vkGetDeviceMemoryCommitment");
Jon Ashburn23d36b12016-02-02 17:47:28 -070062 table->GetImageSparseMemoryRequirements =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070063 (PFN_vkGetImageSparseMemoryRequirements)gpa(dev, "vkGetImageSparseMemoryRequirements");
64 table->GetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements)gpa(dev, "vkGetBufferMemoryRequirements");
65 table->GetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements)gpa(dev, "vkGetImageMemoryRequirements");
66 table->BindBufferMemory = (PFN_vkBindBufferMemory)gpa(dev, "vkBindBufferMemory");
67 table->BindImageMemory = (PFN_vkBindImageMemory)gpa(dev, "vkBindImageMemory");
68 table->QueueBindSparse = (PFN_vkQueueBindSparse)gpa(dev, "vkQueueBindSparse");
Jon Ashburn23d36b12016-02-02 17:47:28 -070069 table->CreateFence = (PFN_vkCreateFence)gpa(dev, "vkCreateFence");
70 table->DestroyFence = (PFN_vkDestroyFence)gpa(dev, "vkDestroyFence");
71 table->ResetFences = (PFN_vkResetFences)gpa(dev, "vkResetFences");
72 table->GetFenceStatus = (PFN_vkGetFenceStatus)gpa(dev, "vkGetFenceStatus");
73 table->WaitForFences = (PFN_vkWaitForFences)gpa(dev, "vkWaitForFences");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070074 table->CreateSemaphore = (PFN_vkCreateSemaphore)gpa(dev, "vkCreateSemaphore");
75 table->DestroySemaphore = (PFN_vkDestroySemaphore)gpa(dev, "vkDestroySemaphore");
Jon Ashburn23d36b12016-02-02 17:47:28 -070076 table->CreateEvent = (PFN_vkCreateEvent)gpa(dev, "vkCreateEvent");
77 table->DestroyEvent = (PFN_vkDestroyEvent)gpa(dev, "vkDestroyEvent");
78 table->GetEventStatus = (PFN_vkGetEventStatus)gpa(dev, "vkGetEventStatus");
79 table->SetEvent = (PFN_vkSetEvent)gpa(dev, "vkSetEvent");
80 table->ResetEvent = (PFN_vkResetEvent)gpa(dev, "vkResetEvent");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070081 table->CreateQueryPool = (PFN_vkCreateQueryPool)gpa(dev, "vkCreateQueryPool");
82 table->DestroyQueryPool = (PFN_vkDestroyQueryPool)gpa(dev, "vkDestroyQueryPool");
83 table->GetQueryPoolResults = (PFN_vkGetQueryPoolResults)gpa(dev, "vkGetQueryPoolResults");
Jon Ashburn23d36b12016-02-02 17:47:28 -070084 table->CreateBuffer = (PFN_vkCreateBuffer)gpa(dev, "vkCreateBuffer");
85 table->DestroyBuffer = (PFN_vkDestroyBuffer)gpa(dev, "vkDestroyBuffer");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070086 table->CreateBufferView = (PFN_vkCreateBufferView)gpa(dev, "vkCreateBufferView");
87 table->DestroyBufferView = (PFN_vkDestroyBufferView)gpa(dev, "vkDestroyBufferView");
Jon Ashburn23d36b12016-02-02 17:47:28 -070088 table->CreateImage = (PFN_vkCreateImage)gpa(dev, "vkCreateImage");
89 table->DestroyImage = (PFN_vkDestroyImage)gpa(dev, "vkDestroyImage");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070090 table->GetImageSubresourceLayout = (PFN_vkGetImageSubresourceLayout)gpa(dev, "vkGetImageSubresourceLayout");
91 table->CreateImageView = (PFN_vkCreateImageView)gpa(dev, "vkCreateImageView");
92 table->DestroyImageView = (PFN_vkDestroyImageView)gpa(dev, "vkDestroyImageView");
93 table->CreateShaderModule = (PFN_vkCreateShaderModule)gpa(dev, "vkCreateShaderModule");
94 table->DestroyShaderModule = (PFN_vkDestroyShaderModule)gpa(dev, "vkDestroyShaderModule");
95 table->CreatePipelineCache = (PFN_vkCreatePipelineCache)gpa(dev, "vkCreatePipelineCache");
96 table->DestroyPipelineCache = (PFN_vkDestroyPipelineCache)gpa(dev, "vkDestroyPipelineCache");
97 table->GetPipelineCacheData = (PFN_vkGetPipelineCacheData)gpa(dev, "vkGetPipelineCacheData");
98 table->MergePipelineCaches = (PFN_vkMergePipelineCaches)gpa(dev, "vkMergePipelineCaches");
99 table->CreateGraphicsPipelines = (PFN_vkCreateGraphicsPipelines)gpa(dev, "vkCreateGraphicsPipelines");
100 table->CreateComputePipelines = (PFN_vkCreateComputePipelines)gpa(dev, "vkCreateComputePipelines");
101 table->DestroyPipeline = (PFN_vkDestroyPipeline)gpa(dev, "vkDestroyPipeline");
102 table->CreatePipelineLayout = (PFN_vkCreatePipelineLayout)gpa(dev, "vkCreatePipelineLayout");
103 table->DestroyPipelineLayout = (PFN_vkDestroyPipelineLayout)gpa(dev, "vkDestroyPipelineLayout");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700104 table->CreateSampler = (PFN_vkCreateSampler)gpa(dev, "vkCreateSampler");
105 table->DestroySampler = (PFN_vkDestroySampler)gpa(dev, "vkDestroySampler");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700106 table->CreateDescriptorSetLayout = (PFN_vkCreateDescriptorSetLayout)gpa(dev, "vkCreateDescriptorSetLayout");
107 table->DestroyDescriptorSetLayout = (PFN_vkDestroyDescriptorSetLayout)gpa(dev, "vkDestroyDescriptorSetLayout");
108 table->CreateDescriptorPool = (PFN_vkCreateDescriptorPool)gpa(dev, "vkCreateDescriptorPool");
109 table->DestroyDescriptorPool = (PFN_vkDestroyDescriptorPool)gpa(dev, "vkDestroyDescriptorPool");
110 table->ResetDescriptorPool = (PFN_vkResetDescriptorPool)gpa(dev, "vkResetDescriptorPool");
111 table->AllocateDescriptorSets = (PFN_vkAllocateDescriptorSets)gpa(dev, "vkAllocateDescriptorSets");
112 table->FreeDescriptorSets = (PFN_vkFreeDescriptorSets)gpa(dev, "vkFreeDescriptorSets");
113 table->UpdateDescriptorSets = (PFN_vkUpdateDescriptorSets)gpa(dev, "vkUpdateDescriptorSets");
114 table->CreateFramebuffer = (PFN_vkCreateFramebuffer)gpa(dev, "vkCreateFramebuffer");
115 table->DestroyFramebuffer = (PFN_vkDestroyFramebuffer)gpa(dev, "vkDestroyFramebuffer");
116 table->CreateRenderPass = (PFN_vkCreateRenderPass)gpa(dev, "vkCreateRenderPass");
117 table->DestroyRenderPass = (PFN_vkDestroyRenderPass)gpa(dev, "vkDestroyRenderPass");
118 table->GetRenderAreaGranularity = (PFN_vkGetRenderAreaGranularity)gpa(dev, "vkGetRenderAreaGranularity");
119 table->CreateCommandPool = (PFN_vkCreateCommandPool)gpa(dev, "vkCreateCommandPool");
120 table->DestroyCommandPool = (PFN_vkDestroyCommandPool)gpa(dev, "vkDestroyCommandPool");
121 table->ResetCommandPool = (PFN_vkResetCommandPool)gpa(dev, "vkResetCommandPool");
122 table->AllocateCommandBuffers = (PFN_vkAllocateCommandBuffers)gpa(dev, "vkAllocateCommandBuffers");
123 table->FreeCommandBuffers = (PFN_vkFreeCommandBuffers)gpa(dev, "vkFreeCommandBuffers");
124 table->BeginCommandBuffer = (PFN_vkBeginCommandBuffer)gpa(dev, "vkBeginCommandBuffer");
125 table->EndCommandBuffer = (PFN_vkEndCommandBuffer)gpa(dev, "vkEndCommandBuffer");
126 table->ResetCommandBuffer = (PFN_vkResetCommandBuffer)gpa(dev, "vkResetCommandBuffer");
127 table->CmdBindPipeline = (PFN_vkCmdBindPipeline)gpa(dev, "vkCmdBindPipeline");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700128 table->CmdSetViewport = (PFN_vkCmdSetViewport)gpa(dev, "vkCmdSetViewport");
129 table->CmdSetScissor = (PFN_vkCmdSetScissor)gpa(dev, "vkCmdSetScissor");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700130 table->CmdSetLineWidth = (PFN_vkCmdSetLineWidth)gpa(dev, "vkCmdSetLineWidth");
131 table->CmdSetDepthBias = (PFN_vkCmdSetDepthBias)gpa(dev, "vkCmdSetDepthBias");
132 table->CmdSetBlendConstants = (PFN_vkCmdSetBlendConstants)gpa(dev, "vkCmdSetBlendConstants");
133 table->CmdSetDepthBounds = (PFN_vkCmdSetDepthBounds)gpa(dev, "vkCmdSetDepthBounds");
134 table->CmdSetStencilCompareMask = (PFN_vkCmdSetStencilCompareMask)gpa(dev, "vkCmdSetStencilCompareMask");
135 table->CmdSetStencilWriteMask = (PFN_vkCmdSetStencilWriteMask)gpa(dev, "vkCmdSetStencilWriteMask");
136 table->CmdSetStencilReference = (PFN_vkCmdSetStencilReference)gpa(dev, "vkCmdSetStencilReference");
137 table->CmdBindDescriptorSets = (PFN_vkCmdBindDescriptorSets)gpa(dev, "vkCmdBindDescriptorSets");
138 table->CmdBindVertexBuffers = (PFN_vkCmdBindVertexBuffers)gpa(dev, "vkCmdBindVertexBuffers");
139 table->CmdBindIndexBuffer = (PFN_vkCmdBindIndexBuffer)gpa(dev, "vkCmdBindIndexBuffer");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700140 table->CmdDraw = (PFN_vkCmdDraw)gpa(dev, "vkCmdDraw");
141 table->CmdDrawIndexed = (PFN_vkCmdDrawIndexed)gpa(dev, "vkCmdDrawIndexed");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700142 table->CmdDrawIndirect = (PFN_vkCmdDrawIndirect)gpa(dev, "vkCmdDrawIndirect");
143 table->CmdDrawIndexedIndirect = (PFN_vkCmdDrawIndexedIndirect)gpa(dev, "vkCmdDrawIndexedIndirect");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700144 table->CmdDispatch = (PFN_vkCmdDispatch)gpa(dev, "vkCmdDispatch");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700145 table->CmdDispatchIndirect = (PFN_vkCmdDispatchIndirect)gpa(dev, "vkCmdDispatchIndirect");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700146 table->CmdCopyBuffer = (PFN_vkCmdCopyBuffer)gpa(dev, "vkCmdCopyBuffer");
147 table->CmdCopyImage = (PFN_vkCmdCopyImage)gpa(dev, "vkCmdCopyImage");
148 table->CmdBlitImage = (PFN_vkCmdBlitImage)gpa(dev, "vkCmdBlitImage");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700149 table->CmdCopyBufferToImage = (PFN_vkCmdCopyBufferToImage)gpa(dev, "vkCmdCopyBufferToImage");
150 table->CmdCopyImageToBuffer = (PFN_vkCmdCopyImageToBuffer)gpa(dev, "vkCmdCopyImageToBuffer");
151 table->CmdUpdateBuffer = (PFN_vkCmdUpdateBuffer)gpa(dev, "vkCmdUpdateBuffer");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700152 table->CmdFillBuffer = (PFN_vkCmdFillBuffer)gpa(dev, "vkCmdFillBuffer");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700153 table->CmdClearColorImage = (PFN_vkCmdClearColorImage)gpa(dev, "vkCmdClearColorImage");
154 table->CmdClearDepthStencilImage = (PFN_vkCmdClearDepthStencilImage)gpa(dev, "vkCmdClearDepthStencilImage");
155 table->CmdClearAttachments = (PFN_vkCmdClearAttachments)gpa(dev, "vkCmdClearAttachments");
156 table->CmdResolveImage = (PFN_vkCmdResolveImage)gpa(dev, "vkCmdResolveImage");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700157 table->CmdSetEvent = (PFN_vkCmdSetEvent)gpa(dev, "vkCmdSetEvent");
158 table->CmdResetEvent = (PFN_vkCmdResetEvent)gpa(dev, "vkCmdResetEvent");
159 table->CmdWaitEvents = (PFN_vkCmdWaitEvents)gpa(dev, "vkCmdWaitEvents");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700160 table->CmdPipelineBarrier = (PFN_vkCmdPipelineBarrier)gpa(dev, "vkCmdPipelineBarrier");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700161 table->CmdBeginQuery = (PFN_vkCmdBeginQuery)gpa(dev, "vkCmdBeginQuery");
162 table->CmdEndQuery = (PFN_vkCmdEndQuery)gpa(dev, "vkCmdEndQuery");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700163 table->CmdResetQueryPool = (PFN_vkCmdResetQueryPool)gpa(dev, "vkCmdResetQueryPool");
164 table->CmdWriteTimestamp = (PFN_vkCmdWriteTimestamp)gpa(dev, "vkCmdWriteTimestamp");
165 table->CmdCopyQueryPoolResults = (PFN_vkCmdCopyQueryPoolResults)gpa(dev, "vkCmdCopyQueryPoolResults");
166 table->CmdPushConstants = (PFN_vkCmdPushConstants)gpa(dev, "vkCmdPushConstants");
167 table->CmdBeginRenderPass = (PFN_vkCmdBeginRenderPass)gpa(dev, "vkCmdBeginRenderPass");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700168 table->CmdNextSubpass = (PFN_vkCmdNextSubpass)gpa(dev, "vkCmdNextSubpass");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700169 table->CmdEndRenderPass = (PFN_vkCmdEndRenderPass)gpa(dev, "vkCmdEndRenderPass");
170 table->CmdExecuteCommands = (PFN_vkCmdExecuteCommands)gpa(dev, "vkCmdExecuteCommands");
Jon Ashburn232e3af2015-11-30 17:21:25 -0700171}
172
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700173static inline void loader_init_device_extension_dispatch_table(struct loader_dev_dispatch_table *dev_table,
174 PFN_vkGetDeviceProcAddr gpa, VkDevice dev) {
Jon Ashburn232e3af2015-11-30 17:21:25 -0700175 VkLayerDispatchTable *table = &dev_table->core_dispatch;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700176 table->AcquireNextImageKHR = (PFN_vkAcquireNextImageKHR)gpa(dev, "vkAcquireNextImageKHR");
177 table->CreateSwapchainKHR = (PFN_vkCreateSwapchainKHR)gpa(dev, "vkCreateSwapchainKHR");
178 table->DestroySwapchainKHR = (PFN_vkDestroySwapchainKHR)gpa(dev, "vkDestroySwapchainKHR");
179 table->GetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR)gpa(dev, "vkGetSwapchainImagesKHR");
180 table->QueuePresentKHR = (PFN_vkQueuePresentKHR)gpa(dev, "vkQueuePresentKHR");
Mark Young39389872017-01-19 21:10:49 -0700181
182 // KHR_display_swapchain
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700183 table->CreateSharedSwapchainsKHR = (PFN_vkCreateSharedSwapchainsKHR)gpa(dev, "vkCreateSharedSwapchainsKHR");
Mark Young39389872017-01-19 21:10:49 -0700184
185 // KHR_maintenance1
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700186 table->TrimCommandPoolKHR = (PFN_vkTrimCommandPoolKHR)gpa(dev, "vkTrimCommandPoolKHR");
Mark Young39389872017-01-19 21:10:49 -0700187
188 // EXT_display_control
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700189 table->DisplayPowerControlEXT = (PFN_vkDisplayPowerControlEXT)gpa(dev, "vkDisplayPowerControlEXT");
190 table->RegisterDeviceEventEXT = (PFN_vkRegisterDeviceEventEXT)gpa(dev, "vkRegisterDeviceEventEXT");
191 table->RegisterDisplayEventEXT = (PFN_vkRegisterDisplayEventEXT)gpa(dev, "vkRegisterDisplayEventEXT");
192 table->GetSwapchainCounterEXT = (PFN_vkGetSwapchainCounterEXT)gpa(dev, "vkGetSwapchainCounterEXT");
Mark Young39389872017-01-19 21:10:49 -0700193
194 // EXT_debug_marker
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700195 table->DebugMarkerSetObjectTagEXT = (PFN_vkDebugMarkerSetObjectTagEXT)gpa(dev, "vkDebugMarkerSetObjectTagEXT");
196 table->DebugMarkerSetObjectNameEXT = (PFN_vkDebugMarkerSetObjectNameEXT)gpa(dev, "vkDebugMarkerSetObjectNameEXT");
197 table->CmdDebugMarkerBeginEXT = (PFN_vkCmdDebugMarkerBeginEXT)gpa(dev, "vkCmdDebugMarkerBeginEXT");
198 table->CmdDebugMarkerEndEXT = (PFN_vkCmdDebugMarkerEndEXT)gpa(dev, "vkCmdDebugMarkerEndEXT");
199 table->CmdDebugMarkerInsertEXT = (PFN_vkCmdDebugMarkerInsertEXT)gpa(dev, "vkCmdDebugMarkerInsertEXT");
Mark Youngfa552782016-12-12 16:14:55 -0700200
Mark Young39389872017-01-19 21:10:49 -0700201 // AMD_draw_indirect_count
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700202 table->CmdDrawIndirectCountAMD = (PFN_vkCmdDrawIndirectCountAMD)gpa(dev, "vkCmdDrawIndirectCountAMD");
203 table->CmdDrawIndexedIndirectCountAMD = (PFN_vkCmdDrawIndexedIndirectCountAMD)gpa(dev, "vkCmdDrawIndexedIndirectCountAMD");
Mark Young39389872017-01-19 21:10:49 -0700204
205#ifdef VK_USE_PLATFORM_WIN32_KHR
206 // NV_external_memory_win32
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700207 table->GetMemoryWin32HandleNV = (PFN_vkGetMemoryWin32HandleNV)gpa(dev, "vkGetMemoryWin32HandleNV");
Mark Young39389872017-01-19 21:10:49 -0700208#endif
209
Mark Youngfa552782016-12-12 16:14:55 -0700210 // NVX_device_generated_commands
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700211 table->CmdProcessCommandsNVX = (PFN_vkCmdProcessCommandsNVX)gpa(dev, "vkCmdProcessCommandsNVX");
212 table->CmdReserveSpaceForCommandsNVX = (PFN_vkCmdReserveSpaceForCommandsNVX)gpa(dev, "vkCmdReserveSpaceForCommandsNVX");
213 table->CreateIndirectCommandsLayoutNVX = (PFN_vkCreateIndirectCommandsLayoutNVX)gpa(dev, "vkCreateIndirectCommandsLayoutNVX");
Mark Youngfa552782016-12-12 16:14:55 -0700214 table->DestroyIndirectCommandsLayoutNVX =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700215 (PFN_vkDestroyIndirectCommandsLayoutNVX)gpa(dev, "vkDestroyIndirectCommandsLayoutNVX");
216 table->CreateObjectTableNVX = (PFN_vkCreateObjectTableNVX)gpa(dev, "vkCreateObjectTableNVX");
217 table->DestroyObjectTableNVX = (PFN_vkDestroyObjectTableNVX)gpa(dev, "vkDestroyObjectTableNVX");
218 table->RegisterObjectsNVX = (PFN_vkRegisterObjectsNVX)gpa(dev, "vkRegisterObjectsNVX");
219 table->UnregisterObjectsNVX = (PFN_vkUnregisterObjectsNVX)gpa(dev, "vkUnregisterObjectsNVX");
Jon Ashburnd55a3942015-05-06 09:02:10 -0600220}
221
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700222static inline void *loader_lookup_device_dispatch_table(const VkLayerDispatchTable *table, const char *name) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700223 if (!name || name[0] != 'v' || name[1] != 'k') return NULL;
Jon Ashburnd55a3942015-05-06 09:02:10 -0600224
225 name += 2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700226 if (!strcmp(name, "GetDeviceProcAddr")) return (void *)table->GetDeviceProcAddr;
227 if (!strcmp(name, "DestroyDevice")) return (void *)table->DestroyDevice;
228 if (!strcmp(name, "GetDeviceQueue")) return (void *)table->GetDeviceQueue;
229 if (!strcmp(name, "QueueSubmit")) return (void *)table->QueueSubmit;
230 if (!strcmp(name, "QueueWaitIdle")) return (void *)table->QueueWaitIdle;
231 if (!strcmp(name, "DeviceWaitIdle")) return (void *)table->DeviceWaitIdle;
232 if (!strcmp(name, "AllocateMemory")) return (void *)table->AllocateMemory;
233 if (!strcmp(name, "FreeMemory")) return (void *)table->FreeMemory;
234 if (!strcmp(name, "MapMemory")) return (void *)table->MapMemory;
235 if (!strcmp(name, "UnmapMemory")) return (void *)table->UnmapMemory;
236 if (!strcmp(name, "FlushMappedMemoryRanges")) return (void *)table->FlushMappedMemoryRanges;
237 if (!strcmp(name, "InvalidateMappedMemoryRanges")) return (void *)table->InvalidateMappedMemoryRanges;
238 if (!strcmp(name, "GetDeviceMemoryCommitment")) return (void *)table->GetDeviceMemoryCommitment;
239 if (!strcmp(name, "GetImageSparseMemoryRequirements")) return (void *)table->GetImageSparseMemoryRequirements;
240 if (!strcmp(name, "GetBufferMemoryRequirements")) return (void *)table->GetBufferMemoryRequirements;
241 if (!strcmp(name, "GetImageMemoryRequirements")) return (void *)table->GetImageMemoryRequirements;
242 if (!strcmp(name, "BindBufferMemory")) return (void *)table->BindBufferMemory;
243 if (!strcmp(name, "BindImageMemory")) return (void *)table->BindImageMemory;
244 if (!strcmp(name, "QueueBindSparse")) return (void *)table->QueueBindSparse;
245 if (!strcmp(name, "CreateFence")) return (void *)table->CreateFence;
246 if (!strcmp(name, "DestroyFence")) return (void *)table->DestroyFence;
247 if (!strcmp(name, "ResetFences")) return (void *)table->ResetFences;
248 if (!strcmp(name, "GetFenceStatus")) return (void *)table->GetFenceStatus;
249 if (!strcmp(name, "WaitForFences")) return (void *)table->WaitForFences;
250 if (!strcmp(name, "CreateSemaphore")) return (void *)table->CreateSemaphore;
251 if (!strcmp(name, "DestroySemaphore")) return (void *)table->DestroySemaphore;
252 if (!strcmp(name, "CreateEvent")) return (void *)table->CreateEvent;
253 if (!strcmp(name, "DestroyEvent")) return (void *)table->DestroyEvent;
254 if (!strcmp(name, "GetEventStatus")) return (void *)table->GetEventStatus;
255 if (!strcmp(name, "SetEvent")) return (void *)table->SetEvent;
256 if (!strcmp(name, "ResetEvent")) return (void *)table->ResetEvent;
257 if (!strcmp(name, "CreateQueryPool")) return (void *)table->CreateQueryPool;
258 if (!strcmp(name, "DestroyQueryPool")) return (void *)table->DestroyQueryPool;
259 if (!strcmp(name, "GetQueryPoolResults")) return (void *)table->GetQueryPoolResults;
260 if (!strcmp(name, "CreateBuffer")) return (void *)table->CreateBuffer;
261 if (!strcmp(name, "DestroyBuffer")) return (void *)table->DestroyBuffer;
262 if (!strcmp(name, "CreateBufferView")) return (void *)table->CreateBufferView;
263 if (!strcmp(name, "DestroyBufferView")) return (void *)table->DestroyBufferView;
264 if (!strcmp(name, "CreateImage")) return (void *)table->CreateImage;
265 if (!strcmp(name, "DestroyImage")) return (void *)table->DestroyImage;
266 if (!strcmp(name, "GetImageSubresourceLayout")) return (void *)table->GetImageSubresourceLayout;
267 if (!strcmp(name, "CreateImageView")) return (void *)table->CreateImageView;
268 if (!strcmp(name, "DestroyImageView")) return (void *)table->DestroyImageView;
269 if (!strcmp(name, "CreateShaderModule")) return (void *)table->CreateShaderModule;
270 if (!strcmp(name, "DestroyShaderModule")) return (void *)table->DestroyShaderModule;
271 if (!strcmp(name, "CreatePipelineCache")) return (void *)vkCreatePipelineCache;
272 if (!strcmp(name, "DestroyPipelineCache")) return (void *)vkDestroyPipelineCache;
273 if (!strcmp(name, "GetPipelineCacheData")) return (void *)vkGetPipelineCacheData;
274 if (!strcmp(name, "MergePipelineCaches")) return (void *)vkMergePipelineCaches;
275 if (!strcmp(name, "CreateGraphicsPipelines")) return (void *)vkCreateGraphicsPipelines;
276 if (!strcmp(name, "CreateComputePipelines")) return (void *)vkCreateComputePipelines;
277 if (!strcmp(name, "DestroyPipeline")) return (void *)table->DestroyPipeline;
278 if (!strcmp(name, "CreatePipelineLayout")) return (void *)table->CreatePipelineLayout;
279 if (!strcmp(name, "DestroyPipelineLayout")) return (void *)table->DestroyPipelineLayout;
280 if (!strcmp(name, "CreateSampler")) return (void *)table->CreateSampler;
281 if (!strcmp(name, "DestroySampler")) return (void *)table->DestroySampler;
282 if (!strcmp(name, "CreateDescriptorSetLayout")) return (void *)table->CreateDescriptorSetLayout;
283 if (!strcmp(name, "DestroyDescriptorSetLayout")) return (void *)table->DestroyDescriptorSetLayout;
284 if (!strcmp(name, "CreateDescriptorPool")) return (void *)table->CreateDescriptorPool;
285 if (!strcmp(name, "DestroyDescriptorPool")) return (void *)table->DestroyDescriptorPool;
286 if (!strcmp(name, "ResetDescriptorPool")) return (void *)table->ResetDescriptorPool;
287 if (!strcmp(name, "AllocateDescriptorSets")) return (void *)table->AllocateDescriptorSets;
288 if (!strcmp(name, "FreeDescriptorSets")) return (void *)table->FreeDescriptorSets;
289 if (!strcmp(name, "UpdateDescriptorSets")) return (void *)table->UpdateDescriptorSets;
290 if (!strcmp(name, "CreateFramebuffer")) return (void *)table->CreateFramebuffer;
291 if (!strcmp(name, "DestroyFramebuffer")) return (void *)table->DestroyFramebuffer;
292 if (!strcmp(name, "CreateRenderPass")) return (void *)table->CreateRenderPass;
293 if (!strcmp(name, "DestroyRenderPass")) return (void *)table->DestroyRenderPass;
294 if (!strcmp(name, "GetRenderAreaGranularity")) return (void *)table->GetRenderAreaGranularity;
295 if (!strcmp(name, "CreateCommandPool")) return (void *)table->CreateCommandPool;
296 if (!strcmp(name, "DestroyCommandPool")) return (void *)table->DestroyCommandPool;
297 if (!strcmp(name, "ResetCommandPool")) return (void *)table->ResetCommandPool;
298 if (!strcmp(name, "AllocateCommandBuffers")) return (void *)table->AllocateCommandBuffers;
299 if (!strcmp(name, "FreeCommandBuffers")) return (void *)table->FreeCommandBuffers;
300 if (!strcmp(name, "BeginCommandBuffer")) return (void *)table->BeginCommandBuffer;
301 if (!strcmp(name, "EndCommandBuffer")) return (void *)table->EndCommandBuffer;
302 if (!strcmp(name, "ResetCommandBuffer")) return (void *)table->ResetCommandBuffer;
303 if (!strcmp(name, "CmdBindPipeline")) return (void *)table->CmdBindPipeline;
304 if (!strcmp(name, "CmdSetViewport")) return (void *)table->CmdSetViewport;
305 if (!strcmp(name, "CmdSetScissor")) return (void *)table->CmdSetScissor;
306 if (!strcmp(name, "CmdSetLineWidth")) return (void *)table->CmdSetLineWidth;
307 if (!strcmp(name, "CmdSetDepthBias")) return (void *)table->CmdSetDepthBias;
308 if (!strcmp(name, "CmdSetBlendConstants")) return (void *)table->CmdSetBlendConstants;
309 if (!strcmp(name, "CmdSetDepthBounds")) return (void *)table->CmdSetDepthBounds;
310 if (!strcmp(name, "CmdSetStencilCompareMask")) return (void *)table->CmdSetStencilCompareMask;
311 if (!strcmp(name, "CmdSetStencilwriteMask")) return (void *)table->CmdSetStencilWriteMask;
312 if (!strcmp(name, "CmdSetStencilReference")) return (void *)table->CmdSetStencilReference;
313 if (!strcmp(name, "CmdBindDescriptorSets")) return (void *)table->CmdBindDescriptorSets;
314 if (!strcmp(name, "CmdBindVertexBuffers")) return (void *)table->CmdBindVertexBuffers;
315 if (!strcmp(name, "CmdBindIndexBuffer")) return (void *)table->CmdBindIndexBuffer;
316 if (!strcmp(name, "CmdDraw")) return (void *)table->CmdDraw;
317 if (!strcmp(name, "CmdDrawIndexed")) return (void *)table->CmdDrawIndexed;
318 if (!strcmp(name, "CmdDrawIndirect")) return (void *)table->CmdDrawIndirect;
319 if (!strcmp(name, "CmdDrawIndexedIndirect")) return (void *)table->CmdDrawIndexedIndirect;
320 if (!strcmp(name, "CmdDispatch")) return (void *)table->CmdDispatch;
321 if (!strcmp(name, "CmdDispatchIndirect")) return (void *)table->CmdDispatchIndirect;
322 if (!strcmp(name, "CmdCopyBuffer")) return (void *)table->CmdCopyBuffer;
323 if (!strcmp(name, "CmdCopyImage")) return (void *)table->CmdCopyImage;
324 if (!strcmp(name, "CmdBlitImage")) return (void *)table->CmdBlitImage;
325 if (!strcmp(name, "CmdCopyBufferToImage")) return (void *)table->CmdCopyBufferToImage;
326 if (!strcmp(name, "CmdCopyImageToBuffer")) return (void *)table->CmdCopyImageToBuffer;
327 if (!strcmp(name, "CmdUpdateBuffer")) return (void *)table->CmdUpdateBuffer;
328 if (!strcmp(name, "CmdFillBuffer")) return (void *)table->CmdFillBuffer;
329 if (!strcmp(name, "CmdClearColorImage")) return (void *)table->CmdClearColorImage;
330 if (!strcmp(name, "CmdClearDepthStencilImage")) return (void *)table->CmdClearDepthStencilImage;
331 if (!strcmp(name, "CmdClearAttachments")) return (void *)table->CmdClearAttachments;
332 if (!strcmp(name, "CmdResolveImage")) return (void *)table->CmdResolveImage;
333 if (!strcmp(name, "CmdSetEvent")) return (void *)table->CmdSetEvent;
334 if (!strcmp(name, "CmdResetEvent")) return (void *)table->CmdResetEvent;
335 if (!strcmp(name, "CmdWaitEvents")) return (void *)table->CmdWaitEvents;
336 if (!strcmp(name, "CmdPipelineBarrier")) return (void *)table->CmdPipelineBarrier;
337 if (!strcmp(name, "CmdBeginQuery")) return (void *)table->CmdBeginQuery;
338 if (!strcmp(name, "CmdEndQuery")) return (void *)table->CmdEndQuery;
339 if (!strcmp(name, "CmdResetQueryPool")) return (void *)table->CmdResetQueryPool;
340 if (!strcmp(name, "CmdWriteTimestamp")) return (void *)table->CmdWriteTimestamp;
341 if (!strcmp(name, "CmdCopyQueryPoolResults")) return (void *)table->CmdCopyQueryPoolResults;
342 if (!strcmp(name, "CmdPushConstants")) return (void *)table->CmdPushConstants;
343 if (!strcmp(name, "CmdBeginRenderPass")) return (void *)table->CmdBeginRenderPass;
344 if (!strcmp(name, "CmdNextSubpass")) return (void *)table->CmdNextSubpass;
345 if (!strcmp(name, "CmdEndRenderPass")) return (void *)table->CmdEndRenderPass;
346 if (!strcmp(name, "CmdExecuteCommands")) return (void *)table->CmdExecuteCommands;
347 if (!strcmp(name, "DestroySwapchainKHR")) return (void *)table->DestroySwapchainKHR;
348 if (!strcmp(name, "GetSwapchainImagesKHR")) return (void *)table->GetSwapchainImagesKHR;
349 if (!strcmp(name, "AcquireNextImageKHR")) return (void *)table->AcquireNextImageKHR;
350 if (!strcmp(name, "QueuePresentKHR")) return (void *)table->QueuePresentKHR;
Mark Young16573c72016-06-28 10:52:43 -0600351
Mark Young65cb3662016-11-07 13:27:02 -0700352 // NOTE: Device Funcs needing Trampoline/Terminator.
353 // Overrides for device functions needing a trampoline and
354 // a terminator because certain device entry-points still need to go
355 // through a terminator before hitting the ICD. This could be for
356 // several reasons, but the main one is currently unwrapping an
357 // object before passing the appropriate info along to the ICD.
358 if (!strcmp(name, "CreateSwapchainKHR")) {
359 return (void *)vkCreateSwapchainKHR;
Mark Young39389872017-01-19 21:10:49 -0700360 } else if (!strcmp(name, "CreateSharedSwapchainsKHR")) {
361 return (void *)vkCreateSharedSwapchainsKHR;
Mark Young65cb3662016-11-07 13:27:02 -0700362 } else if (!strcmp(name, "DebugMarkerSetObjectTagEXT")) {
363 return (void *)vkDebugMarkerSetObjectTagEXT;
364 } else if (!strcmp(name, "DebugMarkerSetObjectNameEXT")) {
365 return (void *)vkDebugMarkerSetObjectNameEXT;
366 }
367
Jon Ashburnd55a3942015-05-06 09:02:10 -0600368 return NULL;
369}
Jon Ashburnfbb4e252015-05-04 16:27:53 -0600370
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700371static inline void loader_init_instance_core_dispatch_table(VkLayerInstanceDispatchTable *table, PFN_vkGetInstanceProcAddr gpa,
372 VkInstance inst) {
373 table->GetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)gpa(inst, "vkGetInstanceProcAddr");
374 table->DestroyInstance = (PFN_vkDestroyInstance)gpa(inst, "vkDestroyInstance");
375 table->EnumeratePhysicalDevices = (PFN_vkEnumeratePhysicalDevices)gpa(inst, "vkEnumeratePhysicalDevices");
376 table->GetPhysicalDeviceFeatures = (PFN_vkGetPhysicalDeviceFeatures)gpa(inst, "vkGetPhysicalDeviceFeatures");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700377 table->GetPhysicalDeviceImageFormatProperties =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700378 (PFN_vkGetPhysicalDeviceImageFormatProperties)gpa(inst, "vkGetPhysicalDeviceImageFormatProperties");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700379 table->GetPhysicalDeviceFormatProperties =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700380 (PFN_vkGetPhysicalDeviceFormatProperties)gpa(inst, "vkGetPhysicalDeviceFormatProperties");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700381 table->GetPhysicalDeviceSparseImageFormatProperties =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700382 (PFN_vkGetPhysicalDeviceSparseImageFormatProperties)gpa(inst, "vkGetPhysicalDeviceSparseImageFormatProperties");
383 table->GetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties)gpa(inst, "vkGetPhysicalDeviceProperties");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700384 table->GetPhysicalDeviceQueueFamilyProperties =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700385 (PFN_vkGetPhysicalDeviceQueueFamilyProperties)gpa(inst, "vkGetPhysicalDeviceQueueFamilyProperties");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700386 table->GetPhysicalDeviceMemoryProperties =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700387 (PFN_vkGetPhysicalDeviceMemoryProperties)gpa(inst, "vkGetPhysicalDeviceMemoryProperties");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700388 table->EnumerateDeviceExtensionProperties =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700389 (PFN_vkEnumerateDeviceExtensionProperties)gpa(inst, "vkEnumerateDeviceExtensionProperties");
390 table->EnumerateDeviceLayerProperties = (PFN_vkEnumerateDeviceLayerProperties)gpa(inst, "vkEnumerateDeviceLayerProperties");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600391}
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600392
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700393static inline void loader_init_instance_extension_dispatch_table(VkLayerInstanceDispatchTable *table, PFN_vkGetInstanceProcAddr gpa,
394 VkInstance inst) {
Mark Young39389872017-01-19 21:10:49 -0700395 // WSI extensions
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700396 table->DestroySurfaceKHR = (PFN_vkDestroySurfaceKHR)gpa(inst, "vkDestroySurfaceKHR");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700397 table->GetPhysicalDeviceSurfaceSupportKHR =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700398 (PFN_vkGetPhysicalDeviceSurfaceSupportKHR)gpa(inst, "vkGetPhysicalDeviceSurfaceSupportKHR");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700399 table->GetPhysicalDeviceSurfaceCapabilitiesKHR =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700400 (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)gpa(inst, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700401 table->GetPhysicalDeviceSurfaceFormatsKHR =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700402 (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)gpa(inst, "vkGetPhysicalDeviceSurfaceFormatsKHR");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700403 table->GetPhysicalDeviceSurfacePresentModesKHR =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700404 (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)gpa(inst, "vkGetPhysicalDeviceSurfacePresentModesKHR");
Ian Elliottdb4300a2015-11-23 10:17:23 -0700405#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700406 table->CreateMirSurfaceKHR = (PFN_vkCreateMirSurfaceKHR)gpa(inst, "vkCreateMirSurfaceKHR");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700407 table->GetPhysicalDeviceMirPresentationSupportKHR =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700408 (PFN_vkGetPhysicalDeviceMirPresentationSupportKHR)gpa(inst, "vkGetPhysicalDeviceMirPresentationSupportKHR");
Ian Elliottdb4300a2015-11-23 10:17:23 -0700409#endif
410#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700411 table->CreateWaylandSurfaceKHR = (PFN_vkCreateWaylandSurfaceKHR)gpa(inst, "vkCreateWaylandSurfaceKHR");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700412 table->GetPhysicalDeviceWaylandPresentationSupportKHR =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700413 (PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)gpa(inst, "vkGetPhysicalDeviceWaylandPresentationSupportKHR");
Ian Elliottdb4300a2015-11-23 10:17:23 -0700414#endif
415#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700416 table->CreateWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR)gpa(inst, "vkCreateWin32SurfaceKHR");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700417 table->GetPhysicalDeviceWin32PresentationSupportKHR =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700418 (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)gpa(inst, "vkGetPhysicalDeviceWin32PresentationSupportKHR");
Ian Elliottdb4300a2015-11-23 10:17:23 -0700419#endif
420#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700421 table->CreateXcbSurfaceKHR = (PFN_vkCreateXcbSurfaceKHR)gpa(inst, "vkCreateXcbSurfaceKHR");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700422 table->GetPhysicalDeviceXcbPresentationSupportKHR =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700423 (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)gpa(inst, "vkGetPhysicalDeviceXcbPresentationSupportKHR");
Ian Elliottdb4300a2015-11-23 10:17:23 -0700424#endif
425#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700426 table->CreateXlibSurfaceKHR = (PFN_vkCreateXlibSurfaceKHR)gpa(inst, "vkCreateXlibSurfaceKHR");
Jon Ashburn23d36b12016-02-02 17:47:28 -0700427 table->GetPhysicalDeviceXlibPresentationSupportKHR =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700428 (PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)gpa(inst, "vkGetPhysicalDeviceXlibPresentationSupportKHR");
Ian Elliottdb4300a2015-11-23 10:17:23 -0700429#endif
Jon Ashburnc7d3e732016-03-08 09:30:30 -0700430 table->GetPhysicalDeviceDisplayPropertiesKHR =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700431 (PFN_vkGetPhysicalDeviceDisplayPropertiesKHR)gpa(inst, "vkGetPhysicalDeviceDisplayPropertiesKHR");
Jon Ashburnc7d3e732016-03-08 09:30:30 -0700432 table->GetPhysicalDeviceDisplayPlanePropertiesKHR =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700433 (PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)gpa(inst, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR");
Jon Ashburnc7d3e732016-03-08 09:30:30 -0700434 table->GetDisplayPlaneSupportedDisplaysKHR =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700435 (PFN_vkGetDisplayPlaneSupportedDisplaysKHR)gpa(inst, "vkGetDisplayPlaneSupportedDisplaysKHR");
436 table->GetDisplayModePropertiesKHR = (PFN_vkGetDisplayModePropertiesKHR)gpa(inst, "vkGetDisplayModePropertiesKHR");
437 table->CreateDisplayModeKHR = (PFN_vkCreateDisplayModeKHR)gpa(inst, "vkCreateDisplayModeKHR");
438 table->GetDisplayPlaneCapabilitiesKHR = (PFN_vkGetDisplayPlaneCapabilitiesKHR)gpa(inst, "vkGetDisplayPlaneCapabilitiesKHR");
439 table->CreateDisplayPlaneSurfaceKHR = (PFN_vkCreateDisplayPlaneSurfaceKHR)gpa(inst, "vkCreateDisplayPlaneSurfaceKHR");
Mark Youngfa552782016-12-12 16:14:55 -0700440
Mark Young39389872017-01-19 21:10:49 -0700441 // KHR_get_physical_device_properties2
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700442 table->GetPhysicalDeviceFeatures2KHR = (PFN_vkGetPhysicalDeviceFeatures2KHR)gpa(inst, "vkGetPhysicalDeviceFeatures2KHR");
443 table->GetPhysicalDeviceProperties2KHR = (PFN_vkGetPhysicalDeviceProperties2KHR)gpa(inst, "vkGetPhysicalDeviceProperties2KHR");
Mark Young39389872017-01-19 21:10:49 -0700444 table->GetPhysicalDeviceFormatProperties2KHR =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700445 (PFN_vkGetPhysicalDeviceFormatProperties2KHR)gpa(inst, "vkGetPhysicalDeviceFormatProperties2KHR");
Mark Young39389872017-01-19 21:10:49 -0700446 table->GetPhysicalDeviceImageFormatProperties2KHR =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700447 (PFN_vkGetPhysicalDeviceImageFormatProperties2KHR)gpa(inst, "vkGetPhysicalDeviceImageFormatProperties2KHR");
Mark Young39389872017-01-19 21:10:49 -0700448 table->GetPhysicalDeviceQueueFamilyProperties2KHR =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700449 (PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR)gpa(inst, "vkGetPhysicalDeviceQueueFamilyProperties2KHR");
Mark Young39389872017-01-19 21:10:49 -0700450 table->GetPhysicalDeviceMemoryProperties2KHR =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700451 (PFN_vkGetPhysicalDeviceMemoryProperties2KHR)gpa(inst, "vkGetPhysicalDeviceMemoryProperties2KHR");
Mark Young39389872017-01-19 21:10:49 -0700452 table->GetPhysicalDeviceSparseImageFormatProperties2KHR =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700453 (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR)gpa(inst, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR");
Mark Young39389872017-01-19 21:10:49 -0700454
455#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
456 // EXT_acquire_xlib_display
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700457 table->AcquireXlibDisplayEXT = (PFN_vkAcquireXlibDisplayEXT)gpa(inst, "vkAcquireXlibDisplayEXT");
458 table->GetRandROutputDisplayEXT = (PFN_vkGetRandROutputDisplayEXT)gpa(inst, "vkGetRandROutputDisplayEXT");
Mark Young39389872017-01-19 21:10:49 -0700459#endif
460
461 // EXT_debug_report
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700462 table->CreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)gpa(inst, "vkCreateDebugReportCallbackEXT");
463 table->DestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)gpa(inst, "vkDestroyDebugReportCallbackEXT");
464 table->DebugReportMessageEXT = (PFN_vkDebugReportMessageEXT)gpa(inst, "vkDebugReportMessageEXT");
Mark Young39389872017-01-19 21:10:49 -0700465
466 // EXT_direct_mode_display
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700467 table->ReleaseDisplayEXT = (PFN_vkReleaseDisplayEXT)gpa(inst, "vkReleaseDisplayEXT");
Mark Young39389872017-01-19 21:10:49 -0700468
469 // EXT_display_surface_counter
470 table->GetPhysicalDeviceSurfaceCapabilities2EXT =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700471 (PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT)gpa(inst, "vkGetPhysicalDeviceSurfaceCapabilities2EXT");
Mark Young39389872017-01-19 21:10:49 -0700472
473 // NV_external_memory_capabilities
474 table->GetPhysicalDeviceExternalImageFormatPropertiesNV =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700475 (PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV)gpa(inst, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV");
Mark Young39389872017-01-19 21:10:49 -0700476
477 // NVX_device_generated_commands (physical device command)
Mark Youngfa552782016-12-12 16:14:55 -0700478 table->GetPhysicalDeviceGeneratedCommandsPropertiesNVX =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700479 (PFN_vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX)gpa(inst, "vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX");
Jon Ashburnfbb4e252015-05-04 16:27:53 -0600480}
Jon Ashburn27cd5842015-05-12 17:26:48 -0600481
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700482static inline void *loader_lookup_instance_extension_dispatch_table(const VkLayerInstanceDispatchTable *table, const char *name,
483 bool *found_name) {
Mark Young39389872017-01-19 21:10:49 -0700484 *found_name = true;
485
486 // KHR_get_physical_device_properties2
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700487 if (!strcmp(name, "GetPhysicalDeviceFeatures2KHR")) return (void *)table->GetPhysicalDeviceFeatures2KHR;
488 if (!strcmp(name, "GetPhysicalDeviceProperties2KHR")) return (void *)table->GetPhysicalDeviceProperties2KHR;
489 if (!strcmp(name, "GetPhysicalDeviceFormatProperties2KHR")) return (void *)table->GetPhysicalDeviceFormatProperties2KHR;
Mark Young39389872017-01-19 21:10:49 -0700490 if (!strcmp(name, "GetPhysicalDeviceImageFormatProperties2KHR"))
491 return (void *)table->GetPhysicalDeviceImageFormatProperties2KHR;
492 if (!strcmp(name, "GetPhysicalDeviceQueueFamilyProperties2KHR"))
493 return (void *)table->GetPhysicalDeviceQueueFamilyProperties2KHR;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700494 if (!strcmp(name, "GetPhysicalDeviceMemoryProperties2KHR")) return (void *)table->GetPhysicalDeviceMemoryProperties2KHR;
Mark Young39389872017-01-19 21:10:49 -0700495 if (!strcmp(name, "GetPhysicalDeviceSparseImageFormatProperties2KHR"))
496 return (void *)table->GetPhysicalDeviceSparseImageFormatProperties2KHR;
497
498// EXT_acquire_xlib_display
499#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700500 if (!strcmp(name, "AcquireXlibDisplayEXT")) return (void *)table->AcquireXlibDisplayEXT;
501 if (!strcmp(name, "GetRandROutputDisplayEXT")) return (void *)table->GetRandROutputDisplayEXT;
Mark Young39389872017-01-19 21:10:49 -0700502#endif
503
504 // EXT_debug_report
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700505 if (!strcmp(name, "CreateDebugReportCallbackEXT")) return (void *)table->CreateDebugReportCallbackEXT;
506 if (!strcmp(name, "DestroyDebugReportCallbackEXT")) return (void *)table->DestroyDebugReportCallbackEXT;
507 if (!strcmp(name, "DebugReportMessageEXT")) return (void *)table->DebugReportMessageEXT;
Mark Young39389872017-01-19 21:10:49 -0700508
509 // EXT_direct_mode_display
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700510 if (!strcmp(name, "ReleaseDisplayEXT")) return (void *)table->ReleaseDisplayEXT;
Mark Young39389872017-01-19 21:10:49 -0700511
512 // EXT_display_surface_counter
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700513 if (!strcmp(name, "GetPhysicalDeviceSurfaceCapabilities2EXT")) return (void *)table->GetPhysicalDeviceSurfaceCapabilities2EXT;
Mark Young39389872017-01-19 21:10:49 -0700514
515 // NV_external_memory_capabilities
516 if (!strcmp(name, "GetPhysicalDeviceExternalImageFormatPropertiesNV"))
517 return (void *)table->GetPhysicalDeviceExternalImageFormatPropertiesNV;
518
519 // NVX_device_generated_commands
520 if (!strcmp(name, "GetPhysicalDeviceGeneratedCommandsPropertiesNVX"))
521 return (void *)table->GetPhysicalDeviceGeneratedCommandsPropertiesNVX;
522
523 *found_name = false;
524 return NULL;
525}
526
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700527static inline void *loader_lookup_instance_dispatch_table(const VkLayerInstanceDispatchTable *table, const char *name,
528 bool *found_name) {
Jon Ashburnc7d3e732016-03-08 09:30:30 -0700529 if (!name || name[0] != 'v' || name[1] != 'k') {
530 *found_name = false;
Jon Ashburn27cd5842015-05-12 17:26:48 -0600531 return NULL;
Jon Ashburnc7d3e732016-03-08 09:30:30 -0700532 }
Jon Ashburn27cd5842015-05-12 17:26:48 -0600533
Jon Ashburnc7d3e732016-03-08 09:30:30 -0700534 *found_name = true;
Jon Ashburn27cd5842015-05-12 17:26:48 -0600535 name += 2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700536 if (!strcmp(name, "DestroyInstance")) return (void *)table->DestroyInstance;
537 if (!strcmp(name, "EnumeratePhysicalDevices")) return (void *)table->EnumeratePhysicalDevices;
538 if (!strcmp(name, "GetPhysicalDeviceFeatures")) return (void *)table->GetPhysicalDeviceFeatures;
539 if (!strcmp(name, "GetPhysicalDeviceImageFormatProperties")) return (void *)table->GetPhysicalDeviceImageFormatProperties;
540 if (!strcmp(name, "GetPhysicalDeviceFormatProperties")) return (void *)table->GetPhysicalDeviceFormatProperties;
Mark Lobodzinski16e8bef2015-07-03 15:58:09 -0600541 if (!strcmp(name, "GetPhysicalDeviceSparseImageFormatProperties"))
Jon Ashburn23d36b12016-02-02 17:47:28 -0700542 return (void *)table->GetPhysicalDeviceSparseImageFormatProperties;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700543 if (!strcmp(name, "GetPhysicalDeviceProperties")) return (void *)table->GetPhysicalDeviceProperties;
544 if (!strcmp(name, "GetPhysicalDeviceQueueFamilyProperties")) return (void *)table->GetPhysicalDeviceQueueFamilyProperties;
545 if (!strcmp(name, "GetPhysicalDeviceMemoryProperties")) return (void *)table->GetPhysicalDeviceMemoryProperties;
546 if (!strcmp(name, "GetInstanceProcAddr")) return (void *)table->GetInstanceProcAddr;
547 if (!strcmp(name, "EnumerateDeviceExtensionProperties")) return (void *)table->EnumerateDeviceExtensionProperties;
548 if (!strcmp(name, "EnumerateDeviceLayerProperties")) return (void *)table->EnumerateDeviceLayerProperties;
549 if (!strcmp(name, "DestroySurfaceKHR")) return (void *)table->DestroySurfaceKHR;
550 if (!strcmp(name, "GetPhysicalDeviceSurfaceSupportKHR")) return (void *)table->GetPhysicalDeviceSurfaceSupportKHR;
551 if (!strcmp(name, "GetPhysicalDeviceSurfaceCapabilitiesKHR")) return (void *)table->GetPhysicalDeviceSurfaceCapabilitiesKHR;
552 if (!strcmp(name, "GetPhysicalDeviceSurfaceFormatsKHR")) return (void *)table->GetPhysicalDeviceSurfaceFormatsKHR;
553 if (!strcmp(name, "GetPhysicalDeviceSurfacePresentModesKHR")) return (void *)table->GetPhysicalDeviceSurfacePresentModesKHR;
Ian Elliottdb4300a2015-11-23 10:17:23 -0700554#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700555 if (!strcmp(name, "CreateMirSurfaceKHR")) return (void *)table->CreateMirSurfaceKHR;
Ian Elliott919fa302015-11-24 15:39:10 -0700556 if (!strcmp(name, "GetPhysicalDeviceMirPresentationSupportKHR"))
Jon Ashburn23d36b12016-02-02 17:47:28 -0700557 return (void *)table->GetPhysicalDeviceMirPresentationSupportKHR;
Ian Elliottdb4300a2015-11-23 10:17:23 -0700558#endif
559#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700560 if (!strcmp(name, "CreateWaylandSurfaceKHR")) return (void *)table->CreateWaylandSurfaceKHR;
Ian Elliott919fa302015-11-24 15:39:10 -0700561 if (!strcmp(name, "GetPhysicalDeviceWaylandPresentationSupportKHR"))
Jon Ashburn23d36b12016-02-02 17:47:28 -0700562 return (void *)table->GetPhysicalDeviceWaylandPresentationSupportKHR;
Ian Elliottdb4300a2015-11-23 10:17:23 -0700563#endif
564#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700565 if (!strcmp(name, "CreateWin32SurfaceKHR")) return (void *)table->CreateWin32SurfaceKHR;
Ian Elliott919fa302015-11-24 15:39:10 -0700566 if (!strcmp(name, "GetPhysicalDeviceWin32PresentationSupportKHR"))
Jon Ashburn23d36b12016-02-02 17:47:28 -0700567 return (void *)table->GetPhysicalDeviceWin32PresentationSupportKHR;
Ian Elliottdb4300a2015-11-23 10:17:23 -0700568#endif
569#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700570 if (!strcmp(name, "CreateXcbSurfaceKHR")) return (void *)table->CreateXcbSurfaceKHR;
Ian Elliott919fa302015-11-24 15:39:10 -0700571 if (!strcmp(name, "GetPhysicalDeviceXcbPresentationSupportKHR"))
Jon Ashburn23d36b12016-02-02 17:47:28 -0700572 return (void *)table->GetPhysicalDeviceXcbPresentationSupportKHR;
Ian Elliottdb4300a2015-11-23 10:17:23 -0700573#endif
574#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700575 if (!strcmp(name, "CreateXlibSurfaceKHR")) return (void *)table->CreateXlibSurfaceKHR;
Ian Elliott919fa302015-11-24 15:39:10 -0700576 if (!strcmp(name, "GetPhysicalDeviceXlibPresentationSupportKHR"))
Jon Ashburn23d36b12016-02-02 17:47:28 -0700577 return (void *)table->GetPhysicalDeviceXlibPresentationSupportKHR;
Ian Elliottdb4300a2015-11-23 10:17:23 -0700578#endif
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700579 if (!strcmp(name, "GetPhysicalDeviceDisplayPropertiesKHR")) return (void *)table->GetPhysicalDeviceDisplayPropertiesKHR;
Jon Ashburnc7d3e732016-03-08 09:30:30 -0700580 if (!strcmp(name, "GetPhysicalDeviceDisplayPlanePropertiesKHR"))
581 return (void *)table->GetPhysicalDeviceDisplayPlanePropertiesKHR;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700582 if (!strcmp(name, "GetDisplayPlaneSupportedDisplaysKHR")) return (void *)table->GetDisplayPlaneSupportedDisplaysKHR;
583 if (!strcmp(name, "GetDisplayModePropertiesKHR")) return (void *)table->GetDisplayModePropertiesKHR;
584 if (!strcmp(name, "CreateDisplayModeKHR")) return (void *)table->CreateDisplayModeKHR;
585 if (!strcmp(name, "GetDisplayPlaneCapabilitiesKHR")) return (void *)table->GetDisplayPlaneCapabilitiesKHR;
586 if (!strcmp(name, "CreateDisplayPlaneSurfaceKHR")) return (void *)table->CreateDisplayPlaneSurfaceKHR;
Jon Ashburnc7d3e732016-03-08 09:30:30 -0700587
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700588 return loader_lookup_instance_extension_dispatch_table(table, name, found_name);
Jon Ashburn8d1b0b52015-05-18 13:20:15 -0600589}