|  | // Copyright 2017 The Dawn Authors | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | #ifndef DAWNNATIVE_VULKAN_VULKANFUNCTIONS_H_ | 
|  | #define DAWNNATIVE_VULKAN_VULKANFUNCTIONS_H_ | 
|  |  | 
|  | #include "common/vulkan_platform.h" | 
|  |  | 
|  | #include "dawn_native/Error.h" | 
|  |  | 
|  | class DynamicLib; | 
|  |  | 
|  | namespace dawn_native { namespace vulkan { | 
|  |  | 
|  | struct VulkanGlobalInfo; | 
|  | struct VulkanDeviceInfo; | 
|  |  | 
|  | // Stores the Vulkan entry points. Also loads them from the dynamic library | 
|  | // and the vkGet*ProcAddress entry points. | 
|  | struct VulkanFunctions { | 
|  | MaybeError LoadGlobalProcs(const DynamicLib& vulkanLib); | 
|  | MaybeError LoadInstanceProcs(VkInstance instance, const VulkanGlobalInfo& globalInfo); | 
|  | MaybeError LoadDeviceProcs(VkDevice device, const VulkanDeviceInfo& deviceInfo); | 
|  |  | 
|  | // ---------- Global procs | 
|  |  | 
|  | // Initial proc from which we can get all the others | 
|  | PFN_vkGetInstanceProcAddr GetInstanceProcAddr = nullptr; | 
|  |  | 
|  | PFN_vkCreateInstance CreateInstance = nullptr; | 
|  | PFN_vkEnumerateInstanceExtensionProperties EnumerateInstanceExtensionProperties = nullptr; | 
|  | PFN_vkEnumerateInstanceLayerProperties EnumerateInstanceLayerProperties = nullptr; | 
|  | // DestroyInstance isn't technically a global proc but we want to be able to use it | 
|  | // before querying the instance procs in case we need to error out during initialization. | 
|  | PFN_vkDestroyInstance DestroyInstance = nullptr; | 
|  |  | 
|  | // Core Vulkan 1.1 | 
|  | PFN_vkEnumerateInstanceVersion EnumerateInstanceVersion = nullptr; | 
|  |  | 
|  | // ---------- Instance procs | 
|  |  | 
|  | // Core Vulkan 1.0 | 
|  | PFN_vkCreateDevice CreateDevice = nullptr; | 
|  | PFN_vkEnumerateDeviceExtensionProperties EnumerateDeviceExtensionProperties = nullptr; | 
|  | PFN_vkEnumerateDeviceLayerProperties EnumerateDeviceLayerProperties = nullptr; | 
|  | PFN_vkEnumeratePhysicalDevices EnumeratePhysicalDevices = nullptr; | 
|  | PFN_vkGetDeviceProcAddr GetDeviceProcAddr = nullptr; | 
|  | PFN_vkGetPhysicalDeviceFeatures GetPhysicalDeviceFeatures = nullptr; | 
|  | PFN_vkGetPhysicalDeviceFormatProperties GetPhysicalDeviceFormatProperties = nullptr; | 
|  | PFN_vkGetPhysicalDeviceImageFormatProperties GetPhysicalDeviceImageFormatProperties = | 
|  | nullptr; | 
|  | PFN_vkGetPhysicalDeviceMemoryProperties GetPhysicalDeviceMemoryProperties = nullptr; | 
|  | PFN_vkGetPhysicalDeviceProperties GetPhysicalDeviceProperties = nullptr; | 
|  | PFN_vkGetPhysicalDeviceQueueFamilyProperties GetPhysicalDeviceQueueFamilyProperties = | 
|  | nullptr; | 
|  | PFN_vkGetPhysicalDeviceSparseImageFormatProperties | 
|  | GetPhysicalDeviceSparseImageFormatProperties = nullptr; | 
|  | // Not technically an instance proc but we want to be able to use it as soon as the | 
|  | // device is created. | 
|  | PFN_vkDestroyDevice DestroyDevice = nullptr; | 
|  |  | 
|  | // VK_EXT_debug_utils | 
|  | PFN_vkCmdBeginDebugUtilsLabelEXT CmdBeginDebugUtilsLabelEXT = nullptr; | 
|  | PFN_vkCmdEndDebugUtilsLabelEXT CmdEndDebugUtilsLabelEXT = nullptr; | 
|  | PFN_vkCmdInsertDebugUtilsLabelEXT CmdInsertDebugUtilsLabelEXT = nullptr; | 
|  | PFN_vkCreateDebugUtilsMessengerEXT CreateDebugUtilsMessengerEXT = nullptr; | 
|  | PFN_vkDestroyDebugUtilsMessengerEXT DestroyDebugUtilsMessengerEXT = nullptr; | 
|  | PFN_vkQueueBeginDebugUtilsLabelEXT QueueBeginDebugUtilsLabelEXT = nullptr; | 
|  | PFN_vkQueueEndDebugUtilsLabelEXT QueueEndDebugUtilsLabelEXT = nullptr; | 
|  | PFN_vkQueueInsertDebugUtilsLabelEXT QueueInsertDebugUtilsLabelEXT = nullptr; | 
|  | PFN_vkSetDebugUtilsObjectNameEXT SetDebugUtilsObjectNameEXT = nullptr; | 
|  | PFN_vkSetDebugUtilsObjectTagEXT SetDebugUtilsObjectTagEXT = nullptr; | 
|  | PFN_vkSubmitDebugUtilsMessageEXT SubmitDebugUtilsMessageEXT = nullptr; | 
|  |  | 
|  | // VK_KHR_surface | 
|  | PFN_vkDestroySurfaceKHR DestroySurfaceKHR = nullptr; | 
|  | PFN_vkGetPhysicalDeviceSurfaceSupportKHR GetPhysicalDeviceSurfaceSupportKHR = nullptr; | 
|  | PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR GetPhysicalDeviceSurfaceCapabilitiesKHR = | 
|  | nullptr; | 
|  | PFN_vkGetPhysicalDeviceSurfaceFormatsKHR GetPhysicalDeviceSurfaceFormatsKHR = nullptr; | 
|  | PFN_vkGetPhysicalDeviceSurfacePresentModesKHR GetPhysicalDeviceSurfacePresentModesKHR = | 
|  | nullptr; | 
|  |  | 
|  | // Core Vulkan 1.1 promoted extensions, set if either the core version or the extension is | 
|  | // present. | 
|  |  | 
|  | // VK_KHR_external_memory_capabilities | 
|  | PFN_vkGetPhysicalDeviceExternalBufferProperties GetPhysicalDeviceExternalBufferProperties = | 
|  | nullptr; | 
|  |  | 
|  | // VK_KHR_external_semaphore_capabilities | 
|  | PFN_vkGetPhysicalDeviceExternalSemaphoreProperties | 
|  | GetPhysicalDeviceExternalSemaphoreProperties = nullptr; | 
|  |  | 
|  | // VK_KHR_get_physical_device_properties2 | 
|  | PFN_vkGetPhysicalDeviceFeatures2 GetPhysicalDeviceFeatures2 = nullptr; | 
|  | PFN_vkGetPhysicalDeviceProperties2 GetPhysicalDeviceProperties2 = nullptr; | 
|  | PFN_vkGetPhysicalDeviceFormatProperties2 GetPhysicalDeviceFormatProperties2 = nullptr; | 
|  | PFN_vkGetPhysicalDeviceImageFormatProperties2 GetPhysicalDeviceImageFormatProperties2 = | 
|  | nullptr; | 
|  | PFN_vkGetPhysicalDeviceQueueFamilyProperties2 GetPhysicalDeviceQueueFamilyProperties2 = | 
|  | nullptr; | 
|  | PFN_vkGetPhysicalDeviceMemoryProperties2 GetPhysicalDeviceMemoryProperties2 = nullptr; | 
|  | PFN_vkGetPhysicalDeviceSparseImageFormatProperties2 | 
|  | GetPhysicalDeviceSparseImageFormatProperties2 = nullptr; | 
|  |  | 
|  | #if defined(VK_USE_PLATFORM_FUCHSIA) | 
|  | // FUCHSIA_image_pipe_surface | 
|  | PFN_vkCreateImagePipeSurfaceFUCHSIA CreateImagePipeSurfaceFUCHSIA = nullptr; | 
|  | #endif  // defined(VK_USE_PLATFORM_FUCHSIA) | 
|  |  | 
|  | #if defined(DAWN_ENABLE_BACKEND_METAL) | 
|  | // EXT_metal_surface | 
|  | PFN_vkCreateMetalSurfaceEXT CreateMetalSurfaceEXT = nullptr; | 
|  | #endif  // defined(DAWN_ENABLE_BACKEND_METAL) | 
|  |  | 
|  | #if defined(DAWN_PLATFORM_WINDOWS) | 
|  | // KHR_win32_surface | 
|  | PFN_vkCreateWin32SurfaceKHR CreateWin32SurfaceKHR = nullptr; | 
|  | PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR | 
|  | GetPhysicalDeviceWin32PresentationSupportKHR = nullptr; | 
|  | #endif  // defined(DAWN_PLATFORM_WINDOWS) | 
|  |  | 
|  | #if defined(DAWN_USE_X11) | 
|  | // KHR_xlib_surface | 
|  | PFN_vkCreateXlibSurfaceKHR CreateXlibSurfaceKHR = nullptr; | 
|  | PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR | 
|  | GetPhysicalDeviceXlibPresentationSupportKHR = nullptr; | 
|  |  | 
|  | // KHR_xcb_surface | 
|  | PFN_vkCreateXcbSurfaceKHR CreateXcbSurfaceKHR = nullptr; | 
|  | PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR | 
|  | GetPhysicalDeviceXcbPresentationSupportKHR = nullptr; | 
|  | #endif  // defined(DAWN_USE_X11) | 
|  |  | 
|  | // ---------- Device procs | 
|  |  | 
|  | // Core Vulkan 1.0 | 
|  | PFN_vkAllocateCommandBuffers AllocateCommandBuffers = nullptr; | 
|  | PFN_vkAllocateDescriptorSets AllocateDescriptorSets = nullptr; | 
|  | PFN_vkAllocateMemory AllocateMemory = nullptr; | 
|  | PFN_vkBeginCommandBuffer BeginCommandBuffer = nullptr; | 
|  | PFN_vkBindBufferMemory BindBufferMemory = nullptr; | 
|  | PFN_vkBindImageMemory BindImageMemory = nullptr; | 
|  | PFN_vkCmdBeginQuery CmdBeginQuery = nullptr; | 
|  | PFN_vkCmdBeginRenderPass CmdBeginRenderPass = nullptr; | 
|  | PFN_vkCmdBindDescriptorSets CmdBindDescriptorSets = nullptr; | 
|  | PFN_vkCmdBindIndexBuffer CmdBindIndexBuffer = nullptr; | 
|  | PFN_vkCmdBindPipeline CmdBindPipeline = nullptr; | 
|  | PFN_vkCmdBindVertexBuffers CmdBindVertexBuffers = nullptr; | 
|  | PFN_vkCmdBlitImage CmdBlitImage = nullptr; | 
|  | PFN_vkCmdClearAttachments CmdClearAttachments = nullptr; | 
|  | PFN_vkCmdClearColorImage CmdClearColorImage = nullptr; | 
|  | PFN_vkCmdClearDepthStencilImage CmdClearDepthStencilImage = nullptr; | 
|  | PFN_vkCmdCopyBuffer CmdCopyBuffer = nullptr; | 
|  | PFN_vkCmdCopyBufferToImage CmdCopyBufferToImage = nullptr; | 
|  | PFN_vkCmdCopyImage CmdCopyImage = nullptr; | 
|  | PFN_vkCmdCopyImageToBuffer CmdCopyImageToBuffer = nullptr; | 
|  | PFN_vkCmdCopyQueryPoolResults CmdCopyQueryPoolResults = nullptr; | 
|  | PFN_vkCmdDispatch CmdDispatch = nullptr; | 
|  | PFN_vkCmdDispatchIndirect CmdDispatchIndirect = nullptr; | 
|  | PFN_vkCmdDraw CmdDraw = nullptr; | 
|  | PFN_vkCmdDrawIndexed CmdDrawIndexed = nullptr; | 
|  | PFN_vkCmdDrawIndexedIndirect CmdDrawIndexedIndirect = nullptr; | 
|  | PFN_vkCmdDrawIndirect CmdDrawIndirect = nullptr; | 
|  | PFN_vkCmdEndQuery CmdEndQuery = nullptr; | 
|  | PFN_vkCmdEndRenderPass CmdEndRenderPass = nullptr; | 
|  | PFN_vkCmdExecuteCommands CmdExecuteCommands = nullptr; | 
|  | PFN_vkCmdFillBuffer CmdFillBuffer = nullptr; | 
|  | PFN_vkCmdNextSubpass CmdNextSubpass = nullptr; | 
|  | PFN_vkCmdPipelineBarrier CmdPipelineBarrier = nullptr; | 
|  | PFN_vkCmdPushConstants CmdPushConstants = nullptr; | 
|  | PFN_vkCmdResetEvent CmdResetEvent = nullptr; | 
|  | PFN_vkCmdResetQueryPool CmdResetQueryPool = nullptr; | 
|  | PFN_vkCmdResolveImage CmdResolveImage = nullptr; | 
|  | PFN_vkCmdSetBlendConstants CmdSetBlendConstants = nullptr; | 
|  | PFN_vkCmdSetDepthBias CmdSetDepthBias = nullptr; | 
|  | PFN_vkCmdSetDepthBounds CmdSetDepthBounds = nullptr; | 
|  | PFN_vkCmdSetEvent CmdSetEvent = nullptr; | 
|  | PFN_vkCmdSetLineWidth CmdSetLineWidth = nullptr; | 
|  | PFN_vkCmdSetScissor CmdSetScissor = nullptr; | 
|  | PFN_vkCmdSetStencilCompareMask CmdSetStencilCompareMask = nullptr; | 
|  | PFN_vkCmdSetStencilReference CmdSetStencilReference = nullptr; | 
|  | PFN_vkCmdSetStencilWriteMask CmdSetStencilWriteMask = nullptr; | 
|  | PFN_vkCmdSetViewport CmdSetViewport = nullptr; | 
|  | PFN_vkCmdUpdateBuffer CmdUpdateBuffer = nullptr; | 
|  | PFN_vkCmdWaitEvents CmdWaitEvents = nullptr; | 
|  | PFN_vkCmdWriteTimestamp CmdWriteTimestamp = nullptr; | 
|  | PFN_vkCreateBuffer CreateBuffer = nullptr; | 
|  | PFN_vkCreateBufferView CreateBufferView = nullptr; | 
|  | PFN_vkCreateCommandPool CreateCommandPool = nullptr; | 
|  | PFN_vkCreateComputePipelines CreateComputePipelines = nullptr; | 
|  | PFN_vkCreateDescriptorPool CreateDescriptorPool = nullptr; | 
|  | PFN_vkCreateDescriptorSetLayout CreateDescriptorSetLayout = nullptr; | 
|  | PFN_vkCreateEvent CreateEvent = nullptr; | 
|  | PFN_vkCreateFence CreateFence = nullptr; | 
|  | PFN_vkCreateFramebuffer CreateFramebuffer = nullptr; | 
|  | PFN_vkCreateGraphicsPipelines CreateGraphicsPipelines = nullptr; | 
|  | PFN_vkCreateImage CreateImage = nullptr; | 
|  | PFN_vkCreateImageView CreateImageView = nullptr; | 
|  | PFN_vkCreatePipelineCache CreatePipelineCache = nullptr; | 
|  | PFN_vkCreatePipelineLayout CreatePipelineLayout = nullptr; | 
|  | PFN_vkCreateQueryPool CreateQueryPool = nullptr; | 
|  | PFN_vkCreateRenderPass CreateRenderPass = nullptr; | 
|  | PFN_vkCreateSampler CreateSampler = nullptr; | 
|  | PFN_vkCreateSemaphore CreateSemaphore = nullptr; | 
|  | PFN_vkCreateShaderModule CreateShaderModule = nullptr; | 
|  | PFN_vkDestroyBuffer DestroyBuffer = nullptr; | 
|  | PFN_vkDestroyBufferView DestroyBufferView = nullptr; | 
|  | PFN_vkDestroyCommandPool DestroyCommandPool = nullptr; | 
|  | PFN_vkDestroyDescriptorPool DestroyDescriptorPool = nullptr; | 
|  | PFN_vkDestroyDescriptorSetLayout DestroyDescriptorSetLayout = nullptr; | 
|  | PFN_vkDestroyEvent DestroyEvent = nullptr; | 
|  | PFN_vkDestroyFence DestroyFence = nullptr; | 
|  | PFN_vkDestroyFramebuffer DestroyFramebuffer = nullptr; | 
|  | PFN_vkDestroyImage DestroyImage = nullptr; | 
|  | PFN_vkDestroyImageView DestroyImageView = nullptr; | 
|  | PFN_vkDestroyPipeline DestroyPipeline = nullptr; | 
|  | PFN_vkDestroyPipelineCache DestroyPipelineCache = nullptr; | 
|  | PFN_vkDestroyPipelineLayout DestroyPipelineLayout = nullptr; | 
|  | PFN_vkDestroyQueryPool DestroyQueryPool = nullptr; | 
|  | PFN_vkDestroyRenderPass DestroyRenderPass = nullptr; | 
|  | PFN_vkDestroySampler DestroySampler = nullptr; | 
|  | PFN_vkDestroySemaphore DestroySemaphore = nullptr; | 
|  | PFN_vkDestroyShaderModule DestroyShaderModule = nullptr; | 
|  | PFN_vkDeviceWaitIdle DeviceWaitIdle = nullptr; | 
|  | PFN_vkEndCommandBuffer EndCommandBuffer = nullptr; | 
|  | PFN_vkFlushMappedMemoryRanges FlushMappedMemoryRanges = nullptr; | 
|  | PFN_vkFreeCommandBuffers FreeCommandBuffers = nullptr; | 
|  | PFN_vkFreeDescriptorSets FreeDescriptorSets = nullptr; | 
|  | PFN_vkFreeMemory FreeMemory = nullptr; | 
|  | PFN_vkGetBufferMemoryRequirements GetBufferMemoryRequirements = nullptr; | 
|  | PFN_vkGetDeviceMemoryCommitment GetDeviceMemoryCommitment = nullptr; | 
|  | PFN_vkGetDeviceQueue GetDeviceQueue = nullptr; | 
|  | PFN_vkGetEventStatus GetEventStatus = nullptr; | 
|  | PFN_vkGetFenceStatus GetFenceStatus = nullptr; | 
|  | PFN_vkGetImageMemoryRequirements GetImageMemoryRequirements = nullptr; | 
|  | PFN_vkGetImageSparseMemoryRequirements GetImageSparseMemoryRequirements = nullptr; | 
|  | PFN_vkGetImageSubresourceLayout GetImageSubresourceLayout = nullptr; | 
|  | PFN_vkGetPipelineCacheData GetPipelineCacheData = nullptr; | 
|  | PFN_vkGetQueryPoolResults GetQueryPoolResults = nullptr; | 
|  | PFN_vkGetRenderAreaGranularity GetRenderAreaGranularity = nullptr; | 
|  | PFN_vkInvalidateMappedMemoryRanges InvalidateMappedMemoryRanges = nullptr; | 
|  | PFN_vkMapMemory MapMemory = nullptr; | 
|  | PFN_vkMergePipelineCaches MergePipelineCaches = nullptr; | 
|  | PFN_vkQueueBindSparse QueueBindSparse = nullptr; | 
|  | PFN_vkQueueSubmit QueueSubmit = nullptr; | 
|  | PFN_vkQueueWaitIdle QueueWaitIdle = nullptr; | 
|  | PFN_vkResetCommandBuffer ResetCommandBuffer = nullptr; | 
|  | PFN_vkResetCommandPool ResetCommandPool = nullptr; | 
|  | PFN_vkResetDescriptorPool ResetDescriptorPool = nullptr; | 
|  | PFN_vkResetEvent ResetEvent = nullptr; | 
|  | PFN_vkResetFences ResetFences = nullptr; | 
|  | PFN_vkSetEvent SetEvent = nullptr; | 
|  | PFN_vkUnmapMemory UnmapMemory = nullptr; | 
|  | PFN_vkUpdateDescriptorSets UpdateDescriptorSets = nullptr; | 
|  | PFN_vkWaitForFences WaitForFences = nullptr; | 
|  |  | 
|  | // VK_KHR_swapchain | 
|  | PFN_vkCreateSwapchainKHR CreateSwapchainKHR = nullptr; | 
|  | PFN_vkDestroySwapchainKHR DestroySwapchainKHR = nullptr; | 
|  | PFN_vkGetSwapchainImagesKHR GetSwapchainImagesKHR = nullptr; | 
|  | PFN_vkAcquireNextImageKHR AcquireNextImageKHR = nullptr; | 
|  | PFN_vkQueuePresentKHR QueuePresentKHR = nullptr; | 
|  |  | 
|  | // VK_KHR_external_memory_fd | 
|  | PFN_vkGetMemoryFdKHR GetMemoryFdKHR = nullptr; | 
|  | PFN_vkGetMemoryFdPropertiesKHR GetMemoryFdPropertiesKHR = nullptr; | 
|  |  | 
|  | // VK_KHR_external_semaphore_fd | 
|  | PFN_vkImportSemaphoreFdKHR ImportSemaphoreFdKHR = nullptr; | 
|  | PFN_vkGetSemaphoreFdKHR GetSemaphoreFdKHR = nullptr; | 
|  |  | 
|  | #if VK_USE_PLATFORM_FUCHSIA | 
|  | // VK_FUCHSIA_external_memory | 
|  | PFN_vkGetMemoryZirconHandleFUCHSIA GetMemoryZirconHandleFUCHSIA = nullptr; | 
|  | PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA GetMemoryZirconHandlePropertiesFUCHSIA = | 
|  | nullptr; | 
|  |  | 
|  | // VK_FUCHSIA_external_semaphore | 
|  | PFN_vkImportSemaphoreZirconHandleFUCHSIA ImportSemaphoreZirconHandleFUCHSIA = nullptr; | 
|  | PFN_vkGetSemaphoreZirconHandleFUCHSIA GetSemaphoreZirconHandleFUCHSIA = nullptr; | 
|  | #endif | 
|  | }; | 
|  |  | 
|  | // Create a wrapper around VkResult in the dawn_native::vulkan namespace. This shadows the | 
|  | // default VkResult (::VkResult). This ensures that assigning or creating a VkResult from a raw | 
|  | // ::VkResult uses WrapUnsafe. This makes it clear that users of VkResult must be intentional | 
|  | // about handling error cases. | 
|  | class VkResult { | 
|  | public: | 
|  | constexpr static VkResult WrapUnsafe(::VkResult value) { | 
|  | return VkResult(value); | 
|  | } | 
|  |  | 
|  | constexpr operator ::VkResult() const { | 
|  | return mValue; | 
|  | } | 
|  |  | 
|  | private: | 
|  | // Private. Use VkResult::WrapUnsafe instead. | 
|  | constexpr VkResult(::VkResult value) : mValue(value) { | 
|  | } | 
|  |  | 
|  | ::VkResult mValue; | 
|  | }; | 
|  |  | 
|  | }}  // namespace dawn_native::vulkan | 
|  |  | 
|  | #endif  // DAWNNATIVE_VULKAN_VULKANFUNCTIONS_H_ |