GrVkInterface.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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. #ifndef GrVkInterface_DEFINED
  8. #define GrVkInterface_DEFINED
  9. #include "include/core/SkRefCnt.h"
  10. #include "include/gpu/vk/GrVkBackendContext.h"
  11. #include "include/gpu/vk/GrVkTypes.h"
  12. class GrVkExtensions;
  13. ////////////////////////////////////////////////////////////////////////////////
  14. /**
  15. * GrContext uses the following interface to make all calls into Vulkan. When a
  16. * GrContext is created it is given a GrVkInterface. All functions that should be
  17. * available based on the Vulkan's version must be non-NULL or GrContext creation
  18. * will fail. This can be tested with the validate() method.
  19. */
  20. struct GrVkInterface : public SkRefCnt {
  21. private:
  22. // simple wrapper class that exists only to initialize a pointer to NULL
  23. template <typename FNPTR_TYPE> class VkPtr {
  24. public:
  25. VkPtr() : fPtr(NULL) {}
  26. VkPtr operator=(FNPTR_TYPE ptr) { fPtr = ptr; return *this; }
  27. operator FNPTR_TYPE() const { return fPtr; }
  28. private:
  29. FNPTR_TYPE fPtr;
  30. };
  31. typedef SkRefCnt INHERITED;
  32. public:
  33. GrVkInterface(GrVkGetProc getProc,
  34. VkInstance instance,
  35. VkDevice device,
  36. uint32_t instanceVersion,
  37. uint32_t physicalDeviceVersion,
  38. const GrVkExtensions*);
  39. // Validates that the GrVkInterface supports its advertised standard. This means the necessary
  40. // function pointers have been initialized for Vulkan version.
  41. bool validate(uint32_t instanceVersion, uint32_t physicalDeviceVersion,
  42. const GrVkExtensions*) const;
  43. /**
  44. * The function pointers are in a struct so that we can have a compiler generated assignment
  45. * operator.
  46. */
  47. struct Functions {
  48. VkPtr<PFN_vkCreateInstance> fCreateInstance;
  49. VkPtr<PFN_vkDestroyInstance> fDestroyInstance;
  50. VkPtr<PFN_vkEnumeratePhysicalDevices> fEnumeratePhysicalDevices;
  51. VkPtr<PFN_vkGetPhysicalDeviceFeatures> fGetPhysicalDeviceFeatures;
  52. VkPtr<PFN_vkGetPhysicalDeviceFormatProperties> fGetPhysicalDeviceFormatProperties;
  53. VkPtr<PFN_vkGetPhysicalDeviceImageFormatProperties> fGetPhysicalDeviceImageFormatProperties;
  54. VkPtr<PFN_vkGetPhysicalDeviceProperties> fGetPhysicalDeviceProperties;
  55. VkPtr<PFN_vkGetPhysicalDeviceQueueFamilyProperties> fGetPhysicalDeviceQueueFamilyProperties;
  56. VkPtr<PFN_vkGetPhysicalDeviceMemoryProperties> fGetPhysicalDeviceMemoryProperties;
  57. VkPtr<PFN_vkCreateDevice> fCreateDevice;
  58. VkPtr<PFN_vkDestroyDevice> fDestroyDevice;
  59. VkPtr<PFN_vkEnumerateInstanceExtensionProperties> fEnumerateInstanceExtensionProperties;
  60. VkPtr<PFN_vkEnumerateDeviceExtensionProperties> fEnumerateDeviceExtensionProperties;
  61. VkPtr<PFN_vkEnumerateInstanceLayerProperties> fEnumerateInstanceLayerProperties;
  62. VkPtr<PFN_vkEnumerateDeviceLayerProperties> fEnumerateDeviceLayerProperties;
  63. VkPtr<PFN_vkGetDeviceQueue> fGetDeviceQueue;
  64. VkPtr<PFN_vkQueueSubmit> fQueueSubmit;
  65. VkPtr<PFN_vkQueueWaitIdle> fQueueWaitIdle;
  66. VkPtr<PFN_vkDeviceWaitIdle> fDeviceWaitIdle;
  67. VkPtr<PFN_vkAllocateMemory> fAllocateMemory;
  68. VkPtr<PFN_vkFreeMemory> fFreeMemory;
  69. VkPtr<PFN_vkMapMemory> fMapMemory;
  70. VkPtr<PFN_vkUnmapMemory> fUnmapMemory;
  71. VkPtr<PFN_vkFlushMappedMemoryRanges> fFlushMappedMemoryRanges;
  72. VkPtr<PFN_vkInvalidateMappedMemoryRanges> fInvalidateMappedMemoryRanges;
  73. VkPtr<PFN_vkGetDeviceMemoryCommitment> fGetDeviceMemoryCommitment;
  74. VkPtr<PFN_vkBindBufferMemory> fBindBufferMemory;
  75. VkPtr<PFN_vkBindImageMemory> fBindImageMemory;
  76. VkPtr<PFN_vkGetBufferMemoryRequirements> fGetBufferMemoryRequirements;
  77. VkPtr<PFN_vkGetImageMemoryRequirements> fGetImageMemoryRequirements;
  78. VkPtr<PFN_vkGetImageSparseMemoryRequirements> fGetImageSparseMemoryRequirements;
  79. VkPtr<PFN_vkGetPhysicalDeviceSparseImageFormatProperties> fGetPhysicalDeviceSparseImageFormatProperties;
  80. VkPtr<PFN_vkQueueBindSparse> fQueueBindSparse;
  81. VkPtr<PFN_vkCreateFence> fCreateFence;
  82. VkPtr<PFN_vkDestroyFence> fDestroyFence;
  83. VkPtr<PFN_vkResetFences> fResetFences;
  84. VkPtr<PFN_vkGetFenceStatus> fGetFenceStatus;
  85. VkPtr<PFN_vkWaitForFences> fWaitForFences;
  86. VkPtr<PFN_vkCreateSemaphore> fCreateSemaphore;
  87. VkPtr<PFN_vkDestroySemaphore> fDestroySemaphore;
  88. VkPtr<PFN_vkCreateEvent> fCreateEvent;
  89. VkPtr<PFN_vkDestroyEvent> fDestroyEvent;
  90. VkPtr<PFN_vkGetEventStatus> fGetEventStatus;
  91. VkPtr<PFN_vkSetEvent> fSetEvent;
  92. VkPtr<PFN_vkResetEvent> fResetEvent;
  93. VkPtr<PFN_vkCreateQueryPool> fCreateQueryPool;
  94. VkPtr<PFN_vkDestroyQueryPool> fDestroyQueryPool;
  95. VkPtr<PFN_vkGetQueryPoolResults> fGetQueryPoolResults;
  96. VkPtr<PFN_vkCreateBuffer> fCreateBuffer;
  97. VkPtr<PFN_vkDestroyBuffer> fDestroyBuffer;
  98. VkPtr<PFN_vkCreateBufferView> fCreateBufferView;
  99. VkPtr<PFN_vkDestroyBufferView> fDestroyBufferView;
  100. VkPtr<PFN_vkCreateImage> fCreateImage;
  101. VkPtr<PFN_vkDestroyImage> fDestroyImage;
  102. VkPtr<PFN_vkGetImageSubresourceLayout> fGetImageSubresourceLayout;
  103. VkPtr<PFN_vkCreateImageView> fCreateImageView;
  104. VkPtr<PFN_vkDestroyImageView> fDestroyImageView;
  105. VkPtr<PFN_vkCreateShaderModule> fCreateShaderModule;
  106. VkPtr<PFN_vkDestroyShaderModule> fDestroyShaderModule;
  107. VkPtr<PFN_vkCreatePipelineCache> fCreatePipelineCache;
  108. VkPtr<PFN_vkDestroyPipelineCache> fDestroyPipelineCache;
  109. VkPtr<PFN_vkGetPipelineCacheData> fGetPipelineCacheData;
  110. VkPtr<PFN_vkMergePipelineCaches> fMergePipelineCaches;
  111. VkPtr<PFN_vkCreateGraphicsPipelines> fCreateGraphicsPipelines;
  112. VkPtr<PFN_vkCreateComputePipelines> fCreateComputePipelines;
  113. VkPtr<PFN_vkDestroyPipeline> fDestroyPipeline;
  114. VkPtr<PFN_vkCreatePipelineLayout> fCreatePipelineLayout;
  115. VkPtr<PFN_vkDestroyPipelineLayout> fDestroyPipelineLayout;
  116. VkPtr<PFN_vkCreateSampler> fCreateSampler;
  117. VkPtr<PFN_vkDestroySampler> fDestroySampler;
  118. VkPtr<PFN_vkCreateDescriptorSetLayout> fCreateDescriptorSetLayout;
  119. VkPtr<PFN_vkDestroyDescriptorSetLayout> fDestroyDescriptorSetLayout;
  120. VkPtr<PFN_vkCreateDescriptorPool> fCreateDescriptorPool;
  121. VkPtr<PFN_vkDestroyDescriptorPool> fDestroyDescriptorPool;
  122. VkPtr<PFN_vkResetDescriptorPool> fResetDescriptorPool;
  123. VkPtr<PFN_vkAllocateDescriptorSets> fAllocateDescriptorSets;
  124. VkPtr<PFN_vkFreeDescriptorSets> fFreeDescriptorSets;
  125. VkPtr<PFN_vkUpdateDescriptorSets> fUpdateDescriptorSets;
  126. VkPtr<PFN_vkCreateFramebuffer> fCreateFramebuffer;
  127. VkPtr<PFN_vkDestroyFramebuffer> fDestroyFramebuffer;
  128. VkPtr<PFN_vkCreateRenderPass> fCreateRenderPass;
  129. VkPtr<PFN_vkDestroyRenderPass> fDestroyRenderPass;
  130. VkPtr<PFN_vkGetRenderAreaGranularity> fGetRenderAreaGranularity;
  131. VkPtr<PFN_vkCreateCommandPool> fCreateCommandPool;
  132. VkPtr<PFN_vkDestroyCommandPool> fDestroyCommandPool;
  133. VkPtr<PFN_vkResetCommandPool> fResetCommandPool;
  134. VkPtr<PFN_vkAllocateCommandBuffers> fAllocateCommandBuffers;
  135. VkPtr<PFN_vkFreeCommandBuffers> fFreeCommandBuffers;
  136. VkPtr<PFN_vkBeginCommandBuffer> fBeginCommandBuffer;
  137. VkPtr<PFN_vkEndCommandBuffer> fEndCommandBuffer;
  138. VkPtr<PFN_vkResetCommandBuffer> fResetCommandBuffer;
  139. VkPtr<PFN_vkCmdBindPipeline> fCmdBindPipeline;
  140. VkPtr<PFN_vkCmdSetViewport> fCmdSetViewport;
  141. VkPtr<PFN_vkCmdSetScissor> fCmdSetScissor;
  142. VkPtr<PFN_vkCmdSetLineWidth> fCmdSetLineWidth;
  143. VkPtr<PFN_vkCmdSetDepthBias> fCmdSetDepthBias;
  144. VkPtr<PFN_vkCmdSetBlendConstants> fCmdSetBlendConstants;
  145. VkPtr<PFN_vkCmdSetDepthBounds> fCmdSetDepthBounds;
  146. VkPtr<PFN_vkCmdSetStencilCompareMask> fCmdSetStencilCompareMask;
  147. VkPtr<PFN_vkCmdSetStencilWriteMask> fCmdSetStencilWriteMask;
  148. VkPtr<PFN_vkCmdSetStencilReference> fCmdSetStencilReference;
  149. VkPtr<PFN_vkCmdBindDescriptorSets> fCmdBindDescriptorSets;
  150. VkPtr<PFN_vkCmdBindIndexBuffer> fCmdBindIndexBuffer;
  151. VkPtr<PFN_vkCmdBindVertexBuffers> fCmdBindVertexBuffers;
  152. VkPtr<PFN_vkCmdDraw> fCmdDraw;
  153. VkPtr<PFN_vkCmdDrawIndexed> fCmdDrawIndexed;
  154. VkPtr<PFN_vkCmdDrawIndirect> fCmdDrawIndirect;
  155. VkPtr<PFN_vkCmdDrawIndexedIndirect> fCmdDrawIndexedIndirect;
  156. VkPtr<PFN_vkCmdDispatch> fCmdDispatch;
  157. VkPtr<PFN_vkCmdDispatchIndirect> fCmdDispatchIndirect;
  158. VkPtr<PFN_vkCmdCopyBuffer> fCmdCopyBuffer;
  159. VkPtr<PFN_vkCmdCopyImage> fCmdCopyImage;
  160. VkPtr<PFN_vkCmdBlitImage> fCmdBlitImage;
  161. VkPtr<PFN_vkCmdCopyBufferToImage> fCmdCopyBufferToImage;
  162. VkPtr<PFN_vkCmdCopyImageToBuffer> fCmdCopyImageToBuffer;
  163. VkPtr<PFN_vkCmdUpdateBuffer> fCmdUpdateBuffer;
  164. VkPtr<PFN_vkCmdFillBuffer> fCmdFillBuffer;
  165. VkPtr<PFN_vkCmdClearColorImage> fCmdClearColorImage;
  166. VkPtr<PFN_vkCmdClearDepthStencilImage> fCmdClearDepthStencilImage;
  167. VkPtr<PFN_vkCmdClearAttachments> fCmdClearAttachments;
  168. VkPtr<PFN_vkCmdResolveImage> fCmdResolveImage;
  169. VkPtr<PFN_vkCmdSetEvent> fCmdSetEvent;
  170. VkPtr<PFN_vkCmdResetEvent> fCmdResetEvent;
  171. VkPtr<PFN_vkCmdWaitEvents> fCmdWaitEvents;
  172. VkPtr<PFN_vkCmdPipelineBarrier> fCmdPipelineBarrier;
  173. VkPtr<PFN_vkCmdBeginQuery> fCmdBeginQuery;
  174. VkPtr<PFN_vkCmdEndQuery> fCmdEndQuery;
  175. VkPtr<PFN_vkCmdResetQueryPool> fCmdResetQueryPool;
  176. VkPtr<PFN_vkCmdWriteTimestamp> fCmdWriteTimestamp;
  177. VkPtr<PFN_vkCmdCopyQueryPoolResults> fCmdCopyQueryPoolResults;
  178. VkPtr<PFN_vkCmdPushConstants> fCmdPushConstants;
  179. VkPtr<PFN_vkCmdBeginRenderPass> fCmdBeginRenderPass;
  180. VkPtr<PFN_vkCmdNextSubpass> fCmdNextSubpass;
  181. VkPtr<PFN_vkCmdEndRenderPass> fCmdEndRenderPass;
  182. VkPtr<PFN_vkCmdExecuteCommands> fCmdExecuteCommands;
  183. // Functions for VK_KHR_get_physical_device_properties2 or vulkan 1.1
  184. VkPtr<PFN_vkGetPhysicalDeviceFeatures2> fGetPhysicalDeviceFeatures2;
  185. VkPtr<PFN_vkGetPhysicalDeviceProperties2> fGetPhysicalDeviceProperties2;
  186. VkPtr<PFN_vkGetPhysicalDeviceFormatProperties2> fGetPhysicalDeviceFormatProperties2;
  187. VkPtr<PFN_vkGetPhysicalDeviceImageFormatProperties2> fGetPhysicalDeviceImageFormatProperties2;
  188. VkPtr<PFN_vkGetPhysicalDeviceQueueFamilyProperties2> fGetPhysicalDeviceQueueFamilyProperties2;
  189. VkPtr<PFN_vkGetPhysicalDeviceMemoryProperties2> fGetPhysicalDeviceMemoryProperties2;
  190. VkPtr<PFN_vkGetPhysicalDeviceSparseImageFormatProperties2> fGetPhysicalDeviceSparseImageFormatProperties2;
  191. // Functions for VK_KHR_get_memory_requirements2 or vulkan 1.1
  192. VkPtr<PFN_vkGetImageMemoryRequirements2> fGetImageMemoryRequirements2;
  193. VkPtr<PFN_vkGetBufferMemoryRequirements2> fGetBufferMemoryRequirements2;
  194. VkPtr<PFN_vkGetImageSparseMemoryRequirements2> fGetImageSparseMemoryRequirements2;
  195. //Functions for VK_KHR_bind_memory2
  196. VkPtr<PFN_vkBindBufferMemory2> fBindBufferMemory2;
  197. VkPtr<PFN_vkBindImageMemory2> fBindImageMemory2;
  198. // Functions for VK_KHR_maintenance1 or vulkan 1.1
  199. VkPtr<PFN_vkTrimCommandPool> fTrimCommandPool;
  200. // Functions for VK_KHR_maintenance3 or vulkan 1.1
  201. VkPtr<PFN_vkGetDescriptorSetLayoutSupport> fGetDescriptorSetLayoutSupport;
  202. // Functions for VK_KHR_external_memory_capabilities
  203. VkPtr<PFN_vkGetPhysicalDeviceExternalBufferProperties> fGetPhysicalDeviceExternalBufferProperties;
  204. // Functions for YCBCRConversion
  205. VkPtr<PFN_vkCreateSamplerYcbcrConversion> fCreateSamplerYcbcrConversion;
  206. VkPtr<PFN_vkDestroySamplerYcbcrConversion> fDestroySamplerYcbcrConversion;
  207. #ifdef SK_BUILD_FOR_ANDROID
  208. // Functions for VK_ANDROID_external_memory_android_hardware_buffer
  209. VkPtr<PFN_vkGetAndroidHardwareBufferPropertiesANDROID> fGetAndroidHardwareBufferProperties;
  210. VkPtr<PFN_vkGetMemoryAndroidHardwareBufferANDROID> fGetMemoryAndroidHardwareBuffer;
  211. #endif
  212. } fFunctions;
  213. };
  214. #endif