// Copyright 2016 Google Inc. All Rights Reserved.
//
// SPDX-License-Identifier: Apache-2.0

// This file is generated.
#pragma once

#define VK_NO_PROTOTYPES 1
#include <vulkan/vulkan.h>

enum VulkanWrapperStatus {
    UNSUPPORTED = 0,
    SUPPORTED = 1,
};

/**
 * Return whether Vulkan is supported in this system
 */
bool IsVulkanSupported();

// VK_core
extern PFN_vkCreateInstance vkCreateInstance;
extern PFN_vkDestroyInstance vkDestroyInstance;
extern PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices;
//extern PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures;
//extern PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties;
//extern PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties;
extern PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties;
//extern PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties;
//extern PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties;
extern PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
extern PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;
//extern PFN_vkCreateDevice vkCreateDevice;
//extern PFN_vkDestroyDevice vkDestroyDevice;
//extern PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties;
//extern PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties;
//extern PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties;
//extern PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties;
//extern PFN_vkGetDeviceQueue vkGetDeviceQueue;
//extern PFN_vkQueueSubmit vkQueueSubmit;
//extern PFN_vkQueueWaitIdle vkQueueWaitIdle;
//extern PFN_vkDeviceWaitIdle vkDeviceWaitIdle;
//extern PFN_vkAllocateMemory vkAllocateMemory;
//extern PFN_vkFreeMemory vkFreeMemory;
//extern PFN_vkMapMemory vkMapMemory;
//extern PFN_vkUnmapMemory vkUnmapMemory;
//extern PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges;
//extern PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges;
//extern PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment;
//extern PFN_vkBindBufferMemory vkBindBufferMemory;
//extern PFN_vkBindImageMemory vkBindImageMemory;
//extern PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements;
//extern PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements;
//extern PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements;
//extern PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties;
//extern PFN_vkQueueBindSparse vkQueueBindSparse;
//extern PFN_vkCreateFence vkCreateFence;
//extern PFN_vkDestroyFence vkDestroyFence;
//extern PFN_vkResetFences vkResetFences;
//extern PFN_vkGetFenceStatus vkGetFenceStatus;
//extern PFN_vkWaitForFences vkWaitForFences;
//extern PFN_vkCreateSemaphore vkCreateSemaphore;
//extern PFN_vkDestroySemaphore vkDestroySemaphore;
//extern PFN_vkCreateEvent vkCreateEvent;
//extern PFN_vkDestroyEvent vkDestroyEvent;
//extern PFN_vkGetEventStatus vkGetEventStatus;
//extern PFN_vkSetEvent vkSetEvent;
//extern PFN_vkResetEvent vkResetEvent;
//extern PFN_vkCreateQueryPool vkCreateQueryPool;
//extern PFN_vkDestroyQueryPool vkDestroyQueryPool;
//extern PFN_vkGetQueryPoolResults vkGetQueryPoolResults;
//extern PFN_vkCreateBuffer vkCreateBuffer;
//extern PFN_vkDestroyBuffer vkDestroyBuffer;
//extern PFN_vkCreateBufferView vkCreateBufferView;
//extern PFN_vkDestroyBufferView vkDestroyBufferView;
//extern PFN_vkCreateImage vkCreateImage;
//extern PFN_vkDestroyImage vkDestroyImage;
//extern PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout;
//extern PFN_vkCreateImageView vkCreateImageView;
//extern PFN_vkDestroyImageView vkDestroyImageView;
//extern PFN_vkCreateShaderModule vkCreateShaderModule;
//extern PFN_vkDestroyShaderModule vkDestroyShaderModule;
//extern PFN_vkCreatePipelineCache vkCreatePipelineCache;
//extern PFN_vkDestroyPipelineCache vkDestroyPipelineCache;
//extern PFN_vkGetPipelineCacheData vkGetPipelineCacheData;
//extern PFN_vkMergePipelineCaches vkMergePipelineCaches;
//extern PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines;
//extern PFN_vkCreateComputePipelines vkCreateComputePipelines;
//extern PFN_vkDestroyPipeline vkDestroyPipeline;
//extern PFN_vkCreatePipelineLayout vkCreatePipelineLayout;
//extern PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout;
//extern PFN_vkCreateSampler vkCreateSampler;
//extern PFN_vkDestroySampler vkDestroySampler;
//extern PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout;
//extern PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout;
//extern PFN_vkCreateDescriptorPool vkCreateDescriptorPool;
//extern PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool;
//extern PFN_vkResetDescriptorPool vkResetDescriptorPool;
//extern PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets;
//extern PFN_vkFreeDescriptorSets vkFreeDescriptorSets;
//extern PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets;
//extern PFN_vkCreateFramebuffer vkCreateFramebuffer;
//extern PFN_vkDestroyFramebuffer vkDestroyFramebuffer;
//extern PFN_vkCreateRenderPass vkCreateRenderPass;
//extern PFN_vkDestroyRenderPass vkDestroyRenderPass;
//extern PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity;
//extern PFN_vkCreateCommandPool vkCreateCommandPool;
//extern PFN_vkDestroyCommandPool vkDestroyCommandPool;
//extern PFN_vkResetCommandPool vkResetCommandPool;
//extern PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers;
//extern PFN_vkFreeCommandBuffers vkFreeCommandBuffers;
//extern PFN_vkBeginCommandBuffer vkBeginCommandBuffer;
//extern PFN_vkEndCommandBuffer vkEndCommandBuffer;
//extern PFN_vkResetCommandBuffer vkResetCommandBuffer;
//extern PFN_vkCmdBindPipeline vkCmdBindPipeline;
//extern PFN_vkCmdSetViewport vkCmdSetViewport;
//extern PFN_vkCmdSetScissor vkCmdSetScissor;
//extern PFN_vkCmdSetLineWidth vkCmdSetLineWidth;
//extern PFN_vkCmdSetDepthBias vkCmdSetDepthBias;
//extern PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants;
//extern PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds;
//extern PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask;
//extern PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask;
//extern PFN_vkCmdSetStencilReference vkCmdSetStencilReference;
//extern PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets;
//extern PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer;
//extern PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers;
//extern PFN_vkCmdDraw vkCmdDraw;
//extern PFN_vkCmdDrawIndexed vkCmdDrawIndexed;
//extern PFN_vkCmdDrawIndirect vkCmdDrawIndirect;
//extern PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect;
//extern PFN_vkCmdDispatch vkCmdDispatch;
//extern PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect;
//extern PFN_vkCmdCopyBuffer vkCmdCopyBuffer;
//extern PFN_vkCmdCopyImage vkCmdCopyImage;
//extern PFN_vkCmdBlitImage vkCmdBlitImage;
//extern PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage;
//extern PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer;
//extern PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer;
//extern PFN_vkCmdFillBuffer vkCmdFillBuffer;
//extern PFN_vkCmdClearColorImage vkCmdClearColorImage;
//extern PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage;
//extern PFN_vkCmdClearAttachments vkCmdClearAttachments;
//extern PFN_vkCmdResolveImage vkCmdResolveImage;
//extern PFN_vkCmdSetEvent vkCmdSetEvent;
//extern PFN_vkCmdResetEvent vkCmdResetEvent;
//extern PFN_vkCmdWaitEvents vkCmdWaitEvents;
//extern PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier;
//extern PFN_vkCmdBeginQuery vkCmdBeginQuery;
//extern PFN_vkCmdEndQuery vkCmdEndQuery;
//extern PFN_vkCmdResetQueryPool vkCmdResetQueryPool;
//extern PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp;
//extern PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults;
//extern PFN_vkCmdPushConstants vkCmdPushConstants;
//extern PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass;
//extern PFN_vkCmdNextSubpass vkCmdNextSubpass;
//extern PFN_vkCmdEndRenderPass vkCmdEndRenderPass;
//extern PFN_vkCmdExecuteCommands vkCmdExecuteCommands;
//
//// VK_KHR_surface
//extern PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR;
//extern PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR;
//extern PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR;
//extern PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR;
//extern PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR;
//
//// VK_KHR_swapchain
//extern PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR;
//extern PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR;
//extern PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR;
//extern PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR;
//extern PFN_vkQueuePresentKHR vkQueuePresentKHR;
//
//// VK_KHR_display
//extern PFN_vkGetPhysicalDeviceDisplayPropertiesKHR vkGetPhysicalDeviceDisplayPropertiesKHR;
//extern PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR vkGetPhysicalDeviceDisplayPlanePropertiesKHR;
//extern PFN_vkGetDisplayPlaneSupportedDisplaysKHR vkGetDisplayPlaneSupportedDisplaysKHR;
//extern PFN_vkGetDisplayModePropertiesKHR vkGetDisplayModePropertiesKHR;
//extern PFN_vkCreateDisplayModeKHR vkCreateDisplayModeKHR;
//extern PFN_vkGetDisplayPlaneCapabilitiesKHR vkGetDisplayPlaneCapabilitiesKHR;
//extern PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR;
//
//// VK_KHR_display_swapchain
//extern PFN_vkCreateSharedSwapchainsKHR vkCreateSharedSwapchainsKHR;

#ifdef VK_USE_PLATFORM_XLIB_KHR
// VK_KHR_xlib_surface
extern PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR;
extern PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR vkGetPhysicalDeviceXlibPresentationSupportKHR;
#endif

#ifdef VK_USE_PLATFORM_XCB_KHR
// VK_KHR_xcb_surface
extern PFN_vkCreateXcbSurfaceKHR vkCreateXcbSurfaceKHR;
extern PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR vkGetPhysicalDeviceXcbPresentationSupportKHR;
#endif

#ifdef VK_USE_PLATFORM_WAYLAND_KHR
// VK_KHR_wayland_surface
extern PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR;
extern PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR vkGetPhysicalDeviceWaylandPresentationSupportKHR;
#endif

#ifdef VK_USE_PLATFORM_MIR_KHR
// VK_KHR_mir_surface
extern PFN_vkCreateMirSurfaceKHR vkCreateMirSurfaceKHR;
extern PFN_vkGetPhysicalDeviceMirPresentationSupportKHR vkGetPhysicalDeviceMirPresentationSupportKHR;
#endif

#ifdef VK_USE_PLATFORM_ANDROID_KHR
// VK_KHR_android_surface
extern PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR;
#endif

#ifdef VK_USE_PLATFORM_WIN32_KHR
// VK_KHR_win32_surface
extern PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR;
extern PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR vkGetPhysicalDeviceWin32PresentationSupportKHR;
#endif

#ifdef USE_DEBUG_EXTENTIONS
#include <vulkan/vk_sdk_platform.h>
// VK_EXT_debug_report
extern PFN_vkCreateDebugReportCallbackEXT vkCreateDebugReportCallbackEXT;
extern PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT;
extern PFN_vkDebugReportMessageEXT vkDebugReportMessageEXT;
#endif
