Skip to content

Commit 9a13f3f

Browse files
committed
Implement opt-in instance extensions
1 parent 3ebc5f4 commit 9a13f3f

File tree

2 files changed

+46
-15
lines changed

2 files changed

+46
-15
lines changed

include/SDL3/SDL_gpu.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2365,6 +2365,8 @@ typedef struct SDL_GPUVulkanOptions
23652365
Uint32 vulkan_api_version; /**< The Vulkan API version to request for the instance. Use Vulkan's VK_MAKE_VERSION or VK_MAKE_API_VERSION. */
23662366
void *feature_list; /**< Pointer to the first element of a list of structs to be passed to device creation. */
23672367
void *vulkan_10_physical_device_features; /**< Pointer to a VkPhysicalDeviceFeatures struct to enable additional Vulkan 1.0 features. */
2368+
Uint32 instance_extension_count; /**< Number of additional instance extensions to require. */
2369+
char **instance_extension_names; /**< Pointer to a list of additional instance extensions to require. */
23682370
} SDL_GPUVulkanOptions;
23692371

23702372
/**

src/gpu/vulkan/SDL_gpu_vulkan.c

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,6 +1113,8 @@ struct VulkanRenderer
11131113
VkPhysicalDeviceVulkan11Features desiredVulkan11DeviceFeatures;
11141114
VkPhysicalDeviceVulkan12Features desiredVulkan12DeviceFeatures;
11151115
VkPhysicalDeviceVulkan13Features desiredVulkan13DeviceFeatures;
1116+
Uint32 additionalInstanceExtensionCount;
1117+
char **additionalInstanceExtensionNames;
11161118

11171119
bool debugMode;
11181120
bool preferLowPower;
@@ -11080,7 +11082,8 @@ static Uint8 VULKAN_INTERNAL_CheckInstanceExtensions(
1108011082
Uint32 requiredExtensionsLength,
1108111083
bool *supportsDebugUtils,
1108211084
bool *supportsColorspace,
11083-
bool *supportsPhysicalDeviceProperties2)
11085+
bool *supportsPhysicalDeviceProperties2,
11086+
int *firstUnsupportedExtensionIndex)
1108411087
{
1108511088
Uint32 extensionCount, i;
1108611089
VkExtensionProperties *availableExtensions;
@@ -11103,6 +11106,7 @@ static Uint8 VULKAN_INTERNAL_CheckInstanceExtensions(
1110311106
availableExtensions,
1110411107
extensionCount)) {
1110511108
allExtensionsSupported = 0;
11109+
*firstUnsupportedExtensionIndex = i;
1110611110
break;
1110711111
}
1110811112
}
@@ -11645,6 +11649,9 @@ static bool VULKAN_INTERNAL_AddOptInVulkanOptions(SDL_PropertiesID props, Vulkan
1164511649
}
1164611650
}
1164711651
}
11652+
11653+
renderer->additionalInstanceExtensionCount = options->instance_extension_count;
11654+
renderer->additionalInstanceExtensionNames = options->instance_extension_names;
1164811655
}
1164911656
}
1165011657

@@ -11684,37 +11691,59 @@ static Uint8 VULKAN_INTERNAL_CreateInstance(VulkanRenderer *renderer)
1168411691
return 0;
1168511692
}
1168611693

11694+
Uint32 extraInstanceExtensionCount = renderer->additionalInstanceExtensionCount;
11695+
char** extraInstanceExtensionNames = renderer->additionalInstanceExtensionNames;
11696+
1168711697
/* Extra space for the following extensions:
1168811698
* VK_KHR_get_physical_device_properties2
1168911699
* VK_EXT_swapchain_colorspace
1169011700
* VK_EXT_debug_utils
1169111701
* VK_KHR_portability_enumeration
11702+
*
11703+
* Plus additional opt-in extensions.
1169211704
*/
1169311705
instanceExtensionNames = SDL_stack_alloc(
1169411706
const char *,
11695-
instanceExtensionCount + 4);
11696-
SDL_memcpy((void *)instanceExtensionNames, originalInstanceExtensionNames, instanceExtensionCount * sizeof(const char *));
11707+
instanceExtensionCount + 4 + extraInstanceExtensionCount);
11708+
const char** nextInstanceExtensionNamePtr = instanceExtensionNames;
11709+
SDL_memcpy((void *)nextInstanceExtensionNamePtr, originalInstanceExtensionNames, instanceExtensionCount * sizeof(const char *));
11710+
nextInstanceExtensionNamePtr += instanceExtensionCount;
11711+
11712+
if (extraInstanceExtensionCount > 0) {
11713+
SDL_memcpy((void *)nextInstanceExtensionNamePtr, extraInstanceExtensionNames, extraInstanceExtensionCount * sizeof(const char *));
11714+
nextInstanceExtensionNamePtr += extraInstanceExtensionCount;
11715+
}
11716+
1169711717

