mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-08-30 07:20:15 +00:00
This is a reland of fb0bf70459c44b31419400598b592eaaae85f932 Reland after making libx11-xcb dynamically loaded since it isn't present on all Linux deployment targets of Chromium. Also includes a couple of additional cosmetic changes to d3d12/PlatformFunctions noticed while looking at it for inspiration. Original change's description: > Vulkan: Fallback to XCB for Xlib surfaces > > Chromium builds the Vulkan loader without support Xlib (because it > prefers XCB) which caused Xlib wgpu::SwapChain creation to fail on the > Vulkan backend. > > This CL adds a fallback to use VK_KHR_xcb_surface if VK_KHR_xlib_surface > isn't present. > > Bug: dawn:662 > Change-Id: I0e0128ee6b5c75da03998dbae231d17e48bacc81 > Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/41180 > Reviewed-by: Austin Eng <enga@chromium.org> > Commit-Queue: Austin Eng <enga@chromium.org> > Auto-Submit: Corentin Wallez <cwallez@chromium.org> Bug: dawn:662 Change-Id: I617fcd1059dddfa05c29ac20d77f891ca6962342 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/41380 Reviewed-by: Austin Eng <enga@chromium.org> Reviewed-by: Jiawei Shao <jiawei.shao@intel.com> Commit-Queue: Corentin Wallez <cwallez@chromium.org> Auto-Submit: Corentin Wallez <cwallez@chromium.org>
322 lines
16 KiB
C++
322 lines
16 KiB
C++
// 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_
|