diff --git a/include/SDL3/SDL_vulkan.h b/include/SDL3/SDL_vulkan.h index 13047c9d0c..3b2cd31894 100644 --- a/include/SDL3/SDL_vulkan.h +++ b/include/SDL3/SDL_vulkan.h @@ -160,8 +160,7 @@ extern DECLSPEC void SDLCALL SDL_Vulkan_UnloadLibrary(void); * * \sa SDL_Vulkan_CreateSurface */ -extern DECLSPEC SDL_bool SDLCALL SDL_Vulkan_GetInstanceExtensions(unsigned int *pCount, - const char **pNames); +extern DECLSPEC char const* const* SDLCALL SDL_Vulkan_GetInstanceExtensions(Uint32 *pCount); /** * Create a Vulkan rendering surface for a window. diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h index 868a35ec9d..25ee29776f 100644 --- a/src/dynapi/SDL_dynapi_procs.h +++ b/src/dynapi/SDL_dynapi_procs.h @@ -719,7 +719,7 @@ SDL_DYNAPI_PROC(int,SDL_UpdateWindowSurface,(SDL_Window *a),(a),return) SDL_DYNAPI_PROC(int,SDL_UpdateWindowSurfaceRects,(SDL_Window *a, const SDL_Rect *b, int c),(a,b,c),return) SDL_DYNAPI_PROC(int,SDL_UpdateYUVTexture,(SDL_Texture *a, const SDL_Rect *b, const Uint8 *c, int d, const Uint8 *e, int f, const Uint8 *g, int h),(a,b,c,d,e,f,g,h),return) SDL_DYNAPI_PROC(SDL_bool,SDL_Vulkan_CreateSurface,(SDL_Window *a, VkInstance b, VkSurfaceKHR *c),(a,b,c),return) -SDL_DYNAPI_PROC(SDL_bool,SDL_Vulkan_GetInstanceExtensions,(unsigned int *a, const char **b),(a,b),return) +SDL_DYNAPI_PROC(char const* const*,SDL_Vulkan_GetInstanceExtensions,(Uint32 *a),(a),return) SDL_DYNAPI_PROC(SDL_FunctionPointer,SDL_Vulkan_GetVkGetInstanceProcAddr,(void),(),return) SDL_DYNAPI_PROC(int,SDL_Vulkan_LoadLibrary,(const char *a),(a),return) SDL_DYNAPI_PROC(void,SDL_Vulkan_UnloadLibrary,(void),(),) diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h index cb5e4c188e..40ca819422 100644 --- a/src/video/SDL_sysvideo.h +++ b/src/video/SDL_sysvideo.h @@ -290,7 +290,7 @@ struct SDL_VideoDevice */ int (*Vulkan_LoadLibrary)(SDL_VideoDevice *_this, const char *path); void (*Vulkan_UnloadLibrary)(SDL_VideoDevice *_this); - SDL_bool (*Vulkan_GetInstanceExtensions)(SDL_VideoDevice *_this, unsigned *count, const char **names); + char const* const* (*Vulkan_GetInstanceExtensions)(SDL_VideoDevice *_this, Uint32 *count); SDL_bool (*Vulkan_CreateSurface)(SDL_VideoDevice *_this, SDL_Window *window, VkInstance instance, VkSurfaceKHR *surface); /* * * */ diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index eec3e0dd87..d6f667dc3e 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -5140,14 +5140,9 @@ void SDL_Vulkan_UnloadLibrary(void) } } -SDL_bool SDL_Vulkan_GetInstanceExtensions(unsigned *count, const char **names) +char const* const* SDL_Vulkan_GetInstanceExtensions(Uint32 *count) { - if (count == NULL) { - SDL_InvalidParamError("count"); - return SDL_FALSE; - } - - return _this->Vulkan_GetInstanceExtensions(_this, count, names); + return _this->Vulkan_GetInstanceExtensions(_this, count); } SDL_bool SDL_Vulkan_CreateSurface(SDL_Window *window, diff --git a/src/video/SDL_vulkan_internal.h b/src/video/SDL_vulkan_internal.h index 5242aecef0..74452134bd 100644 --- a/src/video/SDL_vulkan_internal.h +++ b/src/video/SDL_vulkan_internal.h @@ -63,13 +63,6 @@ extern VkExtensionProperties *SDL_Vulkan_CreateInstanceExtensionsList( PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties, Uint32 *extensionCount); /* free returned list with SDL_free */ -/* Implements functionality of SDL_Vulkan_GetInstanceExtensions for a list of - * names passed in nameCount and names. */ -extern SDL_bool SDL_Vulkan_GetInstanceExtensions_Helper(unsigned *userCount, - const char **userNames, - unsigned nameCount, - const char *const *names); - /* Create a surface directly from a display connected to a physical device * using the DisplayKHR extension. * This needs to be passed an instance that was created with the VK_KHR_DISPLAY_EXTENSION_NAME diff --git a/src/video/SDL_vulkan_utils.c b/src/video/SDL_vulkan_utils.c index 2993fc7991..5ce81a7b08 100644 --- a/src/video/SDL_vulkan_utils.c +++ b/src/video/SDL_vulkan_utils.c @@ -167,27 +167,6 @@ VkExtensionProperties *SDL_Vulkan_CreateInstanceExtensionsList( return retval; } -SDL_bool SDL_Vulkan_GetInstanceExtensions_Helper(unsigned *userCount, - const char **userNames, - unsigned nameCount, - const char *const *names) -{ - if (userNames) { - unsigned i; - - if (*userCount < nameCount) { - SDL_SetError("Output array for SDL_Vulkan_GetInstanceExtensions needs to be at least %d big", nameCount); - return SDL_FALSE; - } - - for (i = 0; i < nameCount; i++) { - userNames[i] = names[i]; - } - } - *userCount = nameCount; - return SDL_TRUE; -} - /* Alpha modes, in order of preference */ static const VkDisplayPlaneAlphaFlagBitsKHR alphaModes[4] = { VK_DISPLAY_PLANE_ALPHA_OPAQUE_BIT_KHR, diff --git a/src/video/android/SDL_androidvulkan.c b/src/video/android/SDL_androidvulkan.c index 8a0af19629..d47d422a97 100644 --- a/src/video/android/SDL_androidvulkan.c +++ b/src/video/android/SDL_androidvulkan.c @@ -111,20 +111,16 @@ void Android_Vulkan_UnloadLibrary(SDL_VideoDevice *_this) } } -SDL_bool Android_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, - unsigned *count, - const char **names) +char const* const* Android_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, + Uint32 *count) { static const char *const extensionsForAndroid[] = { VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_ANDROID_SURFACE_EXTENSION_NAME }; - if (!_this->vulkan_config.loader_handle) { - SDL_SetError("Vulkan is not loaded"); - return SDL_FALSE; + if(count) { + *count = SDL_arraysize(extensionsForAndroid); } - return SDL_Vulkan_GetInstanceExtensions_Helper( - count, names, SDL_arraysize(extensionsForAndroid), - extensionsForAndroid); + return extensionsForAndroid; } SDL_bool Android_Vulkan_CreateSurface(SDL_VideoDevice *_this, diff --git a/src/video/cocoa/SDL_cocoavulkan.m b/src/video/cocoa/SDL_cocoavulkan.m index 027ba2ac24..55d1f352fb 100644 --- a/src/video/cocoa/SDL_cocoavulkan.m +++ b/src/video/cocoa/SDL_cocoavulkan.m @@ -163,20 +163,16 @@ void Cocoa_Vulkan_UnloadLibrary(SDL_VideoDevice *_this) } } -SDL_bool Cocoa_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, - unsigned *count, - const char **names) +char const* const* Cocoa_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, + Uint32 *count) { static const char *const extensionsForCocoa[] = { VK_KHR_SURFACE_EXTENSION_NAME, VK_EXT_METAL_SURFACE_EXTENSION_NAME }; - if (!_this->vulkan_config.loader_handle) { - SDL_SetError("Vulkan is not loaded"); - return SDL_FALSE; + if(count) { + *count = SDL_arraysize(extensionsForCocoa); } - return SDL_Vulkan_GetInstanceExtensions_Helper( - count, names, SDL_arraysize(extensionsForCocoa), - extensionsForCocoa); + return extensionsForCocoa; } static SDL_bool Cocoa_Vulkan_CreateSurfaceViaMetalView(SDL_VideoDevice *_this, diff --git a/src/video/kmsdrm/SDL_kmsdrmvulkan.c b/src/video/kmsdrm/SDL_kmsdrmvulkan.c index 619053c9fc..fba00b6585 100644 --- a/src/video/kmsdrm/SDL_kmsdrmvulkan.c +++ b/src/video/kmsdrm/SDL_kmsdrmvulkan.c @@ -142,20 +142,14 @@ void KMSDRM_Vulkan_UnloadLibrary(SDL_VideoDevice *_this) /* members of the VkInstanceCreateInfo struct passed to */ /* vkCreateInstance(). */ /*********************************************************************/ -SDL_bool KMSDRM_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, - unsigned *count, - const char **names) +char const* const* KMSDRM_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, + Uint32 *count) { static const char *const extensionsForKMSDRM[] = { VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_DISPLAY_EXTENSION_NAME }; - if (!_this->vulkan_config.loader_handle) { - SDL_SetError("Vulkan is not loaded"); - return SDL_FALSE; - } - return SDL_Vulkan_GetInstanceExtensions_Helper( - count, names, SDL_arraysize(extensionsForKMSDRM), - extensionsForKMSDRM); + if(count) { *count = SDL_arraysize(extensionsForKMSDRM); } + return extensionsForKMSDRM; } /***********************************************************************/ diff --git a/src/video/kmsdrm/SDL_kmsdrmvulkan.h b/src/video/kmsdrm/SDL_kmsdrmvulkan.h index 68efc02d03..7db828d93a 100644 --- a/src/video/kmsdrm/SDL_kmsdrmvulkan.h +++ b/src/video/kmsdrm/SDL_kmsdrmvulkan.h @@ -36,9 +36,8 @@ int KMSDRM_Vulkan_LoadLibrary(SDL_VideoDevice *_this, const char *path); void KMSDRM_Vulkan_UnloadLibrary(SDL_VideoDevice *_this); -SDL_bool KMSDRM_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, - unsigned *count, - const char **names); +char const* const* KMSDRM_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, + Uint32 *count); SDL_bool KMSDRM_Vulkan_CreateSurface(SDL_VideoDevice *_this, SDL_Window *window, VkInstance instance, diff --git a/src/video/uikit/SDL_uikitvulkan.m b/src/video/uikit/SDL_uikitvulkan.m index 5bdc743807..833485062b 100644 --- a/src/video/uikit/SDL_uikitvulkan.m +++ b/src/video/uikit/SDL_uikitvulkan.m @@ -169,21 +169,16 @@ void UIKit_Vulkan_UnloadLibrary(SDL_VideoDevice *_this) } } -SDL_bool UIKit_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, - unsigned *count, - const char **names) +char const* const* UIKit_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, + Uint32 *count) { static const char *const extensionsForUIKit[] = { VK_KHR_SURFACE_EXTENSION_NAME, VK_EXT_METAL_SURFACE_EXTENSION_NAME }; - if (!_this->vulkan_config.loader_handle) { - SDL_SetError("Vulkan is not loaded"); - return SDL_FALSE; + if(count) { + *count = SDL_arraysize(extensionsForUIKit); } - - return SDL_Vulkan_GetInstanceExtensions_Helper( - count, names, SDL_arraysize(extensionsForUIKit), - extensionsForUIKit); + return extensionsForUIKit; } SDL_bool UIKit_Vulkan_CreateSurface(SDL_VideoDevice *_this, diff --git a/src/video/vivante/SDL_vivantevulkan.c b/src/video/vivante/SDL_vivantevulkan.c index 24d9107002..d5a30e79e9 100644 --- a/src/video/vivante/SDL_vivantevulkan.c +++ b/src/video/vivante/SDL_vivantevulkan.c @@ -118,20 +118,16 @@ void VIVANTE_Vulkan_UnloadLibrary(SDL_VideoDevice *_this) } } -SDL_bool VIVANTE_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, - unsigned *count, - const char **names) +char const* const* VIVANTE_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, + Uint32 *count) { static const char *const extensionsForVivante[] = { VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_DISPLAY_EXTENSION_NAME }; - if (!_this->vulkan_config.loader_handle) { - SDL_SetError("Vulkan is not loaded"); - return SDL_FALSE; + if(count) { + *count = SDL_arraysize(extensionsForVivante); } - return SDL_Vulkan_GetInstanceExtensions_Helper( - count, names, SDL_arraysize(extensionsForVivante), - extensionsForVivante); + return extensionsForVivante; } SDL_bool VIVANTE_Vulkan_CreateSurface(SDL_VideoDevice *_this, diff --git a/src/video/wayland/SDL_waylandvulkan.c b/src/video/wayland/SDL_waylandvulkan.c index 1f667512a8..3e372bd2a6 100644 --- a/src/video/wayland/SDL_waylandvulkan.c +++ b/src/video/wayland/SDL_waylandvulkan.c @@ -118,20 +118,13 @@ void Wayland_Vulkan_UnloadLibrary(SDL_VideoDevice *_this) } } -SDL_bool Wayland_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, - unsigned *count, - const char **names) +char const* const* Wayland_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, + Uint32 *count) { static const char *const extensionsForWayland[] = { VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME }; - if (!_this->vulkan_config.loader_handle) { - SDL_SetError("Vulkan is not loaded"); - return SDL_FALSE; - } - return SDL_Vulkan_GetInstanceExtensions_Helper( - count, names, SDL_arraysize(extensionsForWayland), - extensionsForWayland); + return extensionsForWayland; } SDL_bool Wayland_Vulkan_CreateSurface(SDL_VideoDevice *_this, diff --git a/src/video/wayland/SDL_waylandvulkan.h b/src/video/wayland/SDL_waylandvulkan.h index 18aa3ed573..ebcd4c1c56 100644 --- a/src/video/wayland/SDL_waylandvulkan.h +++ b/src/video/wayland/SDL_waylandvulkan.h @@ -36,9 +36,8 @@ int Wayland_Vulkan_LoadLibrary(SDL_VideoDevice *_this, const char *path); void Wayland_Vulkan_UnloadLibrary(SDL_VideoDevice *_this); -SDL_bool Wayland_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, - unsigned *count, - const char **names); +char const* const* Wayland_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, + Uint32 *count); SDL_bool Wayland_Vulkan_CreateSurface(SDL_VideoDevice *_this, SDL_Window *window, VkInstance instance, diff --git a/src/video/windows/SDL_windowsvulkan.c b/src/video/windows/SDL_windowsvulkan.c index f0b288b421..79b64ffd8f 100644 --- a/src/video/windows/SDL_windowsvulkan.c +++ b/src/video/windows/SDL_windowsvulkan.c @@ -112,20 +112,14 @@ void WIN_Vulkan_UnloadLibrary(SDL_VideoDevice *_this) } } -SDL_bool WIN_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, - unsigned *count, - const char **names) +char const* const* WIN_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, + Uint32 *count) { static const char *const extensionsForWin32[] = { VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_WIN32_SURFACE_EXTENSION_NAME }; - if (!_this->vulkan_config.loader_handle) { - SDL_SetError("Vulkan is not loaded"); - return SDL_FALSE; - } - return SDL_Vulkan_GetInstanceExtensions_Helper( - count, names, SDL_arraysize(extensionsForWin32), - extensionsForWin32); + if(count) { *count = SDL_arraysize(extensionsForWin32); } + return extensionsForWin32; } SDL_bool WIN_Vulkan_CreateSurface(SDL_VideoDevice *_this, diff --git a/src/video/x11/SDL_x11vulkan.c b/src/video/x11/SDL_x11vulkan.c index b81b980417..7eea5a34bb 100644 --- a/src/video/x11/SDL_x11vulkan.c +++ b/src/video/x11/SDL_x11vulkan.c @@ -142,29 +142,28 @@ void X11_Vulkan_UnloadLibrary(SDL_VideoDevice *_this) } } -SDL_bool X11_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, - unsigned *count, - const char **names) +char const* const* X11_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, + Uint32 *count) { SDL_VideoData *videoData = _this->driverdata; - if (!_this->vulkan_config.loader_handle) { - SDL_SetError("Vulkan is not loaded"); - return SDL_FALSE; - } if (videoData->vulkan_xlib_xcb_library) { static const char *const extensionsForXCB[] = { VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_XCB_SURFACE_EXTENSION_NAME, }; - return SDL_Vulkan_GetInstanceExtensions_Helper( - count, names, SDL_arraysize(extensionsForXCB), extensionsForXCB); + if(count) { + *count = SDL_arraysize(extensionsForXCB); + } + return extensionsForXCB; } else { static const char *const extensionsForXlib[] = { VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_XLIB_SURFACE_EXTENSION_NAME, }; - return SDL_Vulkan_GetInstanceExtensions_Helper( - count, names, SDL_arraysize(extensionsForXlib), extensionsForXlib); + if(count) { + *count = SDL_arraysize(extensionsForXlib); + } + return extensionsForXlib; } } diff --git a/src/video/x11/SDL_x11vulkan.h b/src/video/x11/SDL_x11vulkan.h index 30b047e035..acaf5d65cb 100644 --- a/src/video/x11/SDL_x11vulkan.h +++ b/src/video/x11/SDL_x11vulkan.h @@ -32,9 +32,8 @@ typedef xcb_connection_t *(*PFN_XGetXCBConnection)(Display *dpy); int X11_Vulkan_LoadLibrary(SDL_VideoDevice *_this, const char *path); void X11_Vulkan_UnloadLibrary(SDL_VideoDevice *_this); -SDL_bool X11_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, - unsigned *count, - const char **names); +char const* const* X11_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, + Uint32 *count); SDL_bool X11_Vulkan_CreateSurface(SDL_VideoDevice *_this, SDL_Window *window, VkInstance instance, diff --git a/test/testvulkan.c b/test/testvulkan.c index c20e4bc9e5..e13e3ace84 100644 --- a/test/testvulkan.c +++ b/test/testvulkan.c @@ -222,36 +222,15 @@ static void createInstance(void) { VkApplicationInfo appInfo = { 0 }; VkInstanceCreateInfo instanceCreateInfo = { 0 }; - const char **extensions = NULL; - unsigned extensionCount = 0; VkResult result; appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; appInfo.apiVersion = VK_API_VERSION_1_0; instanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; instanceCreateInfo.pApplicationInfo = &appInfo; - if (!SDL_Vulkan_GetInstanceExtensions(&extensionCount, NULL)) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, - "SDL_Vulkan_GetInstanceExtensions(): %s\n", - SDL_GetError()); - quit(2); - } - extensions = (const char **)SDL_malloc(sizeof(const char *) * extensionCount); - if (extensions == NULL) { - SDL_OutOfMemory(); - quit(2); - } - if (!SDL_Vulkan_GetInstanceExtensions(&extensionCount, extensions)) { - SDL_free((void *)extensions); - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, - "SDL_Vulkan_GetInstanceExtensions(): %s\n", - SDL_GetError()); - quit(2); - } - instanceCreateInfo.enabledExtensionCount = extensionCount; - instanceCreateInfo.ppEnabledExtensionNames = extensions; + + instanceCreateInfo.ppEnabledExtensionNames = SDL_Vulkan_GetInstanceExtensions(&instanceCreateInfo.enabledExtensionCount); result = vkCreateInstance(&instanceCreateInfo, NULL, &vulkanContext->instance); - SDL_free((void *)extensions); if (result != VK_SUCCESS) { vulkanContext->instance = VK_NULL_HANDLE; SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,