SDL_vulkan_utils: minor code clean-up

This commit is contained in:
Sylvain Becker 2021-02-03 09:51:42 +01:00
parent c0166a29b7
commit 549bc13362
1 changed files with 147 additions and 187 deletions

View File

@ -23,14 +23,11 @@
#include "SDL_vulkan_internal.h" #include "SDL_vulkan_internal.h"
#include "SDL_error.h" #include "SDL_error.h"
/* !!! FIXME: this file doesn't match coding standards for SDL (brace position, etc). */
#if SDL_VIDEO_VULKAN #if SDL_VIDEO_VULKAN
const char *SDL_Vulkan_GetResultString(VkResult result) const char *SDL_Vulkan_GetResultString(VkResult result)
{ {
switch((int)result) switch ((int)result) {
{
case VK_SUCCESS: case VK_SUCCESS:
return "VK_SUCCESS"; return "VK_SUCCESS";
case VK_NOT_READY: case VK_NOT_READY:
@ -112,8 +109,9 @@ const char *SDL_Vulkan_GetResultString(VkResult result)
default: default:
break; break;
} }
if(result < 0) if (result < 0) {
return "VK_ERROR_<Unknown>"; return "VK_ERROR_<Unknown>";
}
return "VK_<Unknown>"; return "VK_<Unknown>";
} }
@ -124,11 +122,9 @@ VkExtensionProperties *SDL_Vulkan_CreateInstanceExtensionsList(
Uint32 count = 0; Uint32 count = 0;
VkResult result = vkEnumerateInstanceExtensionProperties(NULL, &count, NULL); VkResult result = vkEnumerateInstanceExtensionProperties(NULL, &count, NULL);
VkExtensionProperties *retval; VkExtensionProperties *retval;
if(result == VK_ERROR_INCOMPATIBLE_DRIVER)
{ if (result == VK_ERROR_INCOMPATIBLE_DRIVER) {
/* Avoid the ERR_MAX_STRLEN limit by passing part of the message /* Avoid the ERR_MAX_STRLEN limit by passing part of the message as a string argument. */
* as a string argument.
*/
SDL_SetError( SDL_SetError(
"You probably don't have a working Vulkan driver installed. %s %s %s(%d)", "You probably don't have a working Vulkan driver installed. %s %s %s(%d)",
"Getting Vulkan extensions failed:", "Getting Vulkan extensions failed:",
@ -136,9 +132,7 @@ VkExtensionProperties *SDL_Vulkan_CreateInstanceExtensionsList(
SDL_Vulkan_GetResultString(result), SDL_Vulkan_GetResultString(result),
(int)result); (int)result);
return NULL; return NULL;
} } else if (result != VK_SUCCESS) {
else if(result != VK_SUCCESS)
{
SDL_SetError( SDL_SetError(
"Getting Vulkan extensions failed: vkEnumerateInstanceExtensionProperties returned " "Getting Vulkan extensions failed: vkEnumerateInstanceExtensionProperties returned "
"%s(%d)", "%s(%d)",
@ -146,22 +140,20 @@ VkExtensionProperties *SDL_Vulkan_CreateInstanceExtensionsList(
(int)result); (int)result);
return NULL; return NULL;
} }
if(count == 0)
{ if (count == 0) {
retval = SDL_calloc(1, sizeof(VkExtensionProperties)); // so we can return non-null retval = SDL_calloc(1, sizeof(VkExtensionProperties)); // so we can return non-null
} } else {
else
{
retval = SDL_calloc(count, sizeof(VkExtensionProperties)); retval = SDL_calloc(count, sizeof(VkExtensionProperties));
} }
if(!retval)
{ if (!retval) {
SDL_OutOfMemory(); SDL_OutOfMemory();
return NULL; return NULL;
} }
result = vkEnumerateInstanceExtensionProperties(NULL, &count, retval); result = vkEnumerateInstanceExtensionProperties(NULL, &count, retval);
if(result != VK_SUCCESS) if (result != VK_SUCCESS) {
{
SDL_SetError( SDL_SetError(
"Getting Vulkan extensions failed: vkEnumerateInstanceExtensionProperties returned " "Getting Vulkan extensions failed: vkEnumerateInstanceExtensionProperties returned "
"%s(%d)", "%s(%d)",
@ -186,6 +178,7 @@ SDL_bool SDL_Vulkan_GetInstanceExtensions_Helper(unsigned *userCount,
SDL_SetError("Output array for SDL_Vulkan_GetInstanceExtensions needs to be at least %d big", nameCount); SDL_SetError("Output array for SDL_Vulkan_GetInstanceExtensions needs to be at least %d big", nameCount);
return SDL_FALSE; return SDL_FALSE;
} }
for (i = 0; i < nameCount; i++) { for (i = 0; i < nameCount; i++) {
userNames[i] = names[i]; userNames[i] = names[i];
} }
@ -226,54 +219,46 @@ SDL_bool SDL_Vulkan_Display_CreateSurface(void *vkGetInstanceProcAddr_,
const char *chosenDisplayId; const char *chosenDisplayId;
int displayId = 0; /* Counting from physical device 0, display 0 */ int displayId = 0; /* Counting from physical device 0, display 0 */
if(!vkEnumeratePhysicalDevices || if (!vkEnumeratePhysicalDevices ||
!vkGetPhysicalDeviceDisplayPropertiesKHR || !vkGetPhysicalDeviceDisplayPropertiesKHR ||
!vkGetDisplayModePropertiesKHR || !vkGetDisplayModePropertiesKHR ||
!vkGetPhysicalDeviceDisplayPlanePropertiesKHR || !vkGetPhysicalDeviceDisplayPlanePropertiesKHR ||
!vkGetDisplayPlaneCapabilitiesKHR || !vkGetDisplayPlaneCapabilitiesKHR ||
!vkGetDisplayPlaneSupportedDisplaysKHR || !vkGetDisplayPlaneSupportedDisplaysKHR ||
!vkCreateDisplayPlaneSurfaceKHR) !vkCreateDisplayPlaneSurfaceKHR) {
{ SDL_SetError(VK_KHR_DISPLAY_EXTENSION_NAME " extension is not enabled in the Vulkan instance.");
SDL_SetError(VK_KHR_DISPLAY_EXTENSION_NAME
" extension is not enabled in the Vulkan instance.");
goto error; goto error;
} }
if ((chosenDisplayId = SDL_getenv("SDL_VULKAN_DISPLAY")) != NULL) if ((chosenDisplayId = SDL_getenv("SDL_VULKAN_DISPLAY")) != NULL) {
{
displayId = SDL_atoi(chosenDisplayId); displayId = SDL_atoi(chosenDisplayId);
} }
/* Enumerate physical devices */ /* Enumerate physical devices */
result = result = vkEnumeratePhysicalDevices(instance, &physicalDeviceCount, NULL);
vkEnumeratePhysicalDevices(instance, &physicalDeviceCount, NULL); if (result != VK_SUCCESS) {
if(result != VK_SUCCESS)
{
SDL_SetError("Could not enumerate Vulkan physical devices"); SDL_SetError("Could not enumerate Vulkan physical devices");
goto error; goto error;
} }
if(physicalDeviceCount == 0)
{ if (physicalDeviceCount == 0) {
SDL_SetError("No Vulkan physical devices"); SDL_SetError("No Vulkan physical devices");
goto error; goto error;
} }
physicalDevices = SDL_malloc(sizeof(VkPhysicalDevice) * physicalDeviceCount); physicalDevices = SDL_malloc(sizeof(VkPhysicalDevice) * physicalDeviceCount);
if(!physicalDevices) if (!physicalDevices) {
{
SDL_OutOfMemory(); SDL_OutOfMemory();
goto error; goto error;
} }
result =
vkEnumeratePhysicalDevices(instance, &physicalDeviceCount, physicalDevices); result = vkEnumeratePhysicalDevices(instance, &physicalDeviceCount, physicalDevices);
if(result != VK_SUCCESS) if (result != VK_SUCCESS) {
{
SDL_SetError("Error enumerating physical devices"); SDL_SetError("Error enumerating physical devices");
goto error; goto error;
} }
for(physicalDeviceIndex = 0; physicalDeviceIndex < physicalDeviceCount; for (physicalDeviceIndex = 0; physicalDeviceIndex < physicalDeviceCount; physicalDeviceIndex++) {
physicalDeviceIndex++)
{
VkPhysicalDevice physicalDevice = physicalDevices[physicalDeviceIndex]; VkPhysicalDevice physicalDevice = physicalDevices[physicalDeviceIndex];
uint32_t displayPropertiesCount = 0; uint32_t displayPropertiesCount = 0;
VkDisplayPropertiesKHR *displayProperties = NULL; VkDisplayPropertiesKHR *displayProperties = NULL;
@ -290,32 +275,27 @@ SDL_bool SDL_Vulkan_Display_CreateSurface(void *vkGetInstanceProcAddr_,
VkDisplayPlaneCapabilitiesKHR planeCaps; VkDisplayPlaneCapabilitiesKHR planeCaps;
/* Get information about the physical displays */ /* Get information about the physical displays */
result = result = vkGetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, &displayPropertiesCount, NULL);
vkGetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, &displayPropertiesCount, NULL); if (result != VK_SUCCESS || displayPropertiesCount == 0) {
if (result != VK_SUCCESS || displayPropertiesCount == 0)
{
/* This device has no physical device display properties, move on to next. */ /* This device has no physical device display properties, move on to next. */
continue; continue;
} }
SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "vulkandisplay: Number of display properties for device %u: %u", SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "vulkandisplay: Number of display properties for device %u: %u",
physicalDeviceIndex, displayPropertiesCount); physicalDeviceIndex, displayPropertiesCount);
if ( (displayId < 0) || (((uint32_t) displayId) >= displayPropertiesCount) ) if (displayId < 0 || (uint32_t) displayId >= displayPropertiesCount) {
{
/* Display id specified was higher than number of available displays, move to next physical device. */ /* Display id specified was higher than number of available displays, move to next physical device. */
displayId -= displayPropertiesCount; displayId -= displayPropertiesCount;
continue; continue;
} }
displayProperties = SDL_malloc(sizeof(VkDisplayPropertiesKHR) * displayPropertiesCount); displayProperties = SDL_malloc(sizeof(VkDisplayPropertiesKHR) * displayPropertiesCount);
if(!displayProperties) if (!displayProperties) {
{
SDL_OutOfMemory(); SDL_OutOfMemory();
goto error; goto error;
} }
result = result = vkGetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, &displayPropertiesCount, displayProperties);
vkGetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, &displayPropertiesCount, displayProperties);
if (result != VK_SUCCESS || displayPropertiesCount == 0) { if (result != VK_SUCCESS || displayPropertiesCount == 0) {
SDL_free(displayProperties); SDL_free(displayProperties);
SDL_SetError("Error enumerating physical device displays"); SDL_SetError("Error enumerating physical device displays");
@ -331,8 +311,7 @@ SDL_bool SDL_Vulkan_Display_CreateSurface(void *vkGetInstanceProcAddr_,
displayProperties = NULL; displayProperties = NULL;
/* Get display mode properties for the chosen display */ /* Get display mode properties for the chosen display */
result = result = vkGetDisplayModePropertiesKHR(physicalDevice, display, &displayModePropertiesCount, NULL);
vkGetDisplayModePropertiesKHR(physicalDevice, display, &displayModePropertiesCount, NULL);
if (result != VK_SUCCESS || displayModePropertiesCount == 0) if (result != VK_SUCCESS || displayModePropertiesCount == 0)
{ {
SDL_SetError("Error enumerating display modes"); SDL_SetError("Error enumerating display modes");
@ -341,14 +320,12 @@ SDL_bool SDL_Vulkan_Display_CreateSurface(void *vkGetInstanceProcAddr_,
SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "vulkandisplay: Number of display modes: %u", displayModePropertiesCount); SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "vulkandisplay: Number of display modes: %u", displayModePropertiesCount);
displayModeProperties = SDL_malloc(sizeof(VkDisplayModePropertiesKHR) * displayModePropertiesCount); displayModeProperties = SDL_malloc(sizeof(VkDisplayModePropertiesKHR) * displayModePropertiesCount);
if(!displayModeProperties) if (!displayModeProperties) {
{
SDL_OutOfMemory(); SDL_OutOfMemory();
goto error; goto error;
} }
result = result = vkGetDisplayModePropertiesKHR(physicalDevice, display, &displayModePropertiesCount, displayModeProperties);
vkGetDisplayModePropertiesKHR(physicalDevice, display, &displayModePropertiesCount, displayModeProperties);
if (result != VK_SUCCESS || displayModePropertiesCount == 0) { if (result != VK_SUCCESS || displayModePropertiesCount == 0) {
SDL_SetError("Error enumerating display modes"); SDL_SetError("Error enumerating display modes");
SDL_free(displayModeProperties); SDL_free(displayModeProperties);
@ -356,18 +333,16 @@ SDL_bool SDL_Vulkan_Display_CreateSurface(void *vkGetInstanceProcAddr_,
} }
/* Try to find a display mode that matches the native resolution */ /* Try to find a display mode that matches the native resolution */
for (i = 0; i < displayModePropertiesCount; ++i) for (i = 0; i < displayModePropertiesCount; ++i) {
{
if (displayModeProperties[i].parameters.visibleRegion.width == extent.width && if (displayModeProperties[i].parameters.visibleRegion.width == extent.width &&
displayModeProperties[i].parameters.visibleRegion.height == extent.height && displayModeProperties[i].parameters.visibleRegion.height == extent.height &&
displayModeProperties[i].parameters.refreshRate > refreshRate) displayModeProperties[i].parameters.refreshRate > refreshRate) {
{
bestMatchIndex = i; bestMatchIndex = i;
refreshRate = displayModeProperties[i].parameters.refreshRate; refreshRate = displayModeProperties[i].parameters.refreshRate;
} }
} }
if (bestMatchIndex < 0)
{ if (bestMatchIndex < 0) {
SDL_SetError("Found no matching display mode"); SDL_SetError("Found no matching display mode");
SDL_free(displayModeProperties); SDL_free(displayModeProperties);
goto error; goto error;
@ -384,62 +359,53 @@ SDL_bool SDL_Vulkan_Display_CreateSurface(void *vkGetInstanceProcAddr_,
displayModeProperties = NULL; displayModeProperties = NULL;
/* Try to find a plane index that supports our display */ /* Try to find a plane index that supports our display */
result = result = vkGetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, &displayPlanePropertiesCount, NULL);
vkGetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, &displayPlanePropertiesCount, NULL); if (result != VK_SUCCESS || displayPlanePropertiesCount == 0) {
if (result != VK_SUCCESS || displayPlanePropertiesCount == 0)
{
SDL_SetError("Error enumerating display planes"); SDL_SetError("Error enumerating display planes");
goto error; goto error;
} }
SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "vulkandisplay: Number of display planes: %u", displayPlanePropertiesCount); SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "vulkandisplay: Number of display planes: %u", displayPlanePropertiesCount);
displayPlaneProperties = SDL_malloc(sizeof(VkDisplayPlanePropertiesKHR) * displayPlanePropertiesCount); displayPlaneProperties = SDL_malloc(sizeof(VkDisplayPlanePropertiesKHR) * displayPlanePropertiesCount);
if(!displayPlaneProperties) if (!displayPlaneProperties) {
{
SDL_OutOfMemory(); SDL_OutOfMemory();
goto error; goto error;
} }
result = result = vkGetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, &displayPlanePropertiesCount, displayPlaneProperties);
vkGetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, &displayPlanePropertiesCount, displayPlaneProperties); if (result != VK_SUCCESS || displayPlanePropertiesCount == 0) {
if (result != VK_SUCCESS || displayPlanePropertiesCount == 0)
{
SDL_SetError("Error enumerating display plane properties"); SDL_SetError("Error enumerating display plane properties");
SDL_free(displayPlaneProperties); SDL_free(displayPlaneProperties);
goto error; goto error;
} }
for (i = 0; i < displayPlanePropertiesCount; ++i) for (i = 0; i < displayPlanePropertiesCount; ++i) {
{
uint32_t planeSupportedDisplaysCount = 0; uint32_t planeSupportedDisplaysCount = 0;
VkDisplayKHR *planeSupportedDisplays = NULL; VkDisplayKHR *planeSupportedDisplays = NULL;
uint32_t j; uint32_t j;
/* Check if plane is attached to a display, if not, continue. */ /* Check if plane is attached to a display, if not, continue. */
if (displayPlaneProperties[i].currentDisplay == VK_NULL_HANDLE) if (displayPlaneProperties[i].currentDisplay == VK_NULL_HANDLE) {
continue; continue;
}
/* Check supported displays for this plane. */ /* Check supported displays for this plane. */
result = result = vkGetDisplayPlaneSupportedDisplaysKHR(physicalDevice, i, &planeSupportedDisplaysCount, NULL);
vkGetDisplayPlaneSupportedDisplaysKHR(physicalDevice, i, &planeSupportedDisplaysCount, NULL); if (result != VK_SUCCESS || planeSupportedDisplaysCount == 0) {
if (result != VK_SUCCESS || planeSupportedDisplaysCount == 0)
{
continue; /* No supported displays, on to next plane. */ continue; /* No supported displays, on to next plane. */
} }
SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "vulkandisplay: Number of supported displays for plane %u: %u", i, planeSupportedDisplaysCount); SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "vulkandisplay: Number of supported displays for plane %u: %u", i, planeSupportedDisplaysCount);
planeSupportedDisplays = SDL_malloc(sizeof(VkDisplayKHR) * planeSupportedDisplaysCount); planeSupportedDisplays = SDL_malloc(sizeof(VkDisplayKHR) * planeSupportedDisplaysCount);
if(!planeSupportedDisplays) if (!planeSupportedDisplays) {
{
SDL_free(displayPlaneProperties); SDL_free(displayPlaneProperties);
SDL_OutOfMemory(); SDL_OutOfMemory();
goto error; goto error;
} }
result = result = vkGetDisplayPlaneSupportedDisplaysKHR(physicalDevice, i, &planeSupportedDisplaysCount, planeSupportedDisplays);
vkGetDisplayPlaneSupportedDisplaysKHR(physicalDevice, i, &planeSupportedDisplaysCount, planeSupportedDisplays); if (result != VK_SUCCESS || planeSupportedDisplaysCount == 0) {
if (result != VK_SUCCESS || planeSupportedDisplaysCount == 0)
{
SDL_SetError("Error enumerating supported displays, or no supported displays"); SDL_SetError("Error enumerating supported displays, or no supported displays");
SDL_free(planeSupportedDisplays); SDL_free(planeSupportedDisplays);
SDL_free(displayPlaneProperties); SDL_free(displayPlaneProperties);
@ -447,20 +413,19 @@ SDL_bool SDL_Vulkan_Display_CreateSurface(void *vkGetInstanceProcAddr_,
} }
for (j = 0; j < planeSupportedDisplaysCount && planeSupportedDisplays[j] != display; ++j) for (j = 0; j < planeSupportedDisplaysCount && planeSupportedDisplays[j] != display; ++j)
; {
}
SDL_free(planeSupportedDisplays); SDL_free(planeSupportedDisplays);
planeSupportedDisplays = NULL; planeSupportedDisplays = NULL;
if (j == planeSupportedDisplaysCount) if (j == planeSupportedDisplaysCount) {
{
/* This display is not supported for this plane, move on. */ /* This display is not supported for this plane, move on. */
continue; continue;
} }
result = vkGetDisplayPlaneCapabilitiesKHR(physicalDevice, createInfo.displayMode, i, &planeCaps); result = vkGetDisplayPlaneCapabilitiesKHR(physicalDevice, createInfo.displayMode, i, &planeCaps);
if (result != VK_SUCCESS) if (result != VK_SUCCESS) {
{
SDL_SetError("Error getting display plane capabilities"); SDL_SetError("Error getting display plane capabilities");
SDL_free(displayPlaneProperties); SDL_free(displayPlaneProperties);
goto error; goto error;
@ -468,8 +433,7 @@ SDL_bool SDL_Vulkan_Display_CreateSurface(void *vkGetInstanceProcAddr_,
/* Check if plane fulfills extent requirements. */ /* Check if plane fulfills extent requirements. */
if (extent.width >= planeCaps.minDstExtent.width && extent.height >= planeCaps.minDstExtent.height && if (extent.width >= planeCaps.minDstExtent.width && extent.height >= planeCaps.minDstExtent.height &&
extent.width <= planeCaps.maxDstExtent.width && extent.height <= planeCaps.maxDstExtent.height) extent.width <= planeCaps.maxDstExtent.width && extent.height <= planeCaps.maxDstExtent.height) {
{
/* If it does, choose this plane. */ /* If it does, choose this plane. */
SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "vulkandisplay: Choosing plane %d, minimum extent %dx%d maximum extent %dx%d", i, SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "vulkandisplay: Choosing plane %d, minimum extent %dx%d maximum extent %dx%d", i,
planeCaps.minDstExtent.width, planeCaps.minDstExtent.height, planeCaps.minDstExtent.width, planeCaps.minDstExtent.height,
@ -479,8 +443,7 @@ SDL_bool SDL_Vulkan_Display_CreateSurface(void *vkGetInstanceProcAddr_,
} }
} }
if (planeIndex < 0) if (planeIndex < 0) {
{
SDL_SetError("No plane supports the selected resolution"); SDL_SetError("No plane supports the selected resolution");
SDL_free(displayPlaneProperties); SDL_free(displayPlaneProperties);
goto error; goto error;
@ -509,8 +472,7 @@ SDL_bool SDL_Vulkan_Display_CreateSurface(void *vkGetInstanceProcAddr_,
SDL_free(physicalDevices); SDL_free(physicalDevices);
physicalDevices = NULL; physicalDevices = NULL;
if (physicalDeviceIndex == physicalDeviceCount) if (physicalDeviceIndex == physicalDeviceCount) {
{
SDL_SetError("No usable displays found or requested display out of range"); SDL_SetError("No usable displays found or requested display out of range");
return SDL_FALSE; return SDL_FALSE;
} }
@ -519,16 +481,14 @@ SDL_bool SDL_Vulkan_Display_CreateSurface(void *vkGetInstanceProcAddr_,
createInfo.transform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; createInfo.transform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
createInfo.globalAlpha = 1.0f; createInfo.globalAlpha = 1.0f;
result = vkCreateDisplayPlaneSurfaceKHR(instance, &createInfo, result = vkCreateDisplayPlaneSurfaceKHR(instance, &createInfo, NULL, surface);
NULL, surface); if (result != VK_SUCCESS) {
if(result != VK_SUCCESS) SDL_SetError("vkCreateDisplayPlaneSurfaceKHR failed: %s", SDL_Vulkan_GetResultString(result));
{
SDL_SetError("vkCreateDisplayPlaneSurfaceKHR failed: %s",
SDL_Vulkan_GetResultString(result));
return SDL_FALSE; return SDL_FALSE;
} }
SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "vulkandisplay: Created surface"); SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "vulkandisplay: Created surface");
return SDL_TRUE; return SDL_TRUE;
error: error:
SDL_free(physicalDevices); SDL_free(physicalDevices);
return SDL_FALSE; return SDL_FALSE;