1/*
2 *
3 * Copyright (c) 2015-2021 The Khronos Group Inc.
4 * Copyright (c) 2015-2021 Valve Corporation
5 * Copyright (c) 2015-2021 LunarG, Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 *     http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * Author: Jon Ashburn <jon@lunarg.com>
20 * Author: Charles Giessen <charles@lunarg.com>
21 */
22
23#include "gpa_helper.h"
24
25#include <string.h>
26
27#include "loader.h"
28#include "debug_utils.h"
29#include "unknown_function_handling.h"
30#include "wsi.h"
31
32void *trampoline_get_proc_addr(struct loader_instance *inst, const char *funcName) {
33    // Don't include or check global functions
34    if (!strcmp(funcName, "vkGetInstanceProcAddr")) return vkGetInstanceProcAddr;
35    if (!strcmp(funcName, "vkDestroyInstance")) return vkDestroyInstance;
36    if (!strcmp(funcName, "vkEnumeratePhysicalDevices")) return vkEnumeratePhysicalDevices;
37    if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures")) return vkGetPhysicalDeviceFeatures;
38    if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties")) return vkGetPhysicalDeviceFormatProperties;
39    if (!strcmp(funcName, "vkGetPhysicalDeviceImageFormatProperties")) return vkGetPhysicalDeviceImageFormatProperties;
40    if (!strcmp(funcName, "vkGetPhysicalDeviceSparseImageFormatProperties")) return vkGetPhysicalDeviceSparseImageFormatProperties;
41    if (!strcmp(funcName, "vkGetPhysicalDeviceProperties")) return vkGetPhysicalDeviceProperties;
42    if (!strcmp(funcName, "vkGetPhysicalDeviceQueueFamilyProperties")) return vkGetPhysicalDeviceQueueFamilyProperties;
43    if (!strcmp(funcName, "vkGetPhysicalDeviceMemoryProperties")) return vkGetPhysicalDeviceMemoryProperties;
44    if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties")) return vkEnumerateDeviceLayerProperties;
45    if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties")) return vkEnumerateDeviceExtensionProperties;
46    if (!strcmp(funcName, "vkCreateDevice")) return vkCreateDevice;
47    if (!strcmp(funcName, "vkGetDeviceProcAddr")) return vkGetDeviceProcAddr;
48    if (!strcmp(funcName, "vkDestroyDevice")) return vkDestroyDevice;
49    if (!strcmp(funcName, "vkGetDeviceQueue")) return vkGetDeviceQueue;
50    if (!strcmp(funcName, "vkQueueSubmit")) return vkQueueSubmit;
51    if (!strcmp(funcName, "vkQueueWaitIdle")) return vkQueueWaitIdle;
52    if (!strcmp(funcName, "vkDeviceWaitIdle")) return vkDeviceWaitIdle;
53    if (!strcmp(funcName, "vkAllocateMemory")) return vkAllocateMemory;
54    if (!strcmp(funcName, "vkFreeMemory")) return vkFreeMemory;
55    if (!strcmp(funcName, "vkMapMemory")) return vkMapMemory;
56    if (!strcmp(funcName, "vkUnmapMemory")) return vkUnmapMemory;
57    if (!strcmp(funcName, "vkFlushMappedMemoryRanges")) return vkFlushMappedMemoryRanges;
58    if (!strcmp(funcName, "vkInvalidateMappedMemoryRanges")) return vkInvalidateMappedMemoryRanges;
59    if (!strcmp(funcName, "vkGetDeviceMemoryCommitment")) return vkGetDeviceMemoryCommitment;
60    if (!strcmp(funcName, "vkGetImageSparseMemoryRequirements")) return vkGetImageSparseMemoryRequirements;
61    if (!strcmp(funcName, "vkGetImageMemoryRequirements")) return vkGetImageMemoryRequirements;
62    if (!strcmp(funcName, "vkGetBufferMemoryRequirements")) return vkGetBufferMemoryRequirements;
63    if (!strcmp(funcName, "vkBindImageMemory")) return vkBindImageMemory;
64    if (!strcmp(funcName, "vkBindBufferMemory")) return vkBindBufferMemory;
65    if (!strcmp(funcName, "vkQueueBindSparse")) return vkQueueBindSparse;
66    if (!strcmp(funcName, "vkCreateFence")) return vkCreateFence;
67    if (!strcmp(funcName, "vkDestroyFence")) return vkDestroyFence;
68    if (!strcmp(funcName, "vkGetFenceStatus")) return vkGetFenceStatus;
69    if (!strcmp(funcName, "vkResetFences")) return vkResetFences;
70    if (!strcmp(funcName, "vkWaitForFences")) return vkWaitForFences;
71    if (!strcmp(funcName, "vkCreateSemaphore")) return vkCreateSemaphore;
72    if (!strcmp(funcName, "vkDestroySemaphore")) return vkDestroySemaphore;
73    if (!strcmp(funcName, "vkCreateEvent")) return vkCreateEvent;
74    if (!strcmp(funcName, "vkDestroyEvent")) return vkDestroyEvent;
75    if (!strcmp(funcName, "vkGetEventStatus")) return vkGetEventStatus;
76    if (!strcmp(funcName, "vkSetEvent")) return vkSetEvent;
77    if (!strcmp(funcName, "vkResetEvent")) return vkResetEvent;
78    if (!strcmp(funcName, "vkCreateQueryPool")) return vkCreateQueryPool;
79    if (!strcmp(funcName, "vkDestroyQueryPool")) return vkDestroyQueryPool;
80    if (!strcmp(funcName, "vkGetQueryPoolResults")) return vkGetQueryPoolResults;
81    if (!strcmp(funcName, "vkCreateBuffer")) return vkCreateBuffer;
82    if (!strcmp(funcName, "vkDestroyBuffer")) return vkDestroyBuffer;
83    if (!strcmp(funcName, "vkCreateBufferView")) return vkCreateBufferView;
84    if (!strcmp(funcName, "vkDestroyBufferView")) return vkDestroyBufferView;
85    if (!strcmp(funcName, "vkCreateImage")) return vkCreateImage;
86    if (!strcmp(funcName, "vkDestroyImage")) return vkDestroyImage;
87    if (!strcmp(funcName, "vkGetImageSubresourceLayout")) return vkGetImageSubresourceLayout;
88    if (!strcmp(funcName, "vkCreateImageView")) return vkCreateImageView;
89    if (!strcmp(funcName, "vkDestroyImageView")) return vkDestroyImageView;
90    if (!strcmp(funcName, "vkCreateShaderModule")) return vkCreateShaderModule;
91    if (!strcmp(funcName, "vkDestroyShaderModule")) return vkDestroyShaderModule;
92    if (!strcmp(funcName, "vkCreatePipelineCache")) return vkCreatePipelineCache;
93    if (!strcmp(funcName, "vkDestroyPipelineCache")) return vkDestroyPipelineCache;
94    if (!strcmp(funcName, "vkGetPipelineCacheData")) return vkGetPipelineCacheData;
95    if (!strcmp(funcName, "vkMergePipelineCaches")) return vkMergePipelineCaches;
96    if (!strcmp(funcName, "vkCreateGraphicsPipelines")) return vkCreateGraphicsPipelines;
97    if (!strcmp(funcName, "vkCreateComputePipelines")) return vkCreateComputePipelines;
98    if (!strcmp(funcName, "vkDestroyPipeline")) return vkDestroyPipeline;
99    if (!strcmp(funcName, "vkCreatePipelineLayout")) return vkCreatePipelineLayout;
100    if (!strcmp(funcName, "vkDestroyPipelineLayout")) return vkDestroyPipelineLayout;
101    if (!strcmp(funcName, "vkCreateSampler")) return vkCreateSampler;
102    if (!strcmp(funcName, "vkDestroySampler")) return vkDestroySampler;
103    if (!strcmp(funcName, "vkCreateDescriptorSetLayout")) return vkCreateDescriptorSetLayout;
104    if (!strcmp(funcName, "vkDestroyDescriptorSetLayout")) return vkDestroyDescriptorSetLayout;
105    if (!strcmp(funcName, "vkCreateDescriptorPool")) return vkCreateDescriptorPool;
106    if (!strcmp(funcName, "vkDestroyDescriptorPool")) return vkDestroyDescriptorPool;
107    if (!strcmp(funcName, "vkResetDescriptorPool")) return vkResetDescriptorPool;
108    if (!strcmp(funcName, "vkAllocateDescriptorSets")) return vkAllocateDescriptorSets;
109    if (!strcmp(funcName, "vkFreeDescriptorSets")) return vkFreeDescriptorSets;
110    if (!strcmp(funcName, "vkUpdateDescriptorSets")) return vkUpdateDescriptorSets;
111    if (!strcmp(funcName, "vkCreateFramebuffer")) return vkCreateFramebuffer;
112    if (!strcmp(funcName, "vkDestroyFramebuffer")) return vkDestroyFramebuffer;
113    if (!strcmp(funcName, "vkCreateRenderPass")) return vkCreateRenderPass;
114    if (!strcmp(funcName, "vkDestroyRenderPass")) return vkDestroyRenderPass;
115    if (!strcmp(funcName, "vkGetRenderAreaGranularity")) return vkGetRenderAreaGranularity;
116    if (!strcmp(funcName, "vkCreateCommandPool")) return vkCreateCommandPool;
117    if (!strcmp(funcName, "vkDestroyCommandPool")) return vkDestroyCommandPool;
118    if (!strcmp(funcName, "vkResetCommandPool")) return vkResetCommandPool;
119    if (!strcmp(funcName, "vkAllocateCommandBuffers")) return vkAllocateCommandBuffers;
120    if (!strcmp(funcName, "vkFreeCommandBuffers")) return vkFreeCommandBuffers;
121    if (!strcmp(funcName, "vkBeginCommandBuffer")) return vkBeginCommandBuffer;
122    if (!strcmp(funcName, "vkEndCommandBuffer")) return vkEndCommandBuffer;
123    if (!strcmp(funcName, "vkResetCommandBuffer")) return vkResetCommandBuffer;
124    if (!strcmp(funcName, "vkCmdBindPipeline")) return vkCmdBindPipeline;
125    if (!strcmp(funcName, "vkCmdBindDescriptorSets")) return vkCmdBindDescriptorSets;
126    if (!strcmp(funcName, "vkCmdBindVertexBuffers")) return vkCmdBindVertexBuffers;
127    if (!strcmp(funcName, "vkCmdBindIndexBuffer")) return vkCmdBindIndexBuffer;
128    if (!strcmp(funcName, "vkCmdSetViewport")) return vkCmdSetViewport;
129    if (!strcmp(funcName, "vkCmdSetScissor")) return vkCmdSetScissor;
130    if (!strcmp(funcName, "vkCmdSetLineWidth")) return vkCmdSetLineWidth;
131    if (!strcmp(funcName, "vkCmdSetDepthBias")) return vkCmdSetDepthBias;
132    if (!strcmp(funcName, "vkCmdSetBlendConstants")) return vkCmdSetBlendConstants;
133    if (!strcmp(funcName, "vkCmdSetDepthBounds")) return vkCmdSetDepthBounds;
134    if (!strcmp(funcName, "vkCmdSetStencilCompareMask")) return vkCmdSetStencilCompareMask;
135    if (!strcmp(funcName, "vkCmdSetStencilWriteMask")) return vkCmdSetStencilWriteMask;
136    if (!strcmp(funcName, "vkCmdSetStencilReference")) return vkCmdSetStencilReference;
137    if (!strcmp(funcName, "vkCmdDraw")) return vkCmdDraw;
138    if (!strcmp(funcName, "vkCmdDrawIndexed")) return vkCmdDrawIndexed;
139    if (!strcmp(funcName, "vkCmdDrawIndirect")) return vkCmdDrawIndirect;
140    if (!strcmp(funcName, "vkCmdDrawIndexedIndirect")) return vkCmdDrawIndexedIndirect;
141    if (!strcmp(funcName, "vkCmdDispatch")) return vkCmdDispatch;
142    if (!strcmp(funcName, "vkCmdDispatchIndirect")) return vkCmdDispatchIndirect;
143    if (!strcmp(funcName, "vkCmdCopyBuffer")) return vkCmdCopyBuffer;
144    if (!strcmp(funcName, "vkCmdCopyImage")) return vkCmdCopyImage;
145    if (!strcmp(funcName, "vkCmdBlitImage")) return vkCmdBlitImage;
146    if (!strcmp(funcName, "vkCmdCopyBufferToImage")) return vkCmdCopyBufferToImage;
147    if (!strcmp(funcName, "vkCmdCopyImageToBuffer")) return vkCmdCopyImageToBuffer;
148    if (!strcmp(funcName, "vkCmdUpdateBuffer")) return vkCmdUpdateBuffer;
149    if (!strcmp(funcName, "vkCmdFillBuffer")) return vkCmdFillBuffer;
150    if (!strcmp(funcName, "vkCmdClearColorImage")) return vkCmdClearColorImage;
151    if (!strcmp(funcName, "vkCmdClearDepthStencilImage")) return vkCmdClearDepthStencilImage;
152    if (!strcmp(funcName, "vkCmdClearAttachments")) return vkCmdClearAttachments;
153    if (!strcmp(funcName, "vkCmdResolveImage")) return vkCmdResolveImage;
154    if (!strcmp(funcName, "vkCmdSetEvent")) return vkCmdSetEvent;
155    if (!strcmp(funcName, "vkCmdResetEvent")) return vkCmdResetEvent;
156    if (!strcmp(funcName, "vkCmdWaitEvents")) return vkCmdWaitEvents;
157    if (!strcmp(funcName, "vkCmdPipelineBarrier")) return vkCmdPipelineBarrier;
158    if (!strcmp(funcName, "vkCmdBeginQuery")) return vkCmdBeginQuery;
159    if (!strcmp(funcName, "vkCmdEndQuery")) return vkCmdEndQuery;
160    if (!strcmp(funcName, "vkCmdResetQueryPool")) return vkCmdResetQueryPool;
161    if (!strcmp(funcName, "vkCmdWriteTimestamp")) return vkCmdWriteTimestamp;
162    if (!strcmp(funcName, "vkCmdCopyQueryPoolResults")) return vkCmdCopyQueryPoolResults;
163    if (!strcmp(funcName, "vkCmdPushConstants")) return vkCmdPushConstants;
164    if (!strcmp(funcName, "vkCmdBeginRenderPass")) return vkCmdBeginRenderPass;
165    if (!strcmp(funcName, "vkCmdNextSubpass")) return vkCmdNextSubpass;
166    if (!strcmp(funcName, "vkCmdEndRenderPass")) return vkCmdEndRenderPass;
167    if (!strcmp(funcName, "vkCmdExecuteCommands")) return vkCmdExecuteCommands;
168
169    // Core 1.1 functions
170    if (!strcmp(funcName, "vkEnumeratePhysicalDeviceGroups")) return vkEnumeratePhysicalDeviceGroups;
171    if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures2")) return vkGetPhysicalDeviceFeatures2;
172    if (!strcmp(funcName, "vkGetPhysicalDeviceProperties2")) return vkGetPhysicalDeviceProperties2;
173    if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties2")) return vkGetPhysicalDeviceFormatProperties2;
174    if (!strcmp(funcName, "vkGetPhysicalDeviceImageFormatProperties2")) return vkGetPhysicalDeviceImageFormatProperties2;
175    if (!strcmp(funcName, "vkGetPhysicalDeviceQueueFamilyProperties2")) return vkGetPhysicalDeviceQueueFamilyProperties2;
176    if (!strcmp(funcName, "vkGetPhysicalDeviceMemoryProperties2")) return vkGetPhysicalDeviceMemoryProperties2;
177    if (!strcmp(funcName, "vkGetPhysicalDeviceSparseImageFormatProperties2"))
178        return vkGetPhysicalDeviceSparseImageFormatProperties2;
179    if (!strcmp(funcName, "vkGetPhysicalDeviceExternalBufferProperties")) return vkGetPhysicalDeviceExternalBufferProperties;
180    if (!strcmp(funcName, "vkGetPhysicalDeviceExternalSemaphoreProperties")) return vkGetPhysicalDeviceExternalSemaphoreProperties;
181    if (!strcmp(funcName, "vkGetPhysicalDeviceExternalFenceProperties")) return vkGetPhysicalDeviceExternalFenceProperties;
182    if (!strcmp(funcName, "vkBindBufferMemory2")) return vkBindBufferMemory2;
183    if (!strcmp(funcName, "vkBindImageMemory2")) return vkBindImageMemory2;
184    if (!strcmp(funcName, "vkGetDeviceGroupPeerMemoryFeatures")) return vkGetDeviceGroupPeerMemoryFeatures;
185    if (!strcmp(funcName, "vkCmdSetDeviceMask")) return vkCmdSetDeviceMask;
186    if (!strcmp(funcName, "vkCmdDispatchBase")) return vkCmdDispatchBase;
187    if (!strcmp(funcName, "vkGetImageMemoryRequirements2")) return vkGetImageMemoryRequirements2;
188    if (!strcmp(funcName, "vkTrimCommandPool")) return vkTrimCommandPool;
189    if (!strcmp(funcName, "vkGetDeviceQueue2")) return vkGetDeviceQueue2;
190    if (!strcmp(funcName, "vkCreateSamplerYcbcrConversion")) return vkCreateSamplerYcbcrConversion;
191    if (!strcmp(funcName, "vkDestroySamplerYcbcrConversion")) return vkDestroySamplerYcbcrConversion;
192    if (!strcmp(funcName, "vkGetDescriptorSetLayoutSupport")) return vkGetDescriptorSetLayoutSupport;
193    if (!strcmp(funcName, "vkCreateDescriptorUpdateTemplate")) return vkCreateDescriptorUpdateTemplate;
194    if (!strcmp(funcName, "vkDestroyDescriptorUpdateTemplate")) return vkDestroyDescriptorUpdateTemplate;
195    if (!strcmp(funcName, "vkUpdateDescriptorSetWithTemplate")) return vkUpdateDescriptorSetWithTemplate;
196    if (!strcmp(funcName, "vkGetImageSparseMemoryRequirements2")) return vkGetImageSparseMemoryRequirements2;
197    if (!strcmp(funcName, "vkGetBufferMemoryRequirements2")) return vkGetBufferMemoryRequirements2;
198
199    // Core 1.2 functions
200    if (!strcmp(funcName, "vkCreateRenderPass2")) return vkCreateRenderPass2;
201    if (!strcmp(funcName, "vkCmdBeginRenderPass2")) return vkCmdBeginRenderPass2;
202    if (!strcmp(funcName, "vkCmdNextSubpass2")) return vkCmdNextSubpass2;
203    if (!strcmp(funcName, "vkCmdEndRenderPass2")) return vkCmdEndRenderPass2;
204    if (!strcmp(funcName, "vkCmdDrawIndirectCount")) return vkCmdDrawIndirectCount;
205    if (!strcmp(funcName, "vkCmdDrawIndexedIndirectCount")) return vkCmdDrawIndexedIndirectCount;
206    if (!strcmp(funcName, "vkGetSemaphoreCounterValue")) return vkGetSemaphoreCounterValue;
207    if (!strcmp(funcName, "vkWaitSemaphores")) return vkWaitSemaphores;
208    if (!strcmp(funcName, "vkSignalSemaphore")) return vkSignalSemaphore;
209    if (!strcmp(funcName, "vkGetBufferDeviceAddress")) return vkGetBufferDeviceAddress;
210    if (!strcmp(funcName, "vkGetBufferOpaqueCaptureAddress")) return vkGetBufferOpaqueCaptureAddress;
211    if (!strcmp(funcName, "vkGetDeviceMemoryOpaqueCaptureAddress")) return vkGetDeviceMemoryOpaqueCaptureAddress;
212    if (!strcmp(funcName, "vkResetQueryPool")) return vkResetQueryPool;
213
214    // Core 1.3 functions
215    if (!strcmp(funcName, "vkGetPhysicalDeviceToolProperties")) return vkGetPhysicalDeviceToolProperties;
216    if (!strcmp(funcName, "vkCreatePrivateDataSlot")) return vkCreatePrivateDataSlot;
217    if (!strcmp(funcName, "vkDestroyPrivateDataSlot")) return vkDestroyPrivateDataSlot;
218    if (!strcmp(funcName, "vkSetPrivateData")) return vkSetPrivateData;
219    if (!strcmp(funcName, "vkGetPrivateData")) return vkGetPrivateData;
220    if (!strcmp(funcName, "vkCmdSetEvent2")) return vkCmdSetEvent2;
221    if (!strcmp(funcName, "vkCmdResetEvent2")) return vkCmdResetEvent2;
222    if (!strcmp(funcName, "vkCmdWaitEvents2")) return vkCmdWaitEvents2;
223    if (!strcmp(funcName, "vkCmdPipelineBarrier2")) return vkCmdPipelineBarrier2;
224    if (!strcmp(funcName, "vkCmdWriteTimestamp2")) return vkCmdWriteTimestamp2;
225    if (!strcmp(funcName, "vkQueueSubmit2")) return vkQueueSubmit2;
226    if (!strcmp(funcName, "vkCmdCopyBuffer2")) return vkCmdCopyBuffer2;
227    if (!strcmp(funcName, "vkCmdCopyImage2")) return vkCmdCopyImage2;
228    if (!strcmp(funcName, "vkCmdCopyBufferToImage2")) return vkCmdCopyBufferToImage2;
229    if (!strcmp(funcName, "vkCmdCopyImageToBuffer2")) return vkCmdCopyImageToBuffer2;
230    if (!strcmp(funcName, "vkCmdBlitImage2")) return vkCmdBlitImage2;
231    if (!strcmp(funcName, "vkCmdResolveImage2")) return vkCmdResolveImage2;
232    if (!strcmp(funcName, "vkCmdBeginRendering")) return vkCmdBeginRendering;
233    if (!strcmp(funcName, "vkCmdEndRendering")) return vkCmdEndRendering;
234    if (!strcmp(funcName, "vkCmdSetCullMode")) return vkCmdSetCullMode;
235    if (!strcmp(funcName, "vkCmdSetFrontFace")) return vkCmdSetFrontFace;
236    if (!strcmp(funcName, "vkCmdSetPrimitiveTopology")) return vkCmdSetPrimitiveTopology;
237    if (!strcmp(funcName, "vkCmdSetViewportWithCount")) return vkCmdSetViewportWithCount;
238    if (!strcmp(funcName, "vkCmdSetScissorWithCount")) return vkCmdSetScissorWithCount;
239    if (!strcmp(funcName, "vkCmdBindVertexBuffers2")) return vkCmdBindVertexBuffers2;
240    if (!strcmp(funcName, "vkCmdSetDepthTestEnable")) return vkCmdSetDepthTestEnable;
241    if (!strcmp(funcName, "vkCmdSetDepthWriteEnable")) return vkCmdSetDepthWriteEnable;
242    if (!strcmp(funcName, "vkCmdSetDepthCompareOp")) return vkCmdSetDepthCompareOp;
243    if (!strcmp(funcName, "vkCmdSetDepthBoundsTestEnable")) return vkCmdSetDepthBoundsTestEnable;
244    if (!strcmp(funcName, "vkCmdSetStencilTestEnable")) return vkCmdSetStencilTestEnable;
245    if (!strcmp(funcName, "vkCmdSetStencilOp")) return vkCmdSetStencilOp;
246    if (!strcmp(funcName, "vkCmdSetRasterizerDiscardEnable")) return vkCmdSetRasterizerDiscardEnable;
247    if (!strcmp(funcName, "vkCmdSetDepthBiasEnable")) return vkCmdSetDepthBiasEnable;
248    if (!strcmp(funcName, "vkCmdSetPrimitiveRestartEnable")) return vkCmdSetPrimitiveRestartEnable;
249    if (!strcmp(funcName, "vkGetDeviceBufferMemoryRequirements")) return vkGetDeviceBufferMemoryRequirements;
250    if (!strcmp(funcName, "vkGetDeviceImageMemoryRequirements")) return vkGetDeviceImageMemoryRequirements;
251    if (!strcmp(funcName, "vkGetDeviceImageSparseMemoryRequirements")) return vkGetDeviceImageSparseMemoryRequirements;
252
253    // Instance extensions
254    void *addr;
255    if (debug_extensions_InstanceGpa(inst, funcName, &addr)) return addr;
256
257    if (wsi_swapchain_instance_gpa(inst, funcName, &addr)) return addr;
258
259    if (extension_instance_gpa(inst, funcName, &addr)) return addr;
260
261    // Unknown physical device extensions
262    addr = loader_phys_dev_ext_gpa_tramp(inst, funcName);
263    if (NULL != addr) return addr;
264
265    // Unknown device extensions
266    addr = loader_dev_ext_gpa_tramp(inst, funcName);
267    return addr;
268}
269
270void *globalGetProcAddr(const char *name) {
271    if (!name || name[0] != 'v' || name[1] != 'k') return NULL;
272
273    name += 2;
274    if (!strcmp(name, "CreateInstance")) return vkCreateInstance;
275    if (!strcmp(name, "EnumerateInstanceExtensionProperties")) return vkEnumerateInstanceExtensionProperties;
276    if (!strcmp(name, "EnumerateInstanceLayerProperties")) return vkEnumerateInstanceLayerProperties;
277    if (!strcmp(name, "EnumerateInstanceVersion")) return vkEnumerateInstanceVersion;
278
279    return NULL;
280}
281