CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
Path: blob/master/Common/GPU/Vulkan/VulkanLoader.h
Views: 1401
// Copyright (c) 2016- PPSSPP Project.12// This program is free software: you can redistribute it and/or modify3// it under the terms of the GNU General Public License as published by4// the Free Software Foundation, version 2.0 or later versions.56// This program is distributed in the hope that it will be useful,7// but WITHOUT ANY WARRANTY; without even the implied warranty of8// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the9// GNU General Public License 2.0 for more details.1011// A copy of the GPL 2.0 should have been included with the program.12// If not, see http://www.gnu.org/licenses/1314// Official git repository and contact information can be found at15// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.1617#pragma once1819#include "ppsspp_config.h"2021#if PPSSPP_PLATFORM(ANDROID)22#define VK_USE_PLATFORM_ANDROID_KHR23#elif defined(_WIN32)24#define VK_USE_PLATFORM_WIN32_KHR25#define WIN32_LEAN_AND_MEAN26#ifndef NOMINMAX27#define NOMINMAX28#endif29#elif defined(__APPLE__)30#define VK_USE_PLATFORM_METAL_EXT31#endif3233#if !PPSSPP_PLATFORM(IOS_APP_STORE)34#define VK_NO_PROTOTYPES35#define VK_ENABLE_BETA_EXTENSIONS 1 // VK_KHR_portability_subset36#endif3738#include "ext/vulkan/vulkan.h"39#include <string>4041// Hacky X11 header workaround42#ifdef Opposite43#undef Opposite44#endif4546namespace PPSSPP_VK {47#if !PPSSPP_PLATFORM(IOS_APP_STORE)48// Putting our own Vulkan function pointers in a namespace ensures that ppsspp_libretro.so doesn't collide with libvulkan.so.49extern PFN_vkCreateInstance vkCreateInstance;50extern PFN_vkDestroyInstance vkDestroyInstance;51extern PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices;52extern PFN_vkEnumerateInstanceVersion vkEnumerateInstanceVersion;53extern PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures;54extern PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties;55extern PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties;56extern PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties;57extern PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties;58extern PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties;59extern PFN_vkGetPhysicalDeviceMemoryProperties2 vkGetPhysicalDeviceMemoryProperties2;60extern PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;61extern PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;62extern PFN_vkCreateDevice vkCreateDevice;63extern PFN_vkDestroyDevice vkDestroyDevice;64extern PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties;65extern PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties;66extern PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties;67extern PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties;68extern PFN_vkGetDeviceQueue vkGetDeviceQueue;69extern PFN_vkQueueSubmit vkQueueSubmit;70extern PFN_vkQueueWaitIdle vkQueueWaitIdle;71extern PFN_vkDeviceWaitIdle vkDeviceWaitIdle;72extern PFN_vkAllocateMemory vkAllocateMemory;73extern PFN_vkFreeMemory vkFreeMemory;74extern PFN_vkMapMemory vkMapMemory;75extern PFN_vkUnmapMemory vkUnmapMemory;76extern PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges;77extern PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges;78extern PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment;79extern PFN_vkBindBufferMemory vkBindBufferMemory;80extern PFN_vkBindBufferMemory2 vkBindBufferMemory2;81extern PFN_vkBindImageMemory vkBindImageMemory;82extern PFN_vkBindImageMemory2 vkBindImageMemory2;83extern PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements;84extern PFN_vkGetBufferMemoryRequirements2 vkGetBufferMemoryRequirements2;85extern PFN_vkGetDeviceBufferMemoryRequirements vkGetDeviceBufferMemoryRequirements;86extern PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements;87extern PFN_vkGetImageMemoryRequirements2 vkGetImageMemoryRequirements2;88extern PFN_vkGetDeviceImageMemoryRequirements vkGetDeviceImageMemoryRequirements;89extern PFN_vkQueueBindSparse vkQueueBindSparse;90extern PFN_vkCreateFence vkCreateFence;91extern PFN_vkDestroyFence vkDestroyFence;92extern PFN_vkResetFences vkResetFences;93extern PFN_vkGetFenceStatus vkGetFenceStatus;94extern PFN_vkWaitForFences vkWaitForFences;95extern PFN_vkCreateSemaphore vkCreateSemaphore;96extern PFN_vkDestroySemaphore vkDestroySemaphore;97extern PFN_vkCreateEvent vkCreateEvent;98extern PFN_vkDestroyEvent vkDestroyEvent;99extern PFN_vkGetEventStatus vkGetEventStatus;100extern PFN_vkSetEvent vkSetEvent;101extern PFN_vkResetEvent vkResetEvent;102extern PFN_vkCreateQueryPool vkCreateQueryPool;103extern PFN_vkDestroyQueryPool vkDestroyQueryPool;104extern PFN_vkGetQueryPoolResults vkGetQueryPoolResults;105extern PFN_vkCreateBuffer vkCreateBuffer;106extern PFN_vkDestroyBuffer vkDestroyBuffer;107extern PFN_vkCreateBufferView vkCreateBufferView;108extern PFN_vkDestroyBufferView vkDestroyBufferView;109extern PFN_vkCreateImage vkCreateImage;110extern PFN_vkDestroyImage vkDestroyImage;111extern PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout;112extern PFN_vkCreateImageView vkCreateImageView;113extern PFN_vkDestroyImageView vkDestroyImageView;114extern PFN_vkCreateShaderModule vkCreateShaderModule;115extern PFN_vkDestroyShaderModule vkDestroyShaderModule;116extern PFN_vkCreatePipelineCache vkCreatePipelineCache;117extern PFN_vkDestroyPipelineCache vkDestroyPipelineCache;118extern PFN_vkGetPipelineCacheData vkGetPipelineCacheData;119extern PFN_vkMergePipelineCaches vkMergePipelineCaches;120extern PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines;121extern PFN_vkCreateComputePipelines vkCreateComputePipelines;122extern PFN_vkDestroyPipeline vkDestroyPipeline;123extern PFN_vkCreatePipelineLayout vkCreatePipelineLayout;124extern PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout;125extern PFN_vkCreateSampler vkCreateSampler;126extern PFN_vkDestroySampler vkDestroySampler;127extern PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout;128extern PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout;129extern PFN_vkCreateDescriptorPool vkCreateDescriptorPool;130extern PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool;131extern PFN_vkResetDescriptorPool vkResetDescriptorPool;132extern PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets;133extern PFN_vkFreeDescriptorSets vkFreeDescriptorSets;134extern PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets;135extern PFN_vkCreateFramebuffer vkCreateFramebuffer;136extern PFN_vkDestroyFramebuffer vkDestroyFramebuffer;137extern PFN_vkCreateRenderPass vkCreateRenderPass;138extern PFN_vkDestroyRenderPass vkDestroyRenderPass;139extern PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity;140extern PFN_vkCreateCommandPool vkCreateCommandPool;141extern PFN_vkDestroyCommandPool vkDestroyCommandPool;142extern PFN_vkResetCommandPool vkResetCommandPool;143extern PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers;144extern PFN_vkFreeCommandBuffers vkFreeCommandBuffers;145extern PFN_vkBeginCommandBuffer vkBeginCommandBuffer;146extern PFN_vkEndCommandBuffer vkEndCommandBuffer;147extern PFN_vkResetCommandBuffer vkResetCommandBuffer;148extern PFN_vkCmdBindPipeline vkCmdBindPipeline;149extern PFN_vkCmdSetViewport vkCmdSetViewport;150extern PFN_vkCmdSetScissor vkCmdSetScissor;151extern PFN_vkCmdSetLineWidth vkCmdSetLineWidth;152extern PFN_vkCmdSetDepthBias vkCmdSetDepthBias;153extern PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants;154extern PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds;155extern PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask;156extern PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask;157extern PFN_vkCmdSetStencilReference vkCmdSetStencilReference;158extern PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets;159extern PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer;160extern PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers;161extern PFN_vkCmdDraw vkCmdDraw;162extern PFN_vkCmdDrawIndexed vkCmdDrawIndexed;163extern PFN_vkCmdDrawIndirect vkCmdDrawIndirect;164extern PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect;165extern PFN_vkCmdDispatch vkCmdDispatch;166extern PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect;167extern PFN_vkCmdCopyBuffer vkCmdCopyBuffer;168extern PFN_vkCmdCopyImage vkCmdCopyImage;169extern PFN_vkCmdBlitImage vkCmdBlitImage;170extern PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage;171extern PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer;172extern PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer;173extern PFN_vkCmdFillBuffer vkCmdFillBuffer;174extern PFN_vkCmdClearColorImage vkCmdClearColorImage;175extern PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage;176extern PFN_vkCmdClearAttachments vkCmdClearAttachments;177extern PFN_vkCmdResolveImage vkCmdResolveImage;178extern PFN_vkCmdSetEvent vkCmdSetEvent;179extern PFN_vkCmdResetEvent vkCmdResetEvent;180extern PFN_vkCmdWaitEvents vkCmdWaitEvents;181extern PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier;182extern PFN_vkCmdBeginQuery vkCmdBeginQuery;183extern PFN_vkCmdEndQuery vkCmdEndQuery;184extern PFN_vkCmdResetQueryPool vkCmdResetQueryPool;185extern PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp;186extern PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults;187extern PFN_vkCmdPushConstants vkCmdPushConstants;188extern PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass;189extern PFN_vkCmdNextSubpass vkCmdNextSubpass;190extern PFN_vkCmdEndRenderPass vkCmdEndRenderPass;191extern PFN_vkCmdExecuteCommands vkCmdExecuteCommands;192193#ifdef __ANDROID__194extern PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR;195#elif defined(_WIN32)196extern PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR;197#elif defined(VK_USE_PLATFORM_METAL_EXT)198extern PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT;199#endif200#if defined(VK_USE_PLATFORM_XLIB_KHR)201extern PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR;202#endif203#if defined(VK_USE_PLATFORM_WAYLAND_KHR)204extern PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR;205#endif206#if defined(VK_USE_PLATFORM_DISPLAY_KHR)207extern PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR;208extern PFN_vkGetPhysicalDeviceDisplayPropertiesKHR vkGetPhysicalDeviceDisplayPropertiesKHR;209extern PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR vkGetPhysicalDeviceDisplayPlanePropertiesKHR;210extern PFN_vkGetDisplayModePropertiesKHR vkGetDisplayModePropertiesKHR;211extern PFN_vkGetDisplayPlaneSupportedDisplaysKHR vkGetDisplayPlaneSupportedDisplaysKHR;212extern PFN_vkGetDisplayPlaneCapabilitiesKHR vkGetDisplayPlaneCapabilitiesKHR;213#endif214215extern PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR;216217// Simple loader for the WSI extension.218extern PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR;219extern PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR;220extern PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR;221extern PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR;222223extern PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR;224extern PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR;225extern PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR;226extern PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR;227extern PFN_vkQueuePresentKHR vkQueuePresentKHR;228229extern PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT;230extern PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT;231extern PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT;232extern PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT;233extern PFN_vkCmdInsertDebugUtilsLabelEXT vkCmdInsertDebugUtilsLabelEXT;234extern PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT;235extern PFN_vkSetDebugUtilsObjectTagEXT vkSetDebugUtilsObjectTagEXT;236237// Assorted other extensions.238extern PFN_vkGetBufferMemoryRequirements2 vkGetBufferMemoryRequirements2;239extern PFN_vkGetImageMemoryRequirements2 vkGetImageMemoryRequirements2;240extern PFN_vkGetPhysicalDeviceProperties2 vkGetPhysicalDeviceProperties2;241extern PFN_vkGetPhysicalDeviceFeatures2 vkGetPhysicalDeviceFeatures2;242extern PFN_vkCreateRenderPass2 vkCreateRenderPass2;243244extern PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT;245extern PFN_vkWaitForPresentKHR vkWaitForPresentKHR;246extern PFN_vkGetPastPresentationTimingGOOGLE vkGetPastPresentationTimingGOOGLE;247extern PFN_vkGetRefreshCycleDurationGOOGLE vkGetRefreshCycleDurationGOOGLE;248#endif // !PPSSPP_PLATFORM(IOS_APP_STORE)249} // namespace PPSSPP_VK250251// For fast extension-enabled checks.252struct VulkanExtensions {253bool EXT_debug_utils;254bool KHR_maintenance1; // required for KHR_create_renderpass2255bool KHR_maintenance2;256bool KHR_maintenance3;257bool KHR_maintenance4;258bool KHR_multiview; // required for KHR_create_renderpass2259bool KHR_get_memory_requirements2;260bool KHR_dedicated_allocation;261bool KHR_create_renderpass2;262bool KHR_get_physical_device_properties2;263bool KHR_depth_stencil_resolve;264bool EXT_shader_stencil_export;265bool EXT_swapchain_colorspace;266bool ARM_rasterization_order_attachment_access;267bool EXT_fragment_shader_interlock;268bool KHR_present_id; // Should probably check the feature flags instead.269bool KHR_present_wait; // Same270bool GOOGLE_display_timing;271bool EXT_provoking_vertex;272// bool EXT_depth_range_unrestricted; // Allows depth outside [0.0, 1.0] in 32-bit float depth buffers.273};274275// Way to do a quick check before even attempting to load.276bool VulkanMayBeAvailable();277void VulkanSetAvailable(bool available);278279bool VulkanLoad(std::string *errorStr);280void VulkanLoadInstanceFunctions(VkInstance instance, const VulkanExtensions &enabledExtensions, uint32_t vulkanApiVersion);281void VulkanLoadDeviceFunctions(VkDevice device, const VulkanExtensions &enabledExtensions, uint32_t vulkanApiVersion);282void VulkanFree();283284const char *VulkanResultToString(VkResult res);285286287