GrVkInterface.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. /*
  2. * Copyright 2015 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "include/gpu/vk/GrVkBackendContext.h"
  8. #include "include/gpu/vk/GrVkExtensions.h"
  9. #include "src/gpu/vk/GrVkInterface.h"
  10. #include "src/gpu/vk/GrVkUtil.h"
  11. #define ACQUIRE_PROC(name, instance, device) \
  12. fFunctions.f##name = reinterpret_cast<PFN_vk##name>(getProc("vk" #name, instance, device))
  13. #define ACQUIRE_PROC_SUFFIX(name, suffix, instance, device) \
  14. fFunctions.f##name = \
  15. reinterpret_cast<PFN_vk##name##suffix>(getProc("vk" #name #suffix, instance, device))
  16. GrVkInterface::GrVkInterface(GrVkGetProc getProc,
  17. VkInstance instance,
  18. VkDevice device,
  19. uint32_t instanceVersion,
  20. uint32_t physicalDeviceVersion,
  21. const GrVkExtensions* extensions) {
  22. if (getProc == nullptr) {
  23. return;
  24. }
  25. // Global/Loader Procs.
  26. ACQUIRE_PROC(CreateInstance, VK_NULL_HANDLE, VK_NULL_HANDLE);
  27. ACQUIRE_PROC(EnumerateInstanceExtensionProperties, VK_NULL_HANDLE, VK_NULL_HANDLE);
  28. ACQUIRE_PROC(EnumerateInstanceLayerProperties, VK_NULL_HANDLE, VK_NULL_HANDLE);
  29. // Instance Procs.
  30. ACQUIRE_PROC(EnumeratePhysicalDevices, instance, VK_NULL_HANDLE);
  31. ACQUIRE_PROC(GetPhysicalDeviceFeatures, instance, VK_NULL_HANDLE);
  32. ACQUIRE_PROC(GetPhysicalDeviceFormatProperties, instance, VK_NULL_HANDLE);
  33. ACQUIRE_PROC(GetPhysicalDeviceImageFormatProperties, instance, VK_NULL_HANDLE);
  34. ACQUIRE_PROC(GetPhysicalDeviceProperties, instance, VK_NULL_HANDLE);
  35. ACQUIRE_PROC(GetPhysicalDeviceQueueFamilyProperties, instance, VK_NULL_HANDLE);
  36. ACQUIRE_PROC(GetPhysicalDeviceMemoryProperties, instance, VK_NULL_HANDLE);
  37. ACQUIRE_PROC(GetPhysicalDeviceSparseImageFormatProperties, instance, VK_NULL_HANDLE);
  38. ACQUIRE_PROC(DestroyInstance, instance, VK_NULL_HANDLE);
  39. ACQUIRE_PROC(CreateDevice, instance, VK_NULL_HANDLE);
  40. ACQUIRE_PROC(DestroyDevice, instance, VK_NULL_HANDLE);
  41. ACQUIRE_PROC(EnumerateDeviceExtensionProperties, instance, VK_NULL_HANDLE);
  42. ACQUIRE_PROC(EnumerateDeviceLayerProperties, instance, VK_NULL_HANDLE);
  43. // Device Procs.
  44. ACQUIRE_PROC(GetDeviceQueue, VK_NULL_HANDLE, device);
  45. ACQUIRE_PROC(QueueSubmit, VK_NULL_HANDLE, device);
  46. ACQUIRE_PROC(QueueWaitIdle, VK_NULL_HANDLE, device);
  47. ACQUIRE_PROC(DeviceWaitIdle, VK_NULL_HANDLE, device);
  48. ACQUIRE_PROC(AllocateMemory, VK_NULL_HANDLE, device);
  49. ACQUIRE_PROC(FreeMemory, VK_NULL_HANDLE, device);
  50. ACQUIRE_PROC(MapMemory, VK_NULL_HANDLE, device);
  51. ACQUIRE_PROC(UnmapMemory, VK_NULL_HANDLE, device);
  52. ACQUIRE_PROC(FlushMappedMemoryRanges, VK_NULL_HANDLE, device);
  53. ACQUIRE_PROC(InvalidateMappedMemoryRanges, VK_NULL_HANDLE, device);
  54. ACQUIRE_PROC(GetDeviceMemoryCommitment, VK_NULL_HANDLE, device);
  55. ACQUIRE_PROC(BindBufferMemory, VK_NULL_HANDLE, device);
  56. ACQUIRE_PROC(BindImageMemory, VK_NULL_HANDLE, device);
  57. ACQUIRE_PROC(GetBufferMemoryRequirements, VK_NULL_HANDLE, device);
  58. ACQUIRE_PROC(GetImageMemoryRequirements, VK_NULL_HANDLE, device);
  59. ACQUIRE_PROC(GetImageSparseMemoryRequirements, VK_NULL_HANDLE, device);
  60. ACQUIRE_PROC(QueueBindSparse, VK_NULL_HANDLE, device);
  61. ACQUIRE_PROC(CreateFence, VK_NULL_HANDLE, device);
  62. ACQUIRE_PROC(DestroyFence, VK_NULL_HANDLE, device);
  63. ACQUIRE_PROC(ResetFences, VK_NULL_HANDLE, device);
  64. ACQUIRE_PROC(GetFenceStatus, VK_NULL_HANDLE, device);
  65. ACQUIRE_PROC(WaitForFences, VK_NULL_HANDLE, device);
  66. ACQUIRE_PROC(CreateSemaphore, VK_NULL_HANDLE, device);
  67. ACQUIRE_PROC(DestroySemaphore, VK_NULL_HANDLE, device);
  68. ACQUIRE_PROC(CreateEvent, VK_NULL_HANDLE, device);
  69. ACQUIRE_PROC(DestroyEvent, VK_NULL_HANDLE, device);
  70. ACQUIRE_PROC(GetEventStatus, VK_NULL_HANDLE, device);
  71. ACQUIRE_PROC(SetEvent, VK_NULL_HANDLE, device);
  72. ACQUIRE_PROC(ResetEvent, VK_NULL_HANDLE, device);
  73. ACQUIRE_PROC(CreateQueryPool, VK_NULL_HANDLE, device);
  74. ACQUIRE_PROC(DestroyQueryPool, VK_NULL_HANDLE, device);
  75. ACQUIRE_PROC(GetQueryPoolResults, VK_NULL_HANDLE, device);
  76. ACQUIRE_PROC(CreateBuffer, VK_NULL_HANDLE, device);
  77. ACQUIRE_PROC(DestroyBuffer, VK_NULL_HANDLE, device);
  78. ACQUIRE_PROC(CreateBufferView, VK_NULL_HANDLE, device);
  79. ACQUIRE_PROC(DestroyBufferView, VK_NULL_HANDLE, device);
  80. ACQUIRE_PROC(CreateImage, VK_NULL_HANDLE, device);
  81. ACQUIRE_PROC(DestroyImage, VK_NULL_HANDLE, device);
  82. ACQUIRE_PROC(GetImageSubresourceLayout, VK_NULL_HANDLE, device);
  83. ACQUIRE_PROC(CreateImageView, VK_NULL_HANDLE, device);
  84. ACQUIRE_PROC(DestroyImageView, VK_NULL_HANDLE, device);
  85. ACQUIRE_PROC(CreateShaderModule, VK_NULL_HANDLE, device);
  86. ACQUIRE_PROC(DestroyShaderModule, VK_NULL_HANDLE, device);
  87. ACQUIRE_PROC(CreatePipelineCache, VK_NULL_HANDLE, device);
  88. ACQUIRE_PROC(DestroyPipelineCache, VK_NULL_HANDLE, device);
  89. ACQUIRE_PROC(GetPipelineCacheData, VK_NULL_HANDLE, device);
  90. ACQUIRE_PROC(MergePipelineCaches, VK_NULL_HANDLE, device);
  91. ACQUIRE_PROC(CreateGraphicsPipelines, VK_NULL_HANDLE, device);
  92. ACQUIRE_PROC(CreateComputePipelines, VK_NULL_HANDLE, device);
  93. ACQUIRE_PROC(DestroyPipeline, VK_NULL_HANDLE, device);
  94. ACQUIRE_PROC(CreatePipelineLayout, VK_NULL_HANDLE, device);
  95. ACQUIRE_PROC(DestroyPipelineLayout, VK_NULL_HANDLE, device);
  96. ACQUIRE_PROC(CreateSampler, VK_NULL_HANDLE, device);
  97. ACQUIRE_PROC(DestroySampler, VK_NULL_HANDLE, device);
  98. ACQUIRE_PROC(CreateDescriptorSetLayout, VK_NULL_HANDLE, device);
  99. ACQUIRE_PROC(DestroyDescriptorSetLayout, VK_NULL_HANDLE, device);
  100. ACQUIRE_PROC(CreateDescriptorPool, VK_NULL_HANDLE, device);
  101. ACQUIRE_PROC(DestroyDescriptorPool, VK_NULL_HANDLE, device);
  102. ACQUIRE_PROC(ResetDescriptorPool, VK_NULL_HANDLE, device);
  103. ACQUIRE_PROC(AllocateDescriptorSets, VK_NULL_HANDLE, device);
  104. ACQUIRE_PROC(FreeDescriptorSets, VK_NULL_HANDLE, device);
  105. ACQUIRE_PROC(UpdateDescriptorSets, VK_NULL_HANDLE, device);
  106. ACQUIRE_PROC(CreateFramebuffer, VK_NULL_HANDLE, device);
  107. ACQUIRE_PROC(DestroyFramebuffer, VK_NULL_HANDLE, device);
  108. ACQUIRE_PROC(CreateRenderPass, VK_NULL_HANDLE, device);
  109. ACQUIRE_PROC(DestroyRenderPass, VK_NULL_HANDLE, device);
  110. ACQUIRE_PROC(GetRenderAreaGranularity, VK_NULL_HANDLE, device);
  111. ACQUIRE_PROC(CreateCommandPool, VK_NULL_HANDLE, device);
  112. ACQUIRE_PROC(DestroyCommandPool, VK_NULL_HANDLE, device);
  113. ACQUIRE_PROC(ResetCommandPool, VK_NULL_HANDLE, device);
  114. ACQUIRE_PROC(AllocateCommandBuffers, VK_NULL_HANDLE, device);
  115. ACQUIRE_PROC(FreeCommandBuffers, VK_NULL_HANDLE, device);
  116. ACQUIRE_PROC(BeginCommandBuffer, VK_NULL_HANDLE, device);
  117. ACQUIRE_PROC(EndCommandBuffer, VK_NULL_HANDLE, device);
  118. ACQUIRE_PROC(ResetCommandBuffer, VK_NULL_HANDLE, device);
  119. ACQUIRE_PROC(CmdBindPipeline, VK_NULL_HANDLE, device);
  120. ACQUIRE_PROC(CmdSetViewport, VK_NULL_HANDLE, device);
  121. ACQUIRE_PROC(CmdSetScissor, VK_NULL_HANDLE, device);
  122. ACQUIRE_PROC(CmdSetLineWidth, VK_NULL_HANDLE, device);
  123. ACQUIRE_PROC(CmdSetDepthBias, VK_NULL_HANDLE, device);
  124. ACQUIRE_PROC(CmdSetBlendConstants, VK_NULL_HANDLE, device);
  125. ACQUIRE_PROC(CmdSetDepthBounds, VK_NULL_HANDLE, device);
  126. ACQUIRE_PROC(CmdSetStencilCompareMask, VK_NULL_HANDLE, device);
  127. ACQUIRE_PROC(CmdSetStencilWriteMask, VK_NULL_HANDLE, device);
  128. ACQUIRE_PROC(CmdSetStencilReference, VK_NULL_HANDLE, device);
  129. ACQUIRE_PROC(CmdBindDescriptorSets, VK_NULL_HANDLE, device);
  130. ACQUIRE_PROC(CmdBindIndexBuffer, VK_NULL_HANDLE, device);
  131. ACQUIRE_PROC(CmdBindVertexBuffers, VK_NULL_HANDLE, device);
  132. ACQUIRE_PROC(CmdDraw, VK_NULL_HANDLE, device);
  133. ACQUIRE_PROC(CmdDrawIndexed, VK_NULL_HANDLE, device);
  134. ACQUIRE_PROC(CmdDrawIndirect, VK_NULL_HANDLE, device);
  135. ACQUIRE_PROC(CmdDrawIndexedIndirect, VK_NULL_HANDLE, device);
  136. ACQUIRE_PROC(CmdDispatch, VK_NULL_HANDLE, device);
  137. ACQUIRE_PROC(CmdDispatchIndirect, VK_NULL_HANDLE, device);
  138. ACQUIRE_PROC(CmdCopyBuffer, VK_NULL_HANDLE, device);
  139. ACQUIRE_PROC(CmdCopyImage, VK_NULL_HANDLE, device);
  140. ACQUIRE_PROC(CmdBlitImage, VK_NULL_HANDLE, device);
  141. ACQUIRE_PROC(CmdCopyBufferToImage, VK_NULL_HANDLE, device);
  142. ACQUIRE_PROC(CmdCopyImageToBuffer, VK_NULL_HANDLE, device);
  143. ACQUIRE_PROC(CmdUpdateBuffer, VK_NULL_HANDLE, device);
  144. ACQUIRE_PROC(CmdFillBuffer, VK_NULL_HANDLE, device);
  145. ACQUIRE_PROC(CmdClearColorImage, VK_NULL_HANDLE, device);
  146. ACQUIRE_PROC(CmdClearDepthStencilImage, VK_NULL_HANDLE, device);
  147. ACQUIRE_PROC(CmdClearAttachments, VK_NULL_HANDLE, device);
  148. ACQUIRE_PROC(CmdResolveImage, VK_NULL_HANDLE, device);
  149. ACQUIRE_PROC(CmdSetEvent, VK_NULL_HANDLE, device);
  150. ACQUIRE_PROC(CmdResetEvent, VK_NULL_HANDLE, device);
  151. ACQUIRE_PROC(CmdWaitEvents, VK_NULL_HANDLE, device);
  152. ACQUIRE_PROC(CmdPipelineBarrier, VK_NULL_HANDLE, device);
  153. ACQUIRE_PROC(CmdBeginQuery, VK_NULL_HANDLE, device);
  154. ACQUIRE_PROC(CmdEndQuery, VK_NULL_HANDLE, device);
  155. ACQUIRE_PROC(CmdResetQueryPool, VK_NULL_HANDLE, device);
  156. ACQUIRE_PROC(CmdWriteTimestamp, VK_NULL_HANDLE, device);
  157. ACQUIRE_PROC(CmdCopyQueryPoolResults, VK_NULL_HANDLE, device);
  158. ACQUIRE_PROC(CmdPushConstants, VK_NULL_HANDLE, device);
  159. ACQUIRE_PROC(CmdBeginRenderPass, VK_NULL_HANDLE, device);
  160. ACQUIRE_PROC(CmdNextSubpass, VK_NULL_HANDLE, device);
  161. ACQUIRE_PROC(CmdEndRenderPass, VK_NULL_HANDLE, device);
  162. ACQUIRE_PROC(CmdExecuteCommands, VK_NULL_HANDLE, device);
  163. // Functions for VK_KHR_get_physical_device_properties2
  164. if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0)) {
  165. ACQUIRE_PROC(GetPhysicalDeviceFeatures2, instance, VK_NULL_HANDLE);
  166. ACQUIRE_PROC(GetPhysicalDeviceProperties2, instance, VK_NULL_HANDLE);
  167. ACQUIRE_PROC(GetPhysicalDeviceFormatProperties2, instance, VK_NULL_HANDLE);
  168. ACQUIRE_PROC(GetPhysicalDeviceImageFormatProperties2, instance, VK_NULL_HANDLE);
  169. ACQUIRE_PROC(GetPhysicalDeviceQueueFamilyProperties2, instance, VK_NULL_HANDLE);
  170. ACQUIRE_PROC(GetPhysicalDeviceMemoryProperties2, instance, VK_NULL_HANDLE);
  171. ACQUIRE_PROC(GetPhysicalDeviceSparseImageFormatProperties2, instance, VK_NULL_HANDLE);
  172. } else if (extensions->hasExtension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
  173. 1)) {
  174. ACQUIRE_PROC_SUFFIX(GetPhysicalDeviceFeatures2, KHR, instance, VK_NULL_HANDLE);
  175. ACQUIRE_PROC_SUFFIX(GetPhysicalDeviceProperties2, KHR, instance, VK_NULL_HANDLE);
  176. ACQUIRE_PROC_SUFFIX(GetPhysicalDeviceFormatProperties2, KHR, instance, VK_NULL_HANDLE);
  177. ACQUIRE_PROC_SUFFIX(GetPhysicalDeviceImageFormatProperties2, KHR, instance, VK_NULL_HANDLE);
  178. ACQUIRE_PROC_SUFFIX(GetPhysicalDeviceQueueFamilyProperties2, KHR, instance, VK_NULL_HANDLE);
  179. ACQUIRE_PROC_SUFFIX(GetPhysicalDeviceMemoryProperties2, KHR, instance, VK_NULL_HANDLE);
  180. ACQUIRE_PROC_SUFFIX(GetPhysicalDeviceSparseImageFormatProperties2, KHR, instance,
  181. VK_NULL_HANDLE);
  182. }
  183. // Functions for VK_KHR_get_memory_requirements2
  184. if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0)) {
  185. ACQUIRE_PROC(GetImageMemoryRequirements2, VK_NULL_HANDLE, device);
  186. ACQUIRE_PROC(GetBufferMemoryRequirements2, VK_NULL_HANDLE, device);
  187. ACQUIRE_PROC(GetImageSparseMemoryRequirements2, VK_NULL_HANDLE, device);
  188. } else if (extensions->hasExtension(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, 1)) {
  189. ACQUIRE_PROC_SUFFIX(GetImageMemoryRequirements2, KHR, VK_NULL_HANDLE, device);
  190. ACQUIRE_PROC_SUFFIX(GetBufferMemoryRequirements2, KHR, VK_NULL_HANDLE, device);
  191. ACQUIRE_PROC_SUFFIX(GetImageSparseMemoryRequirements2, KHR, VK_NULL_HANDLE, device);
  192. }
  193. // Functions for VK_KHR_bind_memory2
  194. if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0)) {
  195. ACQUIRE_PROC(BindBufferMemory2, VK_NULL_HANDLE, device);
  196. ACQUIRE_PROC(BindImageMemory2, VK_NULL_HANDLE, device);
  197. } else if (extensions->hasExtension(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME, 1)) {
  198. ACQUIRE_PROC_SUFFIX(BindBufferMemory2, KHR, VK_NULL_HANDLE, device);
  199. ACQUIRE_PROC_SUFFIX(BindImageMemory2, KHR, VK_NULL_HANDLE, device);
  200. }
  201. // Functions for VK_KHR_maintenance1 or vulkan 1.1
  202. if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0)) {
  203. ACQUIRE_PROC(TrimCommandPool, VK_NULL_HANDLE, device);
  204. } else if (extensions->hasExtension(VK_KHR_MAINTENANCE1_EXTENSION_NAME, 1)) {
  205. ACQUIRE_PROC_SUFFIX(TrimCommandPool, KHR, VK_NULL_HANDLE, device);
  206. }
  207. // Functions for VK_KHR_maintenance3 or vulkan 1.1
  208. if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0)) {
  209. ACQUIRE_PROC(GetDescriptorSetLayoutSupport, VK_NULL_HANDLE, device);
  210. } else if (extensions->hasExtension(VK_KHR_MAINTENANCE3_EXTENSION_NAME, 1)) {
  211. ACQUIRE_PROC_SUFFIX(GetDescriptorSetLayoutSupport, KHR, VK_NULL_HANDLE, device);
  212. }
  213. // Functions for VK_KHR_external_memory_capabilities
  214. if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0)) {
  215. ACQUIRE_PROC(GetPhysicalDeviceExternalBufferProperties, instance, VK_NULL_HANDLE);
  216. } else if (extensions->hasExtension(VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME, 1)) {
  217. ACQUIRE_PROC_SUFFIX(GetPhysicalDeviceExternalBufferProperties, KHR, instance,
  218. VK_NULL_HANDLE);
  219. }
  220. // Functions for VK_KHR_sampler_ycbcr_conversion
  221. if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0)) {
  222. ACQUIRE_PROC(CreateSamplerYcbcrConversion, VK_NULL_HANDLE, device);
  223. ACQUIRE_PROC(DestroySamplerYcbcrConversion, VK_NULL_HANDLE, device);
  224. } else if (extensions->hasExtension(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME, 1)) {
  225. ACQUIRE_PROC_SUFFIX(CreateSamplerYcbcrConversion, KHR, VK_NULL_HANDLE, device);
  226. ACQUIRE_PROC_SUFFIX(DestroySamplerYcbcrConversion, KHR, VK_NULL_HANDLE, device);
  227. }
  228. #ifdef SK_BUILD_FOR_ANDROID
  229. // Functions for VK_ANDROID_external_memory_android_hardware_buffer
  230. if (extensions->hasExtension(
  231. VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME, 2)) {
  232. ACQUIRE_PROC_SUFFIX(GetAndroidHardwareBufferProperties, ANDROID, VK_NULL_HANDLE, device);
  233. ACQUIRE_PROC_SUFFIX(GetMemoryAndroidHardwareBuffer, ANDROID, VK_NULL_HANDLE, device);
  234. }
  235. #endif
  236. }
  237. #ifdef SK_DEBUG
  238. static int kIsDebug = 1;
  239. #else
  240. static int kIsDebug = 0;
  241. #endif
  242. #define RETURN_FALSE_INTERFACE \
  243. if (kIsDebug) { SkDebugf("%s:%d GrVkInterface::validate() failed.\n", __FILE__, __LINE__); } \
  244. return false;
  245. bool GrVkInterface::validate(uint32_t instanceVersion, uint32_t physicalDeviceVersion,
  246. const GrVkExtensions* extensions) const {
  247. // functions that are always required
  248. if (nullptr == fFunctions.fCreateInstance ||
  249. nullptr == fFunctions.fDestroyInstance ||
  250. nullptr == fFunctions.fEnumeratePhysicalDevices ||
  251. nullptr == fFunctions.fGetPhysicalDeviceFeatures ||
  252. nullptr == fFunctions.fGetPhysicalDeviceFormatProperties ||
  253. nullptr == fFunctions.fGetPhysicalDeviceImageFormatProperties ||
  254. nullptr == fFunctions.fGetPhysicalDeviceProperties ||
  255. nullptr == fFunctions.fGetPhysicalDeviceQueueFamilyProperties ||
  256. nullptr == fFunctions.fGetPhysicalDeviceMemoryProperties ||
  257. nullptr == fFunctions.fCreateDevice ||
  258. nullptr == fFunctions.fDestroyDevice ||
  259. nullptr == fFunctions.fEnumerateInstanceExtensionProperties ||
  260. nullptr == fFunctions.fEnumerateDeviceExtensionProperties ||
  261. nullptr == fFunctions.fEnumerateInstanceLayerProperties ||
  262. nullptr == fFunctions.fEnumerateDeviceLayerProperties ||
  263. nullptr == fFunctions.fGetDeviceQueue ||
  264. nullptr == fFunctions.fQueueSubmit ||
  265. nullptr == fFunctions.fQueueWaitIdle ||
  266. nullptr == fFunctions.fDeviceWaitIdle ||
  267. nullptr == fFunctions.fAllocateMemory ||
  268. nullptr == fFunctions.fFreeMemory ||
  269. nullptr == fFunctions.fMapMemory ||
  270. nullptr == fFunctions.fUnmapMemory ||
  271. nullptr == fFunctions.fFlushMappedMemoryRanges ||
  272. nullptr == fFunctions.fInvalidateMappedMemoryRanges ||
  273. nullptr == fFunctions.fGetDeviceMemoryCommitment ||
  274. nullptr == fFunctions.fBindBufferMemory ||
  275. nullptr == fFunctions.fBindImageMemory ||
  276. nullptr == fFunctions.fGetBufferMemoryRequirements ||
  277. nullptr == fFunctions.fGetImageMemoryRequirements ||
  278. nullptr == fFunctions.fGetImageSparseMemoryRequirements ||
  279. nullptr == fFunctions.fGetPhysicalDeviceSparseImageFormatProperties ||
  280. nullptr == fFunctions.fQueueBindSparse ||
  281. nullptr == fFunctions.fCreateFence ||
  282. nullptr == fFunctions.fDestroyFence ||
  283. nullptr == fFunctions.fResetFences ||
  284. nullptr == fFunctions.fGetFenceStatus ||
  285. nullptr == fFunctions.fWaitForFences ||
  286. nullptr == fFunctions.fCreateSemaphore ||
  287. nullptr == fFunctions.fDestroySemaphore ||
  288. nullptr == fFunctions.fCreateEvent ||
  289. nullptr == fFunctions.fDestroyEvent ||
  290. nullptr == fFunctions.fGetEventStatus ||
  291. nullptr == fFunctions.fSetEvent ||
  292. nullptr == fFunctions.fResetEvent ||
  293. nullptr == fFunctions.fCreateQueryPool ||
  294. nullptr == fFunctions.fDestroyQueryPool ||
  295. nullptr == fFunctions.fGetQueryPoolResults ||
  296. nullptr == fFunctions.fCreateBuffer ||
  297. nullptr == fFunctions.fDestroyBuffer ||
  298. nullptr == fFunctions.fCreateBufferView ||
  299. nullptr == fFunctions.fDestroyBufferView ||
  300. nullptr == fFunctions.fCreateImage ||
  301. nullptr == fFunctions.fDestroyImage ||
  302. nullptr == fFunctions.fGetImageSubresourceLayout ||
  303. nullptr == fFunctions.fCreateImageView ||
  304. nullptr == fFunctions.fDestroyImageView ||
  305. nullptr == fFunctions.fCreateShaderModule ||
  306. nullptr == fFunctions.fDestroyShaderModule ||
  307. nullptr == fFunctions.fCreatePipelineCache ||
  308. nullptr == fFunctions.fDestroyPipelineCache ||
  309. nullptr == fFunctions.fGetPipelineCacheData ||
  310. nullptr == fFunctions.fMergePipelineCaches ||
  311. nullptr == fFunctions.fCreateGraphicsPipelines ||
  312. nullptr == fFunctions.fCreateComputePipelines ||
  313. nullptr == fFunctions.fDestroyPipeline ||
  314. nullptr == fFunctions.fCreatePipelineLayout ||
  315. nullptr == fFunctions.fDestroyPipelineLayout ||
  316. nullptr == fFunctions.fCreateSampler ||
  317. nullptr == fFunctions.fDestroySampler ||
  318. nullptr == fFunctions.fCreateDescriptorSetLayout ||
  319. nullptr == fFunctions.fDestroyDescriptorSetLayout ||
  320. nullptr == fFunctions.fCreateDescriptorPool ||
  321. nullptr == fFunctions.fDestroyDescriptorPool ||
  322. nullptr == fFunctions.fResetDescriptorPool ||
  323. nullptr == fFunctions.fAllocateDescriptorSets ||
  324. nullptr == fFunctions.fFreeDescriptorSets ||
  325. nullptr == fFunctions.fUpdateDescriptorSets ||
  326. nullptr == fFunctions.fCreateFramebuffer ||
  327. nullptr == fFunctions.fDestroyFramebuffer ||
  328. nullptr == fFunctions.fCreateRenderPass ||
  329. nullptr == fFunctions.fDestroyRenderPass ||
  330. nullptr == fFunctions.fGetRenderAreaGranularity ||
  331. nullptr == fFunctions.fCreateCommandPool ||
  332. nullptr == fFunctions.fDestroyCommandPool ||
  333. nullptr == fFunctions.fResetCommandPool ||
  334. nullptr == fFunctions.fAllocateCommandBuffers ||
  335. nullptr == fFunctions.fFreeCommandBuffers ||
  336. nullptr == fFunctions.fBeginCommandBuffer ||
  337. nullptr == fFunctions.fEndCommandBuffer ||
  338. nullptr == fFunctions.fResetCommandBuffer ||
  339. nullptr == fFunctions.fCmdBindPipeline ||
  340. nullptr == fFunctions.fCmdSetViewport ||
  341. nullptr == fFunctions.fCmdSetScissor ||
  342. nullptr == fFunctions.fCmdSetLineWidth ||
  343. nullptr == fFunctions.fCmdSetDepthBias ||
  344. nullptr == fFunctions.fCmdSetBlendConstants ||
  345. nullptr == fFunctions.fCmdSetDepthBounds ||
  346. nullptr == fFunctions.fCmdSetStencilCompareMask ||
  347. nullptr == fFunctions.fCmdSetStencilWriteMask ||
  348. nullptr == fFunctions.fCmdSetStencilReference ||
  349. nullptr == fFunctions.fCmdBindDescriptorSets ||
  350. nullptr == fFunctions.fCmdBindIndexBuffer ||
  351. nullptr == fFunctions.fCmdBindVertexBuffers ||
  352. nullptr == fFunctions.fCmdDraw ||
  353. nullptr == fFunctions.fCmdDrawIndexed ||
  354. nullptr == fFunctions.fCmdDrawIndirect ||
  355. nullptr == fFunctions.fCmdDrawIndexedIndirect ||
  356. nullptr == fFunctions.fCmdDispatch ||
  357. nullptr == fFunctions.fCmdDispatchIndirect ||
  358. nullptr == fFunctions.fCmdCopyBuffer ||
  359. nullptr == fFunctions.fCmdCopyImage ||
  360. nullptr == fFunctions.fCmdBlitImage ||
  361. nullptr == fFunctions.fCmdCopyBufferToImage ||
  362. nullptr == fFunctions.fCmdCopyImageToBuffer ||
  363. nullptr == fFunctions.fCmdUpdateBuffer ||
  364. nullptr == fFunctions.fCmdFillBuffer ||
  365. nullptr == fFunctions.fCmdClearColorImage ||
  366. nullptr == fFunctions.fCmdClearDepthStencilImage ||
  367. nullptr == fFunctions.fCmdClearAttachments ||
  368. nullptr == fFunctions.fCmdResolveImage ||
  369. nullptr == fFunctions.fCmdSetEvent ||
  370. nullptr == fFunctions.fCmdResetEvent ||
  371. nullptr == fFunctions.fCmdWaitEvents ||
  372. nullptr == fFunctions.fCmdPipelineBarrier ||
  373. nullptr == fFunctions.fCmdBeginQuery ||
  374. nullptr == fFunctions.fCmdEndQuery ||
  375. nullptr == fFunctions.fCmdResetQueryPool ||
  376. nullptr == fFunctions.fCmdWriteTimestamp ||
  377. nullptr == fFunctions.fCmdCopyQueryPoolResults ||
  378. nullptr == fFunctions.fCmdPushConstants ||
  379. nullptr == fFunctions.fCmdBeginRenderPass ||
  380. nullptr == fFunctions.fCmdNextSubpass ||
  381. nullptr == fFunctions.fCmdEndRenderPass ||
  382. nullptr == fFunctions.fCmdExecuteCommands) {
  383. RETURN_FALSE_INTERFACE
  384. }
  385. // Functions for VK_KHR_get_physical_device_properties2 or vulkan 1.1
  386. if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0) ||
  387. extensions->hasExtension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1)) {
  388. if (nullptr == fFunctions.fGetPhysicalDeviceFeatures2 ||
  389. nullptr == fFunctions.fGetPhysicalDeviceProperties2 ||
  390. nullptr == fFunctions.fGetPhysicalDeviceFormatProperties2 ||
  391. nullptr == fFunctions.fGetPhysicalDeviceImageFormatProperties2 ||
  392. nullptr == fFunctions.fGetPhysicalDeviceQueueFamilyProperties2 ||
  393. nullptr == fFunctions.fGetPhysicalDeviceMemoryProperties2 ||
  394. nullptr == fFunctions.fGetPhysicalDeviceSparseImageFormatProperties2) {
  395. RETURN_FALSE_INTERFACE
  396. }
  397. }
  398. // Functions for VK_KHR_get_memory_requirements2 or vulkan 1.1
  399. if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0) ||
  400. extensions->hasExtension(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, 1)) {
  401. if (nullptr == fFunctions.fGetImageMemoryRequirements2 ||
  402. nullptr == fFunctions.fGetBufferMemoryRequirements2 ||
  403. nullptr == fFunctions.fGetImageSparseMemoryRequirements2) {
  404. RETURN_FALSE_INTERFACE
  405. }
  406. }
  407. // Functions for VK_KHR_bind_memory2
  408. if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0) ||
  409. extensions->hasExtension(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME, 1)) {
  410. if (nullptr == fFunctions.fBindBufferMemory2 ||
  411. nullptr == fFunctions.fBindImageMemory2) {
  412. RETURN_FALSE_INTERFACE
  413. }
  414. }
  415. // Functions for VK_KHR_maintenance1 or vulkan 1.1
  416. if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0) ||
  417. extensions->hasExtension(VK_KHR_MAINTENANCE1_EXTENSION_NAME, 1)) {
  418. if (nullptr == fFunctions.fTrimCommandPool) {
  419. RETURN_FALSE_INTERFACE
  420. }
  421. }
  422. // Functions for VK_KHR_maintenance3 or vulkan 1.1
  423. if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0) ||
  424. extensions->hasExtension(VK_KHR_MAINTENANCE3_EXTENSION_NAME, 1)) {
  425. if (nullptr == fFunctions.fGetDescriptorSetLayoutSupport) {
  426. RETURN_FALSE_INTERFACE
  427. }
  428. }
  429. // Functions for VK_KHR_external_memory_capabilities
  430. if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0) ||
  431. extensions->hasExtension(VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME, 1)) {
  432. if (nullptr == fFunctions.fGetPhysicalDeviceExternalBufferProperties) {
  433. RETURN_FALSE_INTERFACE
  434. }
  435. }
  436. // Functions for VK_KHR_sampler_ycbcr_conversion
  437. if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0) ||
  438. extensions->hasExtension(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME, 1)) {
  439. if (nullptr == fFunctions.fCreateSamplerYcbcrConversion ||
  440. nullptr == fFunctions.fDestroySamplerYcbcrConversion) {
  441. RETURN_FALSE_INTERFACE
  442. }
  443. }
  444. #ifdef SK_BUILD_FOR_ANDROID
  445. // Functions for VK_ANDROID_external_memory_android_hardware_buffer
  446. if (extensions->hasExtension(
  447. VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME, 2)) {
  448. if (nullptr == fFunctions.fGetAndroidHardwareBufferProperties ||
  449. nullptr == fFunctions.fGetMemoryAndroidHardwareBuffer) {
  450. RETURN_FALSE_INTERFACE
  451. }
  452. }
  453. #endif
  454. return true;
  455. }