@@ -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