1169811718
#ifdef SDL_PLATFORM_APPLE
11699-
instanceExtensionNames[instanceExtensionCount++] =
11700-
VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME;
11719+
*nextInstanceExtensionNamePtr++ = VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME;
11720+
instanceExtensionCount++;
1170111721
createFlags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
1170211722
#endif
1170311723

11724+
int firstUnsupportedExtensionIndex = 0;
1170411725
if (!VULKAN_INTERNAL_CheckInstanceExtensions(
1170511726
instanceExtensionNames,
11706-
instanceExtensionCount,
11727+
instanceExtensionCount + extraInstanceExtensionCount,
1170711728
&renderer->supportsDebugUtils,
1170811729
&renderer->supportsColorspace,
11709-
&renderer->supportsPhysicalDeviceProperties2)) {
11730+
&renderer->supportsPhysicalDeviceProperties2,
11731+
&firstUnsupportedExtensionIndex)) {
11732+
if (renderer->debugMode) {
11733+
SDL_LogError(SDL_LOG_CATEGORY_GPU,
11734+
"Required Vulkan instance extension '%s' not supported",
11735+
instanceExtensionNames[firstUnsupportedExtensionIndex]);
11736+
}
11737+
SDL_SetError("Required Vulkan instance extension '%s' not supported",
11738+
instanceExtensionNames[firstUnsupportedExtensionIndex]);
1171011739
SDL_stack_free((char *)instanceExtensionNames);
11711-
SET_STRING_ERROR_AND_RETURN("Required Vulkan instance extensions not supported", false);
11740+
return false;
1171211741
}
1171311742

1171411743
if (renderer->supportsDebugUtils) {
1171511744
// Append the debug extension
11716-
instanceExtensionNames[instanceExtensionCount++] =
11717-
VK_EXT_DEBUG_UTILS_EXTENSION_NAME;
11745+
*nextInstanceExtensionNamePtr++ = VK_EXT_DEBUG_UTILS_EXTENSION_NAME;
11746+
instanceExtensionCount++;
1171811747
} else {
1171911748
SDL_LogWarn(
1172011749
SDL_LOG_CATEGORY_GPU,
@@ -11724,22 +11753,22 @@ static Uint8 VULKAN_INTERNAL_CreateInstance(VulkanRenderer *renderer)
1172411753

1172511754
if (renderer->supportsColorspace) {
1172611755
// Append colorspace extension
11727-
instanceExtensionNames[instanceExtensionCount++] =
11728-
VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME;
11756+
*nextInstanceExtensionNamePtr++ = VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME;
11757+
instanceExtensionCount++;
1172911758
}
1173011759

1173111760
if (renderer->supportsPhysicalDeviceProperties2) {
1173211761
// Append KHR_physical_device_properties2 extension
11733-
instanceExtensionNames[instanceExtensionCount++] =
11734-
VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME;
11762+
*nextInstanceExtensionNamePtr++ = VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME;
11763+
instanceExtensionCount++;
1173511764
}
1173611765

1173711766
createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
1173811767
createInfo.pNext = NULL;
1173911768
createInfo.flags = createFlags;
1174011769
createInfo.pApplicationInfo = &appInfo;
1174111770
createInfo.ppEnabledLayerNames = layerNames;
11742-
createInfo.enabledExtensionCount = instanceExtensionCount;
11771+
createInfo.enabledExtensionCount = instanceExtensionCount + extraInstanceExtensionCount;
1174311772
createInfo.ppEnabledExtensionNames = instanceExtensionNames;
1174411773
if (renderer->debugMode) {
1174511774
createInfo.enabledLayerCount = SDL_arraysize(layerNames);

0 commit comments

Comments
 (0)