CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
hrydgard

CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!

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