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 8 #include "vk/GrVkInterface.h" 9 GrVkInterface()10GrVkInterface::GrVkInterface() { 11 } 12 13 #define GET_PROC(F) functions->f ## F = (PFN_vk ## F) vkGetInstanceProcAddr(instance, "vk" #F) 14 GrVkCreateInterface(VkInstance instance)15const GrVkInterface* GrVkCreateInterface(VkInstance instance) { 16 17 GrVkInterface* interface = new GrVkInterface(); 18 GrVkInterface::Functions* functions = &interface->fFunctions; 19 20 GET_PROC(CreateInstance); 21 GET_PROC(DestroyInstance); 22 GET_PROC(EnumeratePhysicalDevices); 23 GET_PROC(GetPhysicalDeviceFeatures); 24 GET_PROC(GetPhysicalDeviceFormatProperties); 25 GET_PROC(GetPhysicalDeviceImageFormatProperties); 26 GET_PROC(GetPhysicalDeviceProperties); 27 GET_PROC(GetPhysicalDeviceQueueFamilyProperties); 28 GET_PROC(GetPhysicalDeviceMemoryProperties); 29 GET_PROC(CreateDevice); 30 GET_PROC(DestroyDevice); 31 GET_PROC(EnumerateInstanceExtensionProperties); 32 GET_PROC(EnumerateDeviceExtensionProperties); 33 GET_PROC(EnumerateInstanceLayerProperties); 34 GET_PROC(EnumerateDeviceLayerProperties); 35 GET_PROC(GetDeviceQueue); 36 GET_PROC(QueueSubmit); 37 GET_PROC(QueueWaitIdle); 38 GET_PROC(DeviceWaitIdle); 39 GET_PROC(AllocateMemory); 40 GET_PROC(FreeMemory); 41 GET_PROC(MapMemory); 42 GET_PROC(UnmapMemory); 43 GET_PROC(FlushMappedMemoryRanges); 44 GET_PROC(InvalidateMappedMemoryRanges); 45 GET_PROC(GetDeviceMemoryCommitment); 46 GET_PROC(BindBufferMemory); 47 GET_PROC(BindImageMemory); 48 GET_PROC(GetBufferMemoryRequirements); 49 GET_PROC(GetImageMemoryRequirements); 50 GET_PROC(GetImageSparseMemoryRequirements); 51 GET_PROC(GetPhysicalDeviceSparseImageFormatProperties); 52 GET_PROC(QueueBindSparse); 53 GET_PROC(CreateFence); 54 GET_PROC(DestroyFence); 55 GET_PROC(ResetFences); 56 GET_PROC(GetFenceStatus); 57 GET_PROC(WaitForFences); 58 GET_PROC(CreateSemaphore); 59 GET_PROC(DestroySemaphore); 60 GET_PROC(CreateEvent); 61 GET_PROC(DestroyEvent); 62 GET_PROC(GetEventStatus); 63 GET_PROC(SetEvent); 64 GET_PROC(ResetEvent); 65 GET_PROC(CreateQueryPool); 66 GET_PROC(DestroyQueryPool); 67 GET_PROC(GetQueryPoolResults); 68 GET_PROC(CreateBuffer); 69 GET_PROC(DestroyBuffer); 70 GET_PROC(CreateBufferView); 71 GET_PROC(DestroyBufferView); 72 GET_PROC(CreateImage); 73 GET_PROC(DestroyImage); 74 GET_PROC(GetImageSubresourceLayout); 75 GET_PROC(CreateImageView); 76 GET_PROC(DestroyImageView); 77 GET_PROC(CreateShaderModule); 78 GET_PROC(DestroyShaderModule); 79 GET_PROC(CreatePipelineCache); 80 GET_PROC(DestroyPipelineCache); 81 GET_PROC(GetPipelineCacheData); 82 GET_PROC(MergePipelineCaches); 83 GET_PROC(CreateGraphicsPipelines); 84 GET_PROC(CreateComputePipelines); 85 GET_PROC(DestroyPipeline); 86 GET_PROC(CreatePipelineLayout); 87 GET_PROC(DestroyPipelineLayout); 88 GET_PROC(CreateSampler); 89 GET_PROC(DestroySampler); 90 GET_PROC(CreateDescriptorSetLayout); 91 GET_PROC(DestroyDescriptorSetLayout); 92 GET_PROC(CreateDescriptorPool); 93 GET_PROC(DestroyDescriptorPool); 94 GET_PROC(ResetDescriptorPool); 95 GET_PROC(AllocateDescriptorSets); 96 GET_PROC(FreeDescriptorSets); 97 GET_PROC(UpdateDescriptorSets); 98 GET_PROC(CreateFramebuffer); 99 GET_PROC(DestroyFramebuffer); 100 GET_PROC(CreateRenderPass); 101 GET_PROC(DestroyRenderPass); 102 GET_PROC(GetRenderAreaGranularity); 103 GET_PROC(CreateCommandPool); 104 GET_PROC(DestroyCommandPool); 105 GET_PROC(ResetCommandPool); 106 GET_PROC(AllocateCommandBuffers); 107 GET_PROC(FreeCommandBuffers); 108 GET_PROC(BeginCommandBuffer); 109 GET_PROC(EndCommandBuffer); 110 GET_PROC(ResetCommandBuffer); 111 GET_PROC(CmdBindPipeline); 112 GET_PROC(CmdSetViewport); 113 GET_PROC(CmdSetScissor); 114 GET_PROC(CmdSetLineWidth); 115 GET_PROC(CmdSetDepthBias); 116 GET_PROC(CmdSetBlendConstants); 117 GET_PROC(CmdSetDepthBounds); 118 GET_PROC(CmdSetStencilCompareMask); 119 GET_PROC(CmdSetStencilWriteMask); 120 GET_PROC(CmdSetStencilReference); 121 GET_PROC(CmdBindDescriptorSets); 122 GET_PROC(CmdBindIndexBuffer); 123 GET_PROC(CmdBindVertexBuffers); 124 GET_PROC(CmdDraw); 125 GET_PROC(CmdDrawIndexed); 126 GET_PROC(CmdDrawIndirect); 127 GET_PROC(CmdDrawIndexedIndirect); 128 GET_PROC(CmdDispatch); 129 GET_PROC(CmdDispatchIndirect); 130 GET_PROC(CmdCopyBuffer); 131 GET_PROC(CmdCopyImage); 132 GET_PROC(CmdBlitImage); 133 GET_PROC(CmdCopyBufferToImage); 134 GET_PROC(CmdCopyImageToBuffer); 135 GET_PROC(CmdUpdateBuffer); 136 GET_PROC(CmdFillBuffer); 137 GET_PROC(CmdClearColorImage); 138 GET_PROC(CmdClearDepthStencilImage); 139 GET_PROC(CmdClearAttachments); 140 GET_PROC(CmdResolveImage); 141 GET_PROC(CmdSetEvent); 142 GET_PROC(CmdResetEvent); 143 GET_PROC(CmdWaitEvents); 144 GET_PROC(CmdPipelineBarrier); 145 GET_PROC(CmdBeginQuery); 146 GET_PROC(CmdEndQuery); 147 GET_PROC(CmdResetQueryPool); 148 GET_PROC(CmdWriteTimestamp); 149 GET_PROC(CmdCopyQueryPoolResults); 150 GET_PROC(CmdPushConstants); 151 GET_PROC(CmdBeginRenderPass); 152 GET_PROC(CmdNextSubpass); 153 GET_PROC(CmdEndRenderPass); 154 GET_PROC(CmdExecuteCommands); 155 GET_PROC(DestroySurfaceKHR); 156 GET_PROC(GetPhysicalDeviceSurfaceSupportKHR); 157 GET_PROC(GetPhysicalDeviceSurfaceCapabilitiesKHR); 158 GET_PROC(GetPhysicalDeviceSurfaceFormatsKHR); 159 GET_PROC(GetPhysicalDeviceSurfacePresentModesKHR); 160 GET_PROC(CreateSwapchainKHR); 161 GET_PROC(DestroySwapchainKHR); 162 GET_PROC(GetSwapchainImagesKHR); 163 GET_PROC(AcquireNextImageKHR); 164 GET_PROC(QueuePresentKHR); 165 GET_PROC(GetPhysicalDeviceDisplayPropertiesKHR); 166 GET_PROC(GetPhysicalDeviceDisplayPlanePropertiesKHR); 167 GET_PROC(GetDisplayPlaneSupportedDisplaysKHR); 168 GET_PROC(GetDisplayModePropertiesKHR); 169 GET_PROC(CreateDisplayModeKHR); 170 GET_PROC(GetDisplayPlaneCapabilitiesKHR); 171 GET_PROC(CreateDisplayPlaneSurfaceKHR); 172 GET_PROC(CreateSharedSwapchainsKHR); 173 174 return interface; 175 } 176 177 #define RETURN_FALSE_INTERFACE \ 178 if (kIsDebug) { SkDebugf("%s:%d GrVkInterface::validate() failed.\n", __FILE__, __LINE__); } \ 179 return false; 180 validate() const181bool GrVkInterface::validate() const { 182 // functions that are always required 183 if (NULL == fFunctions.fCreateInstance || 184 NULL == fFunctions.fDestroyInstance || 185 NULL == fFunctions.fEnumeratePhysicalDevices || 186 NULL == fFunctions.fGetPhysicalDeviceFeatures || 187 NULL == fFunctions.fGetPhysicalDeviceFormatProperties || 188 NULL == fFunctions.fGetPhysicalDeviceImageFormatProperties || 189 NULL == fFunctions.fGetPhysicalDeviceProperties || 190 NULL == fFunctions.fGetPhysicalDeviceQueueFamilyProperties || 191 NULL == fFunctions.fGetPhysicalDeviceMemoryProperties || 192 NULL == fFunctions.fCreateDevice || 193 NULL == fFunctions.fDestroyDevice || 194 NULL == fFunctions.fEnumerateInstanceExtensionProperties || 195 NULL == fFunctions.fEnumerateDeviceExtensionProperties || 196 NULL == fFunctions.fEnumerateInstanceLayerProperties || 197 NULL == fFunctions.fEnumerateDeviceLayerProperties || 198 NULL == fFunctions.fGetDeviceQueue || 199 NULL == fFunctions.fQueueSubmit || 200 NULL == fFunctions.fQueueWaitIdle || 201 NULL == fFunctions.fDeviceWaitIdle || 202 NULL == fFunctions.fAllocateMemory || 203 NULL == fFunctions.fFreeMemory || 204 NULL == fFunctions.fMapMemory || 205 NULL == fFunctions.fUnmapMemory || 206 NULL == fFunctions.fFlushMappedMemoryRanges || 207 NULL == fFunctions.fInvalidateMappedMemoryRanges || 208 NULL == fFunctions.fGetDeviceMemoryCommitment || 209 NULL == fFunctions.fBindBufferMemory || 210 NULL == fFunctions.fBindImageMemory || 211 NULL == fFunctions.fGetBufferMemoryRequirements || 212 NULL == fFunctions.fGetImageMemoryRequirements || 213 NULL == fFunctions.fGetImageSparseMemoryRequirements || 214 NULL == fFunctions.fGetPhysicalDeviceSparseImageFormatProperties || 215 NULL == fFunctions.fQueueBindSparse || 216 NULL == fFunctions.fCreateFence || 217 NULL == fFunctions.fDestroyFence || 218 NULL == fFunctions.fResetFences || 219 NULL == fFunctions.fGetFenceStatus || 220 NULL == fFunctions.fWaitForFences || 221 NULL == fFunctions.fCreateSemaphore || 222 NULL == fFunctions.fDestroySemaphore || 223 NULL == fFunctions.fCreateEvent || 224 NULL == fFunctions.fDestroyEvent || 225 NULL == fFunctions.fGetEventStatus || 226 NULL == fFunctions.fSetEvent || 227 NULL == fFunctions.fResetEvent || 228 NULL == fFunctions.fCreateQueryPool || 229 NULL == fFunctions.fDestroyQueryPool || 230 NULL == fFunctions.fGetQueryPoolResults || 231 NULL == fFunctions.fCreateBuffer || 232 NULL == fFunctions.fDestroyBuffer || 233 NULL == fFunctions.fCreateBufferView || 234 NULL == fFunctions.fDestroyBufferView || 235 NULL == fFunctions.fCreateImage || 236 NULL == fFunctions.fDestroyImage || 237 NULL == fFunctions.fGetImageSubresourceLayout || 238 NULL == fFunctions.fCreateImageView || 239 NULL == fFunctions.fDestroyImageView || 240 NULL == fFunctions.fCreateShaderModule || 241 NULL == fFunctions.fDestroyShaderModule || 242 NULL == fFunctions.fCreatePipelineCache || 243 NULL == fFunctions.fDestroyPipelineCache || 244 NULL == fFunctions.fGetPipelineCacheData || 245 NULL == fFunctions.fMergePipelineCaches || 246 NULL == fFunctions.fCreateGraphicsPipelines || 247 NULL == fFunctions.fCreateComputePipelines || 248 NULL == fFunctions.fDestroyPipeline || 249 NULL == fFunctions.fCreatePipelineLayout || 250 NULL == fFunctions.fDestroyPipelineLayout || 251 NULL == fFunctions.fCreateSampler || 252 NULL == fFunctions.fDestroySampler || 253 NULL == fFunctions.fCreateDescriptorSetLayout || 254 NULL == fFunctions.fDestroyDescriptorSetLayout || 255 NULL == fFunctions.fCreateDescriptorPool || 256 NULL == fFunctions.fDestroyDescriptorPool || 257 NULL == fFunctions.fResetDescriptorPool || 258 NULL == fFunctions.fAllocateDescriptorSets || 259 NULL == fFunctions.fFreeDescriptorSets || 260 NULL == fFunctions.fUpdateDescriptorSets || 261 NULL == fFunctions.fCreateFramebuffer || 262 NULL == fFunctions.fDestroyFramebuffer || 263 NULL == fFunctions.fCreateRenderPass || 264 NULL == fFunctions.fDestroyRenderPass || 265 NULL == fFunctions.fGetRenderAreaGranularity || 266 NULL == fFunctions.fCreateCommandPool || 267 NULL == fFunctions.fDestroyCommandPool || 268 NULL == fFunctions.fResetCommandPool || 269 NULL == fFunctions.fAllocateCommandBuffers || 270 NULL == fFunctions.fFreeCommandBuffers || 271 NULL == fFunctions.fBeginCommandBuffer || 272 NULL == fFunctions.fEndCommandBuffer || 273 NULL == fFunctions.fResetCommandBuffer || 274 NULL == fFunctions.fCmdBindPipeline || 275 NULL == fFunctions.fCmdSetViewport || 276 NULL == fFunctions.fCmdSetScissor || 277 NULL == fFunctions.fCmdSetLineWidth || 278 NULL == fFunctions.fCmdSetDepthBias || 279 NULL == fFunctions.fCmdSetBlendConstants || 280 NULL == fFunctions.fCmdSetDepthBounds || 281 NULL == fFunctions.fCmdSetStencilCompareMask || 282 NULL == fFunctions.fCmdSetStencilWriteMask || 283 NULL == fFunctions.fCmdSetStencilReference || 284 NULL == fFunctions.fCmdBindDescriptorSets || 285 NULL == fFunctions.fCmdBindIndexBuffer || 286 NULL == fFunctions.fCmdBindVertexBuffers || 287 NULL == fFunctions.fCmdDraw || 288 NULL == fFunctions.fCmdDrawIndexed || 289 NULL == fFunctions.fCmdDrawIndirect || 290 NULL == fFunctions.fCmdDrawIndexedIndirect || 291 NULL == fFunctions.fCmdDispatch || 292 NULL == fFunctions.fCmdDispatchIndirect || 293 NULL == fFunctions.fCmdCopyBuffer || 294 NULL == fFunctions.fCmdCopyImage || 295 NULL == fFunctions.fCmdBlitImage || 296 NULL == fFunctions.fCmdCopyBufferToImage || 297 NULL == fFunctions.fCmdCopyImageToBuffer || 298 NULL == fFunctions.fCmdUpdateBuffer || 299 NULL == fFunctions.fCmdFillBuffer || 300 NULL == fFunctions.fCmdClearColorImage || 301 NULL == fFunctions.fCmdClearDepthStencilImage || 302 NULL == fFunctions.fCmdClearAttachments || 303 NULL == fFunctions.fCmdResolveImage || 304 NULL == fFunctions.fCmdSetEvent || 305 NULL == fFunctions.fCmdResetEvent || 306 NULL == fFunctions.fCmdWaitEvents || 307 NULL == fFunctions.fCmdPipelineBarrier || 308 NULL == fFunctions.fCmdBeginQuery || 309 NULL == fFunctions.fCmdEndQuery || 310 NULL == fFunctions.fCmdResetQueryPool || 311 NULL == fFunctions.fCmdWriteTimestamp || 312 NULL == fFunctions.fCmdCopyQueryPoolResults || 313 NULL == fFunctions.fCmdPushConstants || 314 NULL == fFunctions.fCmdBeginRenderPass || 315 NULL == fFunctions.fCmdNextSubpass || 316 NULL == fFunctions.fCmdEndRenderPass || 317 NULL == fFunctions.fCmdExecuteCommands || 318 NULL == fFunctions.fDestroySurfaceKHR || 319 NULL == fFunctions.fGetPhysicalDeviceSurfaceSupportKHR || 320 NULL == fFunctions.fGetPhysicalDeviceSurfaceCapabilitiesKHR || 321 NULL == fFunctions.fGetPhysicalDeviceSurfaceFormatsKHR || 322 NULL == fFunctions.fGetPhysicalDeviceSurfacePresentModesKHR || 323 NULL == fFunctions.fCreateSwapchainKHR || 324 NULL == fFunctions.fDestroySwapchainKHR || 325 NULL == fFunctions.fGetSwapchainImagesKHR || 326 NULL == fFunctions.fAcquireNextImageKHR || 327 NULL == fFunctions.fQueuePresentKHR || 328 NULL == fFunctions.fGetPhysicalDeviceDisplayPropertiesKHR || 329 NULL == fFunctions.fGetPhysicalDeviceDisplayPlanePropertiesKHR || 330 NULL == fFunctions.fGetDisplayPlaneSupportedDisplaysKHR || 331 NULL == fFunctions.fGetDisplayModePropertiesKHR || 332 NULL == fFunctions.fCreateDisplayModeKHR || 333 NULL == fFunctions.fGetDisplayPlaneCapabilitiesKHR || 334 NULL == fFunctions.fCreateDisplayPlaneSurfaceKHR || 335 NULL == fFunctions.fCreateSharedSwapchainsKHR) { 336 return false; 337 } 338 return true; 339 } 340 341