gpa_helper.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. /*
  2. *
  3. * Copyright (c) 2015-18, 2020 The Khronos Group Inc.
  4. * Copyright (c) 2015-18, 2020 Valve Corporation
  5. * Copyright (c) 2015-18, 2020 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 <[email protected]>
  20. */
  21. #include <string.h>
  22. #include "debug_utils.h"
  23. #include "wsi.h"
  24. static inline void *trampolineGetProcAddr(struct loader_instance *inst, const char *funcName) {
  25. // Don't include or check global functions
  26. if (!strcmp(funcName, "vkGetInstanceProcAddr")) return vkGetInstanceProcAddr;
  27. if (!strcmp(funcName, "vkDestroyInstance")) return vkDestroyInstance;
  28. if (!strcmp(funcName, "vkEnumeratePhysicalDevices")) return vkEnumeratePhysicalDevices;
  29. if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures")) return vkGetPhysicalDeviceFeatures;
  30. if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties")) return vkGetPhysicalDeviceFormatProperties;
  31. if (!strcmp(funcName, "vkGetPhysicalDeviceImageFormatProperties")) return vkGetPhysicalDeviceImageFormatProperties;
  32. if (!strcmp(funcName, "vkGetPhysicalDeviceSparseImageFormatProperties")) return vkGetPhysicalDeviceSparseImageFormatProperties;
  33. if (!strcmp(funcName, "vkGetPhysicalDeviceProperties")) return vkGetPhysicalDeviceProperties;
  34. if (!strcmp(funcName, "vkGetPhysicalDeviceQueueFamilyProperties")) return vkGetPhysicalDeviceQueueFamilyProperties;
  35. if (!strcmp(funcName, "vkGetPhysicalDeviceMemoryProperties")) return vkGetPhysicalDeviceMemoryProperties;
  36. if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties")) return vkEnumerateDeviceLayerProperties;
  37. if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties")) return vkEnumerateDeviceExtensionProperties;
  38. if (!strcmp(funcName, "vkCreateDevice")) return vkCreateDevice;
  39. if (!strcmp(funcName, "vkGetDeviceProcAddr")) return vkGetDeviceProcAddr;
  40. if (!strcmp(funcName, "vkDestroyDevice")) return vkDestroyDevice;
  41. if (!strcmp(funcName, "vkGetDeviceQueue")) return vkGetDeviceQueue;
  42. if (!strcmp(funcName, "vkQueueSubmit")) return vkQueueSubmit;
  43. if (!strcmp(funcName, "vkQueueWaitIdle")) return vkQueueWaitIdle;
  44. if (!strcmp(funcName, "vkDeviceWaitIdle")) return vkDeviceWaitIdle;
  45. if (!strcmp(funcName, "vkAllocateMemory")) return vkAllocateMemory;
  46. if (!strcmp(funcName, "vkFreeMemory")) return vkFreeMemory;
  47. if (!strcmp(funcName, "vkMapMemory")) return vkMapMemory;
  48. if (!strcmp(funcName, "vkUnmapMemory")) return vkUnmapMemory;
  49. if (!strcmp(funcName, "vkFlushMappedMemoryRanges")) return vkFlushMappedMemoryRanges;
  50. if (!strcmp(funcName, "vkInvalidateMappedMemoryRanges")) return vkInvalidateMappedMemoryRanges;
  51. if (!strcmp(funcName, "vkGetDeviceMemoryCommitment")) return vkGetDeviceMemoryCommitment;
  52. if (!strcmp(funcName, "vkGetImageSparseMemoryRequirements")) return vkGetImageSparseMemoryRequirements;
  53. if (!strcmp(funcName, "vkGetImageMemoryRequirements")) return vkGetImageMemoryRequirements;
  54. if (!strcmp(funcName, "vkGetBufferMemoryRequirements")) return vkGetBufferMemoryRequirements;
  55. if (!strcmp(funcName, "vkBindImageMemory")) return vkBindImageMemory;
  56. if (!strcmp(funcName, "vkBindBufferMemory")) return vkBindBufferMemory;
  57. if (!strcmp(funcName, "vkQueueBindSparse")) return vkQueueBindSparse;
  58. if (!strcmp(funcName, "vkCreateFence")) return vkCreateFence;
  59. if (!strcmp(funcName, "vkDestroyFence")) return vkDestroyFence;
  60. if (!strcmp(funcName, "vkGetFenceStatus")) return vkGetFenceStatus;
  61. if (!strcmp(funcName, "vkResetFences")) return vkResetFences;
  62. if (!strcmp(funcName, "vkWaitForFences")) return vkWaitForFences;
  63. if (!strcmp(funcName, "vkCreateSemaphore")) return vkCreateSemaphore;
  64. if (!strcmp(funcName, "vkDestroySemaphore")) return vkDestroySemaphore;
  65. if (!strcmp(funcName, "vkCreateEvent")) return vkCreateEvent;
  66. if (!strcmp(funcName, "vkDestroyEvent")) return vkDestroyEvent;
  67. if (!strcmp(funcName, "vkGetEventStatus")) return vkGetEventStatus;
  68. if (!strcmp(funcName, "vkSetEvent")) return vkSetEvent;
  69. if (!strcmp(funcName, "vkResetEvent")) return vkResetEvent;
  70. if (!strcmp(funcName, "vkCreateQueryPool")) return vkCreateQueryPool;
  71. if (!strcmp(funcName, "vkDestroyQueryPool")) return vkDestroyQueryPool;
  72. if (!strcmp(funcName, "vkGetQueryPoolResults")) return vkGetQueryPoolResults;
  73. if (!strcmp(funcName, "vkCreateBuffer")) return vkCreateBuffer;
  74. if (!strcmp(funcName, "vkDestroyBuffer")) return vkDestroyBuffer;
  75. if (!strcmp(funcName, "vkCreateBufferView")) return vkCreateBufferView;
  76. if (!strcmp(funcName, "vkDestroyBufferView")) return vkDestroyBufferView;
  77. if (!strcmp(funcName, "vkCreateImage")) return vkCreateImage;
  78. if (!strcmp(funcName, "vkDestroyImage")) return vkDestroyImage;
  79. if (!strcmp(funcName, "vkGetImageSubresourceLayout")) return vkGetImageSubresourceLayout;
  80. if (!strcmp(funcName, "vkCreateImageView")) return vkCreateImageView;
  81. if (!strcmp(funcName, "vkDestroyImageView")) return vkDestroyImageView;
  82. if (!strcmp(funcName, "vkCreateShaderModule")) return vkCreateShaderModule;
  83. if (!strcmp(funcName, "vkDestroyShaderModule")) return vkDestroyShaderModule;
  84. if (!strcmp(funcName, "vkCreatePipelineCache")) return vkCreatePipelineCache;
  85. if (!strcmp(funcName, "vkDestroyPipelineCache")) return vkDestroyPipelineCache;
  86. if (!strcmp(funcName, "vkGetPipelineCacheData")) return vkGetPipelineCacheData;
  87. if (!strcmp(funcName, "vkMergePipelineCaches")) return vkMergePipelineCaches;
  88. if (!strcmp(funcName, "vkCreateGraphicsPipelines")) return vkCreateGraphicsPipelines;
  89. if (!strcmp(funcName, "vkCreateComputePipelines")) return vkCreateComputePipelines;
  90. if (!strcmp(funcName, "vkDestroyPipeline")) return vkDestroyPipeline;
  91. if (!strcmp(funcName, "vkCreatePipelineLayout")) return vkCreatePipelineLayout;
  92. if (!strcmp(funcName, "vkDestroyPipelineLayout")) return vkDestroyPipelineLayout;
  93. if (!strcmp(funcName, "vkCreateSampler")) return vkCreateSampler;
  94. if (!strcmp(funcName, "vkDestroySampler")) return vkDestroySampler;
  95. if (!strcmp(funcName, "vkCreateDescriptorSetLayout")) return vkCreateDescriptorSetLayout;
  96. if (!strcmp(funcName, "vkDestroyDescriptorSetLayout")) return vkDestroyDescriptorSetLayout;
  97. if (!strcmp(funcName, "vkCreateDescriptorPool")) return vkCreateDescriptorPool;
  98. if (!strcmp(funcName, "vkDestroyDescriptorPool")) return vkDestroyDescriptorPool;
  99. if (!strcmp(funcName, "vkResetDescriptorPool")) return vkResetDescriptorPool;
  100. if (!strcmp(funcName, "vkAllocateDescriptorSets")) return vkAllocateDescriptorSets;
  101. if (!strcmp(funcName, "vkFreeDescriptorSets")) return vkFreeDescriptorSets;
  102. if (!strcmp(funcName, "vkUpdateDescriptorSets")) return vkUpdateDescriptorSets;
  103. if (!strcmp(funcName, "vkCreateFramebuffer")) return vkCreateFramebuffer;
  104. if (!strcmp(funcName, "vkDestroyFramebuffer")) return vkDestroyFramebuffer;
  105. if (!strcmp(funcName, "vkCreateRenderPass")) return vkCreateRenderPass;
  106. if (!strcmp(funcName, "vkDestroyRenderPass")) return vkDestroyRenderPass;
  107. if (!strcmp(funcName, "vkGetRenderAreaGranularity")) return vkGetRenderAreaGranularity;
  108. if (!strcmp(funcName, "vkCreateCommandPool")) return vkCreateCommandPool;
  109. if (!strcmp(funcName, "vkDestroyCommandPool")) return vkDestroyCommandPool;
  110. if (!strcmp(funcName, "vkResetCommandPool")) return vkResetCommandPool;
  111. if (!strcmp(funcName, "vkAllocateCommandBuffers")) return vkAllocateCommandBuffers;
  112. if (!strcmp(funcName, "vkFreeCommandBuffers")) return vkFreeCommandBuffers;
  113. if (!strcmp(funcName, "vkBeginCommandBuffer")) return vkBeginCommandBuffer;
  114. if (!strcmp(funcName, "vkEndCommandBuffer")) return vkEndCommandBuffer;
  115. if (!strcmp(funcName, "vkResetCommandBuffer")) return vkResetCommandBuffer;
  116. if (!strcmp(funcName, "vkCmdBindPipeline")) return vkCmdBindPipeline;
  117. if (!strcmp(funcName, "vkCmdBindDescriptorSets")) return vkCmdBindDescriptorSets;
  118. if (!strcmp(funcName, "vkCmdBindVertexBuffers")) return vkCmdBindVertexBuffers;
  119. if (!strcmp(funcName, "vkCmdBindIndexBuffer")) return vkCmdBindIndexBuffer;
  120. if (!strcmp(funcName, "vkCmdSetViewport")) return vkCmdSetViewport;
  121. if (!strcmp(funcName, "vkCmdSetScissor")) return vkCmdSetScissor;
  122. if (!strcmp(funcName, "vkCmdSetLineWidth")) return vkCmdSetLineWidth;
  123. if (!strcmp(funcName, "vkCmdSetDepthBias")) return vkCmdSetDepthBias;
  124. if (!strcmp(funcName, "vkCmdSetBlendConstants")) return vkCmdSetBlendConstants;
  125. if (!strcmp(funcName, "vkCmdSetDepthBounds")) return vkCmdSetDepthBounds;
  126. if (!strcmp(funcName, "vkCmdSetStencilCompareMask")) return vkCmdSetStencilCompareMask;
  127. if (!strcmp(funcName, "vkCmdSetStencilWriteMask")) return vkCmdSetStencilWriteMask;
  128. if (!strcmp(funcName, "vkCmdSetStencilReference")) return vkCmdSetStencilReference;
  129. if (!strcmp(funcName, "vkCmdDraw")) return vkCmdDraw;
  130. if (!strcmp(funcName, "vkCmdDrawIndexed")) return vkCmdDrawIndexed;
  131. if (!strcmp(funcName, "vkCmdDrawIndirect")) return vkCmdDrawIndirect;
  132. if (!strcmp(funcName, "vkCmdDrawIndexedIndirect")) return vkCmdDrawIndexedIndirect;
  133. if (!strcmp(funcName, "vkCmdDispatch")) return vkCmdDispatch;
  134. if (!strcmp(funcName, "vkCmdDispatchIndirect")) return vkCmdDispatchIndirect;
  135. if (!strcmp(funcName, "vkCmdCopyBuffer")) return vkCmdCopyBuffer;
  136. if (!strcmp(funcName, "vkCmdCopyImage")) return vkCmdCopyImage;
  137. if (!strcmp(funcName, "vkCmdBlitImage")) return vkCmdBlitImage;
  138. if (!strcmp(funcName, "vkCmdCopyBufferToImage")) return vkCmdCopyBufferToImage;
  139. if (!strcmp(funcName, "vkCmdCopyImageToBuffer")) return vkCmdCopyImageToBuffer;
  140. if (!strcmp(funcName, "vkCmdUpdateBuffer")) return vkCmdUpdateBuffer;
  141. if (!strcmp(funcName, "vkCmdFillBuffer")) return vkCmdFillBuffer;
  142. if (!strcmp(funcName, "vkCmdClearColorImage")) return vkCmdClearColorImage;
  143. if (!strcmp(funcName, "vkCmdClearDepthStencilImage")) return vkCmdClearDepthStencilImage;
  144. if (!strcmp(funcName, "vkCmdClearAttachments")) return vkCmdClearAttachments;
  145. if (!strcmp(funcName, "vkCmdResolveImage")) return vkCmdResolveImage;
  146. if (!strcmp(funcName, "vkCmdSetEvent")) return vkCmdSetEvent;
  147. if (!strcmp(funcName, "vkCmdResetEvent")) return vkCmdResetEvent;
  148. if (!strcmp(funcName, "vkCmdWaitEvents")) return vkCmdWaitEvents;
  149. if (!strcmp(funcName, "vkCmdPipelineBarrier")) return vkCmdPipelineBarrier;
  150. if (!strcmp(funcName, "vkCmdBeginQuery")) return vkCmdBeginQuery;
  151. if (!strcmp(funcName, "vkCmdEndQuery")) return vkCmdEndQuery;
  152. if (!strcmp(funcName, "vkCmdResetQueryPool")) return vkCmdResetQueryPool;
  153. if (!strcmp(funcName, "vkCmdWriteTimestamp")) return vkCmdWriteTimestamp;
  154. if (!strcmp(funcName, "vkCmdCopyQueryPoolResults")) return vkCmdCopyQueryPoolResults;
  155. if (!strcmp(funcName, "vkCmdPushConstants")) return vkCmdPushConstants;
  156. if (!strcmp(funcName, "vkCmdBeginRenderPass")) return vkCmdBeginRenderPass;
  157. if (!strcmp(funcName, "vkCmdNextSubpass")) return vkCmdNextSubpass;
  158. if (!strcmp(funcName, "vkCmdEndRenderPass")) return vkCmdEndRenderPass;
  159. if (!strcmp(funcName, "vkCmdExecuteCommands")) return vkCmdExecuteCommands;
  160. // Core 1.1 functions
  161. if (!strcmp(funcName, "vkEnumeratePhysicalDeviceGroups")) return vkEnumeratePhysicalDeviceGroups;
  162. if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures2")) return vkGetPhysicalDeviceFeatures2;
  163. if (!strcmp(funcName, "vkGetPhysicalDeviceProperties2")) return vkGetPhysicalDeviceProperties2;
  164. if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties2")) return vkGetPhysicalDeviceFormatProperties2;
  165. if (!strcmp(funcName, "vkGetPhysicalDeviceImageFormatProperties2")) return vkGetPhysicalDeviceImageFormatProperties2;
  166. if (!strcmp(funcName, "vkGetPhysicalDeviceQueueFamilyProperties2")) return vkGetPhysicalDeviceQueueFamilyProperties2;
  167. if (!strcmp(funcName, "vkGetPhysicalDeviceMemoryProperties2")) return vkGetPhysicalDeviceMemoryProperties2;
  168. if (!strcmp(funcName, "vkGetPhysicalDeviceSparseImageFormatProperties2"))
  169. return vkGetPhysicalDeviceSparseImageFormatProperties2;
  170. if (!strcmp(funcName, "vkGetPhysicalDeviceExternalBufferProperties")) return vkGetPhysicalDeviceExternalBufferProperties;
  171. if (!strcmp(funcName, "vkGetPhysicalDeviceExternalSemaphoreProperties")) return vkGetPhysicalDeviceExternalSemaphoreProperties;
  172. if (!strcmp(funcName, "vkGetPhysicalDeviceExternalFenceProperties")) return vkGetPhysicalDeviceExternalFenceProperties;
  173. if (!strcmp(funcName, "vkBindBufferMemory2")) return vkBindBufferMemory2;
  174. if (!strcmp(funcName, "vkBindImageMemory2")) return vkBindImageMemory2;
  175. if (!strcmp(funcName, "vkGetDeviceGroupPeerMemoryFeatures")) return vkGetDeviceGroupPeerMemoryFeatures;
  176. if (!strcmp(funcName, "vkCmdSetDeviceMask")) return vkCmdSetDeviceMask;
  177. if (!strcmp(funcName, "vkCmdDispatchBase")) return vkCmdDispatchBase;
  178. if (!strcmp(funcName, "vkGetImageMemoryRequirements2")) return vkGetImageMemoryRequirements2;
  179. if (!strcmp(funcName, "vkTrimCommandPool")) return vkTrimCommandPool;
  180. if (!strcmp(funcName, "vkGetDeviceQueue2")) return vkGetDeviceQueue2;
  181. if (!strcmp(funcName, "vkCreateSamplerYcbcrConversion")) return vkCreateSamplerYcbcrConversion;
  182. if (!strcmp(funcName, "vkDestroySamplerYcbcrConversion")) return vkDestroySamplerYcbcrConversion;
  183. if (!strcmp(funcName, "vkGetDescriptorSetLayoutSupport")) return vkGetDescriptorSetLayoutSupport;
  184. if (!strcmp(funcName, "vkCreateDescriptorUpdateTemplate")) return vkCreateDescriptorUpdateTemplate;
  185. if (!strcmp(funcName, "vkDestroyDescriptorUpdateTemplate")) return vkDestroyDescriptorUpdateTemplate;
  186. if (!strcmp(funcName, "vkUpdateDescriptorSetWithTemplate")) return vkUpdateDescriptorSetWithTemplate;
  187. if (!strcmp(funcName, "vkGetImageSparseMemoryRequirements2")) return vkGetImageSparseMemoryRequirements2;
  188. if (!strcmp(funcName, "vkGetBufferMemoryRequirements2")) return vkGetBufferMemoryRequirements2;
  189. // Core 1.2 functions
  190. if (!strcmp(funcName, "vkCreateRenderPass2")) return vkCreateRenderPass2;
  191. if (!strcmp(funcName, "vkCmdBeginRenderPass2")) return vkCmdBeginRenderPass2;
  192. if (!strcmp(funcName, "vkCmdNextSubpass2")) return vkCmdNextSubpass2;
  193. if (!strcmp(funcName, "vkCmdEndRenderPass2")) return vkCmdEndRenderPass2;
  194. if (!strcmp(funcName, "vkCmdDrawIndirectCount")) return vkCmdDrawIndirectCount;
  195. if (!strcmp(funcName, "vkCmdDrawIndexedIndirectCount")) return vkCmdDrawIndexedIndirectCount;
  196. if (!strcmp(funcName, "vkGetSemaphoreCounterValue")) return vkGetSemaphoreCounterValue;
  197. if (!strcmp(funcName, "vkWaitSemaphores")) return vkWaitSemaphores;
  198. if (!strcmp(funcName, "vkSignalSemaphore")) return vkSignalSemaphore;
  199. if (!strcmp(funcName, "vkGetBufferDeviceAddress")) return vkGetBufferDeviceAddress;
  200. if (!strcmp(funcName, "vkGetBufferOpaqueCaptureAddress")) return vkGetBufferOpaqueCaptureAddress;
  201. if (!strcmp(funcName, "vkGetDeviceMemoryOpaqueCaptureAddress")) return vkGetDeviceMemoryOpaqueCaptureAddress;
  202. if (!strcmp(funcName, "vkResetQueryPool")) return vkResetQueryPool;
  203. // Instance extensions
  204. void *addr;
  205. if (debug_utils_InstanceGpa(inst, funcName, &addr)) return addr;
  206. if (wsi_swapchain_instance_gpa(inst, funcName, &addr)) return addr;
  207. if (extension_instance_gpa(inst, funcName, &addr)) return addr;
  208. // Unknown physical device extensions
  209. if (loader_phys_dev_ext_gpa(inst, funcName, true, &addr, NULL)) return addr;
  210. // Unknown device extensions
  211. addr = loader_dev_ext_gpa(inst, funcName);
  212. return addr;
  213. }
  214. static inline void *globalGetProcAddr(const char *name) {
  215. if (!name || name[0] != 'v' || name[1] != 'k') return NULL;
  216. name += 2;
  217. if (!strcmp(name, "CreateInstance")) return vkCreateInstance;
  218. if (!strcmp(name, "EnumerateInstanceExtensionProperties")) return vkEnumerateInstanceExtensionProperties;
  219. if (!strcmp(name, "EnumerateInstanceLayerProperties")) return vkEnumerateInstanceLayerProperties;
  220. if (!strcmp(name, "EnumerateInstanceVersion")) return vkEnumerateInstanceVersion;
  221. if (!strcmp(name, "GetInstanceProcAddr")) return vkGetInstanceProcAddr;
  222. return NULL;
  223. }
  224. static inline void *loader_non_passthrough_gdpa(const char *name) {
  225. if (!name || name[0] != 'v' || name[1] != 'k') return NULL;
  226. name += 2;
  227. if (!strcmp(name, "GetDeviceProcAddr")) return vkGetDeviceProcAddr;
  228. if (!strcmp(name, "DestroyDevice")) return vkDestroyDevice;
  229. if (!strcmp(name, "GetDeviceQueue")) return vkGetDeviceQueue;
  230. if (!strcmp(name, "GetDeviceQueue2")) return vkGetDeviceQueue2;
  231. if (!strcmp(name, "AllocateCommandBuffers")) return vkAllocateCommandBuffers;
  232. return NULL;
  233. }