• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  * Copyright (c) 2015 The Khronos Group Inc.
4  * Copyright (c) 2015 Valve Corporation
5  * Copyright (c) 2015 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  */
21 
22 #include <string.h>
23 #include "debug_report.h"
24 #include "wsi.h"
25 #include "extensions.h"
26 
trampolineGetProcAddr(struct loader_instance * inst,const char * funcName)27 static inline void *trampolineGetProcAddr(struct loader_instance *inst,
28                                           const char *funcName) {
29     // Don't include or check global functions
30     if (!strcmp(funcName, "vkGetInstanceProcAddr"))
31         return (PFN_vkVoidFunction)vkGetInstanceProcAddr;
32     if (!strcmp(funcName, "vkDestroyInstance"))
33         return (PFN_vkVoidFunction)vkDestroyInstance;
34     if (!strcmp(funcName, "vkEnumeratePhysicalDevices"))
35         return (PFN_vkVoidFunction)vkEnumeratePhysicalDevices;
36     if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures"))
37         return (PFN_vkVoidFunction)vkGetPhysicalDeviceFeatures;
38     if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties"))
39         return (PFN_vkVoidFunction)vkGetPhysicalDeviceFormatProperties;
40     if (!strcmp(funcName, "vkGetPhysicalDeviceImageFormatProperties"))
41         return (PFN_vkVoidFunction)vkGetPhysicalDeviceImageFormatProperties;
42     if (!strcmp(funcName, "vkGetPhysicalDeviceSparseImageFormatProperties"))
43         return (
44             PFN_vkVoidFunction)vkGetPhysicalDeviceSparseImageFormatProperties;
45     if (!strcmp(funcName, "vkGetPhysicalDeviceProperties"))
46         return (PFN_vkVoidFunction)vkGetPhysicalDeviceProperties;
47     if (!strcmp(funcName, "vkGetPhysicalDeviceQueueFamilyProperties"))
48         return (PFN_vkVoidFunction)vkGetPhysicalDeviceQueueFamilyProperties;
49     if (!strcmp(funcName, "vkGetPhysicalDeviceMemoryProperties"))
50         return (PFN_vkVoidFunction)vkGetPhysicalDeviceMemoryProperties;
51     if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
52         return (PFN_vkVoidFunction)vkEnumerateDeviceLayerProperties;
53     if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
54         return (PFN_vkVoidFunction)vkEnumerateDeviceExtensionProperties;
55     if (!strcmp(funcName, "vkCreateDevice"))
56         return (PFN_vkVoidFunction)vkCreateDevice;
57     if (!strcmp(funcName, "vkGetDeviceProcAddr"))
58         return (PFN_vkVoidFunction)vkGetDeviceProcAddr;
59     if (!strcmp(funcName, "vkDestroyDevice"))
60         return (PFN_vkVoidFunction)vkDestroyDevice;
61     if (!strcmp(funcName, "vkGetDeviceQueue"))
62         return (PFN_vkVoidFunction)vkGetDeviceQueue;
63     if (!strcmp(funcName, "vkQueueSubmit"))
64         return (PFN_vkVoidFunction)vkQueueSubmit;
65     if (!strcmp(funcName, "vkQueueWaitIdle"))
66         return (PFN_vkVoidFunction)vkQueueWaitIdle;
67     if (!strcmp(funcName, "vkDeviceWaitIdle"))
68         return (PFN_vkVoidFunction)vkDeviceWaitIdle;
69     if (!strcmp(funcName, "vkAllocateMemory"))
70         return (PFN_vkVoidFunction)vkAllocateMemory;
71     if (!strcmp(funcName, "vkFreeMemory"))
72         return (PFN_vkVoidFunction)vkFreeMemory;
73     if (!strcmp(funcName, "vkMapMemory"))
74         return (PFN_vkVoidFunction)vkMapMemory;
75     if (!strcmp(funcName, "vkUnmapMemory"))
76         return (PFN_vkVoidFunction)vkUnmapMemory;
77     if (!strcmp(funcName, "vkFlushMappedMemoryRanges"))
78         return (PFN_vkVoidFunction)vkFlushMappedMemoryRanges;
79     if (!strcmp(funcName, "vkInvalidateMappedMemoryRanges"))
80         return (PFN_vkVoidFunction)vkInvalidateMappedMemoryRanges;
81     if (!strcmp(funcName, "vkGetDeviceMemoryCommitment"))
82         return (PFN_vkVoidFunction)vkGetDeviceMemoryCommitment;
83     if (!strcmp(funcName, "vkGetImageSparseMemoryRequirements"))
84         return (PFN_vkVoidFunction)vkGetImageSparseMemoryRequirements;
85     if (!strcmp(funcName, "vkGetImageMemoryRequirements"))
86         return (PFN_vkVoidFunction)vkGetImageMemoryRequirements;
87     if (!strcmp(funcName, "vkGetBufferMemoryRequirements"))
88         return (PFN_vkVoidFunction)vkGetBufferMemoryRequirements;
89     if (!strcmp(funcName, "vkBindImageMemory"))
90         return (PFN_vkVoidFunction)vkBindImageMemory;
91     if (!strcmp(funcName, "vkBindBufferMemory"))
92         return (PFN_vkVoidFunction)vkBindBufferMemory;
93     if (!strcmp(funcName, "vkQueueBindSparse"))
94         return (PFN_vkVoidFunction)vkQueueBindSparse;
95     if (!strcmp(funcName, "vkCreateFence"))
96         return (PFN_vkVoidFunction)vkCreateFence;
97     if (!strcmp(funcName, "vkDestroyFence"))
98         return (PFN_vkVoidFunction)vkDestroyFence;
99     if (!strcmp(funcName, "vkGetFenceStatus"))
100         return (PFN_vkVoidFunction)vkGetFenceStatus;
101     if (!strcmp(funcName, "vkResetFences"))
102         return (PFN_vkVoidFunction)vkResetFences;
103     if (!strcmp(funcName, "vkWaitForFences"))
104         return (PFN_vkVoidFunction)vkWaitForFences;
105     if (!strcmp(funcName, "vkCreateSemaphore"))
106         return (PFN_vkVoidFunction)vkCreateSemaphore;
107     if (!strcmp(funcName, "vkDestroySemaphore"))
108         return (PFN_vkVoidFunction)vkDestroySemaphore;
109     if (!strcmp(funcName, "vkCreateEvent"))
110         return (PFN_vkVoidFunction)vkCreateEvent;
111     if (!strcmp(funcName, "vkDestroyEvent"))
112         return (PFN_vkVoidFunction)vkDestroyEvent;
113     if (!strcmp(funcName, "vkGetEventStatus"))
114         return (PFN_vkVoidFunction)vkGetEventStatus;
115     if (!strcmp(funcName, "vkSetEvent"))
116         return (PFN_vkVoidFunction)vkSetEvent;
117     if (!strcmp(funcName, "vkResetEvent"))
118         return (PFN_vkVoidFunction)vkResetEvent;
119     if (!strcmp(funcName, "vkCreateQueryPool"))
120         return (PFN_vkVoidFunction)vkCreateQueryPool;
121     if (!strcmp(funcName, "vkDestroyQueryPool"))
122         return (PFN_vkVoidFunction)vkDestroyQueryPool;
123     if (!strcmp(funcName, "vkGetQueryPoolResults"))
124         return (PFN_vkVoidFunction)vkGetQueryPoolResults;
125     if (!strcmp(funcName, "vkCreateBuffer"))
126         return (PFN_vkVoidFunction)vkCreateBuffer;
127     if (!strcmp(funcName, "vkDestroyBuffer"))
128         return (PFN_vkVoidFunction)vkDestroyBuffer;
129     if (!strcmp(funcName, "vkCreateBufferView"))
130         return (PFN_vkVoidFunction)vkCreateBufferView;
131     if (!strcmp(funcName, "vkDestroyBufferView"))
132         return (PFN_vkVoidFunction)vkDestroyBufferView;
133     if (!strcmp(funcName, "vkCreateImage"))
134         return (PFN_vkVoidFunction)vkCreateImage;
135     if (!strcmp(funcName, "vkDestroyImage"))
136         return (PFN_vkVoidFunction)vkDestroyImage;
137     if (!strcmp(funcName, "vkGetImageSubresourceLayout"))
138         return (PFN_vkVoidFunction)vkGetImageSubresourceLayout;
139     if (!strcmp(funcName, "vkCreateImageView"))
140         return (PFN_vkVoidFunction)vkCreateImageView;
141     if (!strcmp(funcName, "vkDestroyImageView"))
142         return (PFN_vkVoidFunction)vkDestroyImageView;
143     if (!strcmp(funcName, "vkCreateShaderModule"))
144         return (PFN_vkVoidFunction)vkCreateShaderModule;
145     if (!strcmp(funcName, "vkDestroyShaderModule"))
146         return (PFN_vkVoidFunction)vkDestroyShaderModule;
147     if (!strcmp(funcName, "vkCreatePipelineCache"))
148         return (PFN_vkVoidFunction)vkCreatePipelineCache;
149     if (!strcmp(funcName, "vkDestroyPipelineCache"))
150         return (PFN_vkVoidFunction)vkDestroyPipelineCache;
151     if (!strcmp(funcName, "vkGetPipelineCacheData"))
152         return (PFN_vkVoidFunction)vkGetPipelineCacheData;
153     if (!strcmp(funcName, "vkMergePipelineCaches"))
154         return (PFN_vkVoidFunction)vkMergePipelineCaches;
155     if (!strcmp(funcName, "vkCreateGraphicsPipelines"))
156         return (PFN_vkVoidFunction)vkCreateGraphicsPipelines;
157     if (!strcmp(funcName, "vkCreateComputePipelines"))
158         return (PFN_vkVoidFunction)vkCreateComputePipelines;
159     if (!strcmp(funcName, "vkDestroyPipeline"))
160         return (PFN_vkVoidFunction)vkDestroyPipeline;
161     if (!strcmp(funcName, "vkCreatePipelineLayout"))
162         return (PFN_vkVoidFunction)vkCreatePipelineLayout;
163     if (!strcmp(funcName, "vkDestroyPipelineLayout"))
164         return (PFN_vkVoidFunction)vkDestroyPipelineLayout;
165     if (!strcmp(funcName, "vkCreateSampler"))
166         return (PFN_vkVoidFunction)vkCreateSampler;
167     if (!strcmp(funcName, "vkDestroySampler"))
168         return (PFN_vkVoidFunction)vkDestroySampler;
169     if (!strcmp(funcName, "vkCreateDescriptorSetLayout"))
170         return (PFN_vkVoidFunction)vkCreateDescriptorSetLayout;
171     if (!strcmp(funcName, "vkDestroyDescriptorSetLayout"))
172         return (PFN_vkVoidFunction)vkDestroyDescriptorSetLayout;
173     if (!strcmp(funcName, "vkCreateDescriptorPool"))
174         return (PFN_vkVoidFunction)vkCreateDescriptorPool;
175     if (!strcmp(funcName, "vkDestroyDescriptorPool"))
176         return (PFN_vkVoidFunction)vkDestroyDescriptorPool;
177     if (!strcmp(funcName, "vkResetDescriptorPool"))
178         return (PFN_vkVoidFunction)vkResetDescriptorPool;
179     if (!strcmp(funcName, "vkAllocateDescriptorSets"))
180         return (PFN_vkVoidFunction)vkAllocateDescriptorSets;
181     if (!strcmp(funcName, "vkFreeDescriptorSets"))
182         return (PFN_vkVoidFunction)vkFreeDescriptorSets;
183     if (!strcmp(funcName, "vkUpdateDescriptorSets"))
184         return (PFN_vkVoidFunction)vkUpdateDescriptorSets;
185     if (!strcmp(funcName, "vkCreateFramebuffer"))
186         return (PFN_vkVoidFunction)vkCreateFramebuffer;
187     if (!strcmp(funcName, "vkDestroyFramebuffer"))
188         return (PFN_vkVoidFunction)vkDestroyFramebuffer;
189     if (!strcmp(funcName, "vkCreateRenderPass"))
190         return (PFN_vkVoidFunction)vkCreateRenderPass;
191     if (!strcmp(funcName, "vkDestroyRenderPass"))
192         return (PFN_vkVoidFunction)vkDestroyRenderPass;
193     if (!strcmp(funcName, "vkGetRenderAreaGranularity"))
194         return (PFN_vkVoidFunction)vkGetRenderAreaGranularity;
195     if (!strcmp(funcName, "vkCreateCommandPool"))
196         return (PFN_vkVoidFunction)vkCreateCommandPool;
197     if (!strcmp(funcName, "vkDestroyCommandPool"))
198         return (PFN_vkVoidFunction)vkDestroyCommandPool;
199     if (!strcmp(funcName, "vkResetCommandPool"))
200         return (PFN_vkVoidFunction)vkResetCommandPool;
201     if (!strcmp(funcName, "vkAllocateCommandBuffers"))
202         return (PFN_vkVoidFunction)vkAllocateCommandBuffers;
203     if (!strcmp(funcName, "vkFreeCommandBuffers"))
204         return (PFN_vkVoidFunction)vkFreeCommandBuffers;
205     if (!strcmp(funcName, "vkBeginCommandBuffer"))
206         return (PFN_vkVoidFunction)vkBeginCommandBuffer;
207     if (!strcmp(funcName, "vkEndCommandBuffer"))
208         return (PFN_vkVoidFunction)vkEndCommandBuffer;
209     if (!strcmp(funcName, "vkResetCommandBuffer"))
210         return (PFN_vkVoidFunction)vkResetCommandBuffer;
211     if (!strcmp(funcName, "vkCmdBindPipeline"))
212         return (PFN_vkVoidFunction)vkCmdBindPipeline;
213     if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
214         return (PFN_vkVoidFunction)vkCmdBindDescriptorSets;
215     if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
216         return (PFN_vkVoidFunction)vkCmdBindVertexBuffers;
217     if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
218         return (PFN_vkVoidFunction)vkCmdBindIndexBuffer;
219     if (!strcmp(funcName, "vkCmdSetViewport"))
220         return (PFN_vkVoidFunction)vkCmdSetViewport;
221     if (!strcmp(funcName, "vkCmdSetScissor"))
222         return (PFN_vkVoidFunction)vkCmdSetScissor;
223     if (!strcmp(funcName, "vkCmdSetLineWidth"))
224         return (PFN_vkVoidFunction)vkCmdSetLineWidth;
225     if (!strcmp(funcName, "vkCmdSetDepthBias"))
226         return (PFN_vkVoidFunction)vkCmdSetDepthBias;
227     if (!strcmp(funcName, "vkCmdSetBlendConstants"))
228         return (PFN_vkVoidFunction)vkCmdSetBlendConstants;
229     if (!strcmp(funcName, "vkCmdSetDepthBounds"))
230         return (PFN_vkVoidFunction)vkCmdSetDepthBounds;
231     if (!strcmp(funcName, "vkCmdSetStencilCompareMask"))
232         return (PFN_vkVoidFunction)vkCmdSetStencilCompareMask;
233     if (!strcmp(funcName, "vkCmdSetStencilWriteMask"))
234         return (PFN_vkVoidFunction)vkCmdSetStencilWriteMask;
235     if (!strcmp(funcName, "vkCmdSetStencilReference"))
236         return (PFN_vkVoidFunction)vkCmdSetStencilReference;
237     if (!strcmp(funcName, "vkCmdDraw"))
238         return (PFN_vkVoidFunction)vkCmdDraw;
239     if (!strcmp(funcName, "vkCmdDrawIndexed"))
240         return (PFN_vkVoidFunction)vkCmdDrawIndexed;
241     if (!strcmp(funcName, "vkCmdDrawIndirect"))
242         return (PFN_vkVoidFunction)vkCmdDrawIndirect;
243     if (!strcmp(funcName, "vkCmdDrawIndexedIndirect"))
244         return (PFN_vkVoidFunction)vkCmdDrawIndexedIndirect;
245     if (!strcmp(funcName, "vkCmdDispatch"))
246         return (PFN_vkVoidFunction)vkCmdDispatch;
247     if (!strcmp(funcName, "vkCmdDispatchIndirect"))
248         return (PFN_vkVoidFunction)vkCmdDispatchIndirect;
249     if (!strcmp(funcName, "vkCmdCopyBuffer"))
250         return (PFN_vkVoidFunction)vkCmdCopyBuffer;
251     if (!strcmp(funcName, "vkCmdCopyImage"))
252         return (PFN_vkVoidFunction)vkCmdCopyImage;
253     if (!strcmp(funcName, "vkCmdBlitImage"))
254         return (PFN_vkVoidFunction)vkCmdBlitImage;
255     if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
256         return (PFN_vkVoidFunction)vkCmdCopyBufferToImage;
257     if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
258         return (PFN_vkVoidFunction)vkCmdCopyImageToBuffer;
259     if (!strcmp(funcName, "vkCmdUpdateBuffer"))
260         return (PFN_vkVoidFunction)vkCmdUpdateBuffer;
261     if (!strcmp(funcName, "vkCmdFillBuffer"))
262         return (PFN_vkVoidFunction)vkCmdFillBuffer;
263     if (!strcmp(funcName, "vkCmdClearColorImage"))
264         return (PFN_vkVoidFunction)vkCmdClearColorImage;
265     if (!strcmp(funcName, "vkCmdClearDepthStencilImage"))
266         return (PFN_vkVoidFunction)vkCmdClearDepthStencilImage;
267     if (!strcmp(funcName, "vkCmdClearAttachments"))
268         return (PFN_vkVoidFunction)vkCmdClearAttachments;
269     if (!strcmp(funcName, "vkCmdResolveImage"))
270         return (PFN_vkVoidFunction)vkCmdResolveImage;
271     if (!strcmp(funcName, "vkCmdSetEvent"))
272         return (PFN_vkVoidFunction)vkCmdSetEvent;
273     if (!strcmp(funcName, "vkCmdResetEvent"))
274         return (PFN_vkVoidFunction)vkCmdResetEvent;
275     if (!strcmp(funcName, "vkCmdWaitEvents"))
276         return (PFN_vkVoidFunction)vkCmdWaitEvents;
277     if (!strcmp(funcName, "vkCmdPipelineBarrier"))
278         return (PFN_vkVoidFunction)vkCmdPipelineBarrier;
279     if (!strcmp(funcName, "vkCmdBeginQuery"))
280         return (PFN_vkVoidFunction)vkCmdBeginQuery;
281     if (!strcmp(funcName, "vkCmdEndQuery"))
282         return (PFN_vkVoidFunction)vkCmdEndQuery;
283     if (!strcmp(funcName, "vkCmdResetQueryPool"))
284         return (PFN_vkVoidFunction)vkCmdResetQueryPool;
285     if (!strcmp(funcName, "vkCmdWriteTimestamp"))
286         return (PFN_vkVoidFunction)vkCmdWriteTimestamp;
287     if (!strcmp(funcName, "vkCmdCopyQueryPoolResults"))
288         return (PFN_vkVoidFunction)vkCmdCopyQueryPoolResults;
289     if (!strcmp(funcName, "vkCmdPushConstants"))
290         return (PFN_vkVoidFunction)vkCmdPushConstants;
291     if (!strcmp(funcName, "vkCmdBeginRenderPass"))
292         return (PFN_vkVoidFunction)vkCmdBeginRenderPass;
293     if (!strcmp(funcName, "vkCmdNextSubpass"))
294         return (PFN_vkVoidFunction)vkCmdNextSubpass;
295     if (!strcmp(funcName, "vkCmdEndRenderPass"))
296         return (PFN_vkVoidFunction)vkCmdEndRenderPass;
297     if (!strcmp(funcName, "vkCmdExecuteCommands"))
298         return (PFN_vkVoidFunction)vkCmdExecuteCommands;
299 
300     // Instance extensions
301     void *addr;
302     if (debug_report_instance_gpa(inst, funcName, &addr))
303         return addr;
304 
305     if (wsi_swapchain_instance_gpa(inst, funcName, &addr))
306         return addr;
307 
308     if (extension_instance_gpa(inst, funcName, &addr))
309         return addr;
310 
311     addr = loader_dev_ext_gpa(inst, funcName);
312     return addr;
313 }
314 
globalGetProcAddr(const char * name)315 static inline void *globalGetProcAddr(const char *name) {
316     if (!name || name[0] != 'v' || name[1] != 'k')
317         return NULL;
318 
319     name += 2;
320     if (!strcmp(name, "CreateInstance"))
321         return (void *)vkCreateInstance;
322     if (!strcmp(name, "EnumerateInstanceExtensionProperties"))
323         return (void *)vkEnumerateInstanceExtensionProperties;
324     if (!strcmp(name, "EnumerateInstanceLayerProperties"))
325         return (void *)vkEnumerateInstanceLayerProperties;
326 
327     return NULL;
328 }
329 
330 /* These functions require special handling by the loader.
331 *  They are not just generic trampoline code entrypoints.
332 *  Thus GPA must return loader entrypoint for these instead of first function
333 *  in the chain. */
loader_non_passthrough_gipa(const char * name)334 static inline void *loader_non_passthrough_gipa(const char *name) {
335     if (!name || name[0] != 'v' || name[1] != 'k')
336         return NULL;
337 
338     name += 2;
339     if (!strcmp(name, "CreateInstance"))
340         return (void *)vkCreateInstance;
341     if (!strcmp(name, "DestroyInstance"))
342         return (void *)vkDestroyInstance;
343     if (!strcmp(name, "GetDeviceProcAddr"))
344         return (void *)vkGetDeviceProcAddr;
345     // remove once no longer locks
346     if (!strcmp(name, "EnumeratePhysicalDevices"))
347         return (void *)vkEnumeratePhysicalDevices;
348     if (!strcmp(name, "EnumerateDeviceExtensionProperties"))
349         return (void *)vkEnumerateDeviceExtensionProperties;
350     if (!strcmp(name, "EnumerateDeviceLayerProperties"))
351         return (void *)vkEnumerateDeviceLayerProperties;
352     if (!strcmp(name, "GetInstanceProcAddr"))
353         return (void *)vkGetInstanceProcAddr;
354     if (!strcmp(name, "CreateDevice"))
355         return (void *)vkCreateDevice;
356 
357     return NULL;
358 }
359 
loader_non_passthrough_gdpa(const char * name)360 static inline void *loader_non_passthrough_gdpa(const char *name) {
361     if (!name || name[0] != 'v' || name[1] != 'k')
362         return NULL;
363 
364     name += 2;
365 
366     if (!strcmp(name, "GetDeviceProcAddr"))
367         return (void *)vkGetDeviceProcAddr;
368     if (!strcmp(name, "DestroyDevice"))
369         return (void *)vkDestroyDevice;
370     if (!strcmp(name, "GetDeviceQueue"))
371         return (void *)vkGetDeviceQueue;
372     if (!strcmp(name, "AllocateCommandBuffers"))
373         return (void *)vkAllocateCommandBuffers;
374 
375     return NULL;
376 }
377