21 #include "../SDL_internal.h"
37 return "VK_NOT_READY";
41 return "VK_EVENT_SET";
43 return "VK_EVENT_RESET";
45 return "VK_INCOMPLETE";
47 return "VK_ERROR_OUT_OF_HOST_MEMORY";
49 return "VK_ERROR_OUT_OF_DEVICE_MEMORY";
51 return "VK_ERROR_INITIALIZATION_FAILED";
53 return "VK_ERROR_DEVICE_LOST";
55 return "VK_ERROR_MEMORY_MAP_FAILED";
57 return "VK_ERROR_LAYER_NOT_PRESENT";
59 return "VK_ERROR_EXTENSION_NOT_PRESENT";
61 return "VK_ERROR_FEATURE_NOT_PRESENT";
63 return "VK_ERROR_INCOMPATIBLE_DRIVER";
65 return "VK_ERROR_TOO_MANY_OBJECTS";
67 return "VK_ERROR_FORMAT_NOT_SUPPORTED";
69 return "VK_ERROR_FRAGMENTED_POOL";
71 return "VK_ERROR_UNKNOWN";
73 return "VK_ERROR_OUT_OF_POOL_MEMORY";
75 return "VK_ERROR_INVALID_EXTERNAL_HANDLE";
77 return "VK_ERROR_FRAGMENTATION";
79 return "VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS";
81 return "VK_ERROR_SURFACE_LOST_KHR";
83 return "VK_ERROR_NATIVE_WINDOW_IN_USE_KHR";
85 return "VK_SUBOPTIMAL_KHR";
87 return "VK_ERROR_OUT_OF_DATE_KHR";
89 return "VK_ERROR_INCOMPATIBLE_DISPLAY_KHR";
91 return "VK_ERROR_VALIDATION_FAILED_EXT";
93 return "VK_ERROR_INVALID_SHADER_NV";
95 return "VK_ERROR_INCOMPATIBLE_VERSION_KHR";
97 return "VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT";
99 return "VK_ERROR_NOT_PERMITTED_EXT";
101 return "VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT";
103 return "VK_THREAD_IDLE_KHR";
105 return "VK_THREAD_DONE_KHR";
107 return "VK_OPERATION_DEFERRED_KHR";
109 return "VK_OPERATION_NOT_DEFERRED_KHR";
111 return "VK_PIPELINE_COMPILE_REQUIRED_EXT";
116 return "VK_ERROR_<Unknown>";
117 return "VK_<Unknown>";
133 "You probably don't have a working Vulkan driver installed. %s %s %s(%d)",
134 "Getting Vulkan extensions failed:",
135 "vkEnumerateInstanceExtensionProperties returned",
136 SDL_Vulkan_GetResultString(
result),
143 "Getting Vulkan extensions failed: vkEnumerateInstanceExtensionProperties returned "
145 SDL_Vulkan_GetResultString(
result),
166 "Getting Vulkan extensions failed: vkEnumerateInstanceExtensionProperties returned "
168 SDL_Vulkan_GetResultString(
result),
173 *extensionCount =
count;
177 SDL_bool SDL_Vulkan_GetInstanceExtensions_Helper(
unsigned *userCount,
178 const char **userNames,
180 const char *
const *
names)
185 if (*userCount < nameCount) {
186 SDL_SetError(
"Output array for SDL_Vulkan_GetInstanceExtensions needs to be at least %d big", nameCount);
189 for (
i = 0;
i < nameCount;
i++) {
193 *userCount = nameCount;
205 SDL_bool SDL_Vulkan_Display_CreateSurface(
void *vkGetInstanceProcAddr_,
211 #define VULKAN_INSTANCE_FUNCTION(name) \
212 PFN_##name name = (PFN_##name)vkGetInstanceProcAddr((VkInstance)instance, #name)
220 #undef VULKAN_INSTANCE_FUNCTION
224 VkPhysicalDevice *physicalDevices =
NULL;
226 const char *chosenDisplayId;
238 " extension is not enabled in the Vulkan instance.");
244 displayId =
SDL_atoi(chosenDisplayId);
252 SDL_SetError(
"Could not enumerate Vulkan physical devices");
255 if(physicalDeviceCount == 0)
260 physicalDevices =
SDL_malloc(
sizeof(VkPhysicalDevice) * physicalDeviceCount);
274 for(physicalDeviceIndex = 0; physicalDeviceIndex < physicalDeviceCount;
275 physicalDeviceIndex++)
277 VkPhysicalDevice physicalDevice = physicalDevices[physicalDeviceIndex];
278 uint32_t displayPropertiesCount = 0;
280 uint32_t displayModePropertiesCount = 0;
282 int bestMatchIndex = -1;
285 uint32_t displayPlanePropertiesCount = 0;
287 VkDisplayKHR display;
301 physicalDeviceIndex, displayPropertiesCount);
303 if ( (displayId < 0) || (((
uint32_t) displayId) >= displayPropertiesCount) )
306 displayId -= displayPropertiesCount;
311 if(!displayProperties)
321 SDL_SetError(
"Error enumerating physical device displays");
325 display = displayProperties[displayId].
display;
328 displayProperties[displayId].displayName, extent.
width, extent.
height);
331 displayProperties =
NULL;
344 if(!displayModeProperties)
359 for (
i = 0;
i < displayModePropertiesCount; ++
i)
361 if (displayModeProperties[
i].parameters.visibleRegion.width == extent.
width &&
362 displayModeProperties[
i].parameters.visibleRegion.height == extent.
height &&
363 displayModeProperties[
i].parameters.refreshRate > refreshRate)
369 if (bestMatchIndex < 0)
379 displayModeProperties[bestMatchIndex].parameters.visibleRegion.width,
380 displayModeProperties[bestMatchIndex].parameters.visibleRegion.height,
384 displayModeProperties =
NULL;
397 if(!displayPlaneProperties)
407 SDL_SetError(
"Error enumerating display plane properties");
412 for (
i = 0;
i < displayPlanePropertiesCount; ++
i)
414 uint32_t planeSupportedDisplaysCount = 0;
415 VkDisplayKHR *planeSupportedDisplays =
NULL;
431 planeSupportedDisplays =
SDL_malloc(
sizeof(VkDisplayKHR) * planeSupportedDisplaysCount);
432 if(!planeSupportedDisplays)
443 SDL_SetError(
"Error enumerating supported displays, or no supported displays");
449 for (
j = 0;
j < planeSupportedDisplaysCount && planeSupportedDisplays[
j] != display; ++
j)
453 planeSupportedDisplays =
NULL;
455 if (
j == planeSupportedDisplaysCount)
464 SDL_SetError(
"Error getting display plane capabilities");
484 SDL_SetError(
"No plane supports the selected resolution");
492 displayPlaneProperties =
NULL;
510 physicalDevices =
NULL;
512 if (physicalDeviceIndex == physicalDeviceCount)
514 SDL_SetError(
"No usable displays found or requested display out of range");
526 SDL_SetError(
"vkCreateDisplayPlaneSurfaceKHR failed: %s",
527 SDL_Vulkan_GetResultString(
result));
#define SDL_OutOfMemory()
GLuint GLuint GLsizei count
#define SDL_arraysize(array)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int int in j)
VkDisplayModeParametersKHR parameters
VkDisplayModeKHR displayMode
VkDisplayPlaneAlphaFlagsKHR supportedAlpha
uint32_t currentStackIndex
VkExtent2D physicalResolution
VkDisplayModeKHR displayMode
VkDisplayPlaneAlphaFlagBitsKHR alphaMode
VkSurfaceTransformFlagBitsKHR transform
#define VULKAN_INSTANCE_FUNCTION(name)
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *pName)
VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pPropertyCount, VkExtensionProperties *pProperties)
VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex, uint32_t *pDisplayCount, VkDisplayKHR *pDisplays)
VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkDisplayPropertiesKHR *pProperties)
VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode, uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR *pCapabilities)
VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkDisplayPlanePropertiesKHR *pProperties)
VkDisplayPlaneAlphaFlagBitsKHR
@ VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_PREMULTIPLIED_BIT_KHR
@ VK_DISPLAY_PLANE_ALPHA_OPAQUE_BIT_KHR
@ VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR
@ VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_BIT_KHR
VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices)
#define VK_KHR_DISPLAY_EXTENSION_NAME
VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t *pPropertyCount, VkDisplayModePropertiesKHR *pProperties)
@ VK_ERROR_VALIDATION_FAILED_EXT
@ VK_OPERATION_NOT_DEFERRED_KHR
@ VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT
@ VK_ERROR_INVALID_SHADER_NV
@ VK_ERROR_EXTENSION_NOT_PRESENT
@ VK_ERROR_INVALID_EXTERNAL_HANDLE
@ VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT
@ VK_ERROR_OUT_OF_HOST_MEMORY
@ VK_ERROR_INITIALIZATION_FAILED
@ VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS
@ VK_ERROR_INCOMPATIBLE_DISPLAY_KHR
@ VK_ERROR_OUT_OF_DEVICE_MEMORY
@ VK_ERROR_NATIVE_WINDOW_IN_USE_KHR
@ VK_ERROR_NOT_PERMITTED_EXT
@ VK_ERROR_INCOMPATIBLE_VERSION_KHR
@ VK_OPERATION_DEFERRED_KHR
@ VK_ERROR_OUT_OF_DATE_KHR
@ VK_ERROR_FORMAT_NOT_SUPPORTED
@ VK_ERROR_FRAGMENTED_POOL
@ VK_ERROR_SURFACE_LOST_KHR
@ VK_PIPELINE_COMPILE_REQUIRED_EXT
@ VK_ERROR_FEATURE_NOT_PRESENT
@ VK_ERROR_TOO_MANY_OBJECTS
@ VK_ERROR_MEMORY_MAP_FAILED
@ VK_ERROR_LAYER_NOT_PRESENT
@ VK_ERROR_INCOMPATIBLE_DRIVER
@ VK_ERROR_OUT_OF_POOL_MEMORY
VKAPI_ATTR VkResult VKAPI_CALL vkCreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface)
VkResult(VKAPI_PTR * PFN_vkEnumerateInstanceExtensionProperties)(const char *pLayerName, uint32_t *pPropertyCount, VkExtensionProperties *pProperties)
@ VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR
PFN_vkVoidFunction(VKAPI_PTR * PFN_vkGetInstanceProcAddr)(VkInstance instance, const char *pName)
@ VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR