To avoid runtime error, Use dlopen.
Change-Id: I1b86d52e0948af6c160874fa6155ad048aeb1ff4
set(SDL_VIDEO_VULKAN 1)
set(HAVE_VIDEO_VULKAN TRUE)
set(SDL_CFLAGS "${SDL_CFLAGS} -I/usr/include")
- list(APPEND SDL_LIBS "-lvulkan")
endif()
endif()
endif()
$as_echo "#define SDL_VIDEO_VULKAN 1" >>confdefs.h
SUMMARY_video="${SUMMARY_video} vulkan"
- EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lvulkan"
fi
fi
}
if test x$video_vulkan = xyes; then
AC_DEFINE(SDL_VIDEO_VULKAN, 1, [ ])
SUMMARY_video="${SUMMARY_video} vulkan"
- EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lvulkan"
fi
fi
}
BuildRequires: binutils-devel
BuildRequires: which
BuildRequires: autoconf
-#BuildRequires: Vulkan-LoaderAndValidationLayers
-#BuildRequires: Vulkan-LoaderAndValidationLayers-devel
+BuildRequires: Vulkan-LoaderAndValidationLayers
+BuildRequires: Vulkan-LoaderAndValidationLayers-devel
BuildRequires: pkgconfig(ecore)
BuildRequires: pkgconfig(ecore-wayland)
/* The function used to dispose of this structure */
void (*free) (_THIS);
- SDL_bool (*vulkan_GetInstanceExtensions) (const char* driver, unsigned int* count, char** names);
+ /* * * */
+ /* Data used by the Vulkan drivers */
+ struct {
+ int driver_loaded;
+ } vk_config;
+
+ SDL_bool (*vulkan_GetInstanceExtensions) (_THIS, const char* driver, unsigned int* count, char** names);
SDL_bool (*vulkan_CreateSurface) (_THIS, SDL_Window* window, SDL_vulkanInstance instance, SDL_vulkanSurface* surface);
+ int (*vulkan_LoadLibrary) (_THIS, const char *path);
+
+#if SDL_VIDEO_VULKAN
+ struct SDL_vulkan_Data *vk_data;
+#endif
+
#if __TIZEN__
void (*GetWindowSize) (_THIS, SDL_Window * window, int *w, int *h);
#endif
_this->current_glwin_tls = SDL_TLSCreate();
_this->current_glctx_tls = SDL_TLSCreate();
+ /* Set vk_config to default values */
+ _this->vk_config.driver_loaded = 0;
+
/* Initialize the video subsystem */
if (_this->VideoInit(_this) < 0) {
SDL_VideoQuit();
SDL_SetError("No Vulkan support in video driver");
return NULL;
}
+
+ if (_this->vulkan_LoadLibrary(_this, NULL) < 0) {
+ return NULL;
+ }
}
if ((flags & SDL_WINDOW_OPENGL) && (flags & SDL_WINDOW_VULKAN)) {
return SDL_FALSE;
}
- return _this->vulkan_GetInstanceExtensions(driver, count, names);
+ return _this->vulkan_GetInstanceExtensions(_this, driver, count, names);
}
SDL_bool
#if SDL_VIDEO_VULKAN
device->vulkan_GetInstanceExtensions = Tizen_vulkan_GetInstanceExtensions;
device->vulkan_CreateSurface = Tizen_vulkan_CreateSurface;
+ device->vulkan_LoadLibrary = Tizen_vulkan_LoadLibrary;
#endif
device->GetWindowSize = Tizen_GetWindowSize;
#include "SDL_tizenvideo.h"
#include "SDL_tizenvulkan.h"
+#define DEFAULT_VULKAN "libvulkan.so"
+
+#define LOAD_FUNC(NAME) \
+_this->vk_data->NAME = SDL_LoadFunction(_this->vk_data->vk_dll_handle, #NAME); \
+if (!_this->vk_data->NAME) \
+{ \
+ return SDL_SetError("Could not retrieve Vulkan function " #NAME); \
+}
+
SDL_bool
-Tizen_vulkan_GetInstanceExtensions(const char* driver, unsigned int* count, char** names)
+Tizen_vulkan_GetInstanceExtensions(_THIS, const char* driver, unsigned int* count, char** names)
{
uint32_t instance_extension_count = 0;
uint32_t enabled_extension_count = 0;
return SDL_FALSE;
}
- err = vkEnumerateInstanceExtensionProperties(NULL, &instance_extension_count, NULL);
+ err = _this->vk_data->vkEnumerateInstanceExtensionProperties(NULL, &instance_extension_count, NULL);
if (err < 0) {
SDL_SetError("Fail to get Instance extension");
return SDL_FALSE;
uint32_t i;
VkExtensionProperties *instance_extensions =
malloc(sizeof(VkExtensionProperties) * instance_extension_count);
- err = vkEnumerateInstanceExtensionProperties(
+ err = _this->vk_data->vkEnumerateInstanceExtensionProperties(
NULL, &instance_extension_count, instance_extensions);
for (i = 0; i < instance_extension_count; i++) {
if (!strcmp(VK_KHR_SURFACE_EXTENSION_NAME,instance_extensions[i].extensionName)) {
createInfo.display = video_data->display;
createInfo.surface = wmdata->surface;
- ret = vkCreateWaylandSurfaceKHR((VkInstance)instance, &createInfo, NULL, (VkSurfaceKHR*)surface);
+ ret = _this->vk_data->vkCreateWaylandSurfaceKHR((VkInstance)instance, &createInfo, NULL, (VkSurfaceKHR*)surface);
if (ret != VK_SUCCESS) {
SDL_SetError("fail to vkCreateWaylandSurfaceKHR : %i", (int)ret);
return SDL_FALSE;
}
}
+
+int
+Tizen_vulkan_LoadLibrary(_THIS, const char *vk_path)
+{
+ void *vk_dll_handle = NULL;
+ char *path = NULL;
+
+ if (_this->vk_config.driver_loaded) {
+ return 0;
+ }
+
+ _this->vk_data = (struct SDL_vulkan_Data *) SDL_calloc(1, sizeof(SDL_vulkan_Data));
+ if (!_this->vk_data) {
+ return SDL_OutOfMemory();
+ }
+
+ if (!vk_path) {
+ vk_dll_handle = SDL_LoadObject(vk_path);
+ }
+
+ if (!vk_dll_handle) {
+ path = SDL_getenv("SDL_VIDEO_VULKAN_DRIVER");
+
+ if (!path) {
+ path = DEFAULT_VULKAN;
+ }
+
+ vk_dll_handle = SDL_LoadObject(path);
+ }
+
+ _this->vk_data->vk_dll_handle = vk_dll_handle;
+
+ if (vk_dll_handle == NULL) {
+ return SDL_SetError("Could not initialize Vulkan library");
+ }
+
+ LOAD_FUNC(vkEnumerateInstanceExtensionProperties);
+ LOAD_FUNC(vkCreateWaylandSurfaceKHR);
+
+ _this->vk_config.driver_loaded = 1;
+
+ return 0;
+}
+
#endif
#include <vulkan/vulkan.h>
#include "../SDL_sysvideo.h"
-extern SDL_bool Tizen_vulkan_GetInstanceExtensions(const char* driver, unsigned int* count, char** names);
+typedef struct SDL_vulkan_Data{
+ void *vk_dll_handle;
+ VkResult (VKAPI_PTR *vkEnumerateInstanceExtensionProperties) (const char* pLayerName, uint32_t* pPropertyCount, VkExtensionProperties* pProperties);
+ VkResult (VKAPI_PTR *vkCreateWaylandSurfaceKHR) (VkInstance instance, const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
+} SDL_vulkan_Data;
+
+extern SDL_bool Tizen_vulkan_GetInstanceExtensions(_THIS, const char* driver, unsigned int* count, char** names);
extern SDL_bool Tizen_vulkan_CreateSurface(_THIS, SDL_Window* window, SDL_vulkanInstance instance, SDL_vulkanSurface* surface);
+extern int Tizen_vulkan_LoadLibrary(_THIS, const char *vk_path);
#endif
#endif /* _SDL_tizenvulkan_h */
#if SDL_VIDEO_VULKAN
device->vulkan_GetInstanceExtensions = Wayland_vulkan_GetInstanceExtensions;
device->vulkan_CreateSurface = Wayland_vulkan_CreateSurface;
+ device->vulkan_LoadLibrary = Wayland_vulkan_LoadLibrary;
#endif
return device;
}
#include "SDL_waylandvideo.h"
#include "SDL_waylandvulkan.h"
+#define DEFAULT_VULKAN "libvulkan.so"
+
+#define LOAD_FUNC(NAME) \
+_this->vk_data->NAME = SDL_LoadFunction(_this->vk_data->vk_dll_handle, #NAME); \
+if (!_this->vk_data->NAME) \
+{ \
+ return SDL_SetError("Could not retrieve Vulkan function " #NAME); \
+}
+
SDL_bool
-Wayland_vulkan_GetInstanceExtensions(const char* driver, unsigned int* count, char** names)
+Wayland_vulkan_GetInstanceExtensions(_THIS, const char* driver, unsigned int* count, char** names)
{
uint32_t instance_extension_count = 0;
uint32_t enabled_extension_count = 0;
return SDL_FALSE;
}
- err = vkEnumerateInstanceExtensionProperties(NULL, &instance_extension_count, NULL);
+ err = _this->vk_data->vkEnumerateInstanceExtensionProperties(NULL, &instance_extension_count, NULL);
if (err < 0) {
SDL_SetError("Fail to get Instance extension");
return SDL_FALSE;
uint32_t i;
VkExtensionProperties *instance_extensions =
malloc(sizeof(VkExtensionProperties) * instance_extension_count);
- err = vkEnumerateInstanceExtensionProperties(
+ err = _this->vk_data->vkEnumerateInstanceExtensionProperties(
NULL, &instance_extension_count, instance_extensions);
for (i = 0; i < instance_extension_count; i++) {
if (!strcmp(VK_KHR_SURFACE_EXTENSION_NAME,instance_extensions[i].extensionName)) {
createInfo.display = video_data->display;
createInfo.surface = wmdata->surface;
- ret = vkCreateWaylandSurfaceKHR((VkInstance)instance, &createInfo, NULL, (VkSurfaceKHR*)surface);
+ ret = _this->vk_data->vkCreateWaylandSurfaceKHR((VkInstance)instance, &createInfo, NULL, (VkSurfaceKHR*)surface);
if (ret != VK_SUCCESS) {
SDL_SetError("fail to vkCreateWaylandSurfaceKHR : %i", (int)ret);
return SDL_FALSE;
}
}
+int
+Wayland_vulkan_LoadLibrary(_THIS, const char *vk_path)
+{
+ void *vk_dll_handle = NULL;
+ char *path = NULL;
+
+ if (_this->vk_config.driver_loaded) {
+ return 0;
+ }
+
+ _this->vk_data = (struct SDL_vulkan_Data *) SDL_calloc(1, sizeof(SDL_vulkan_Data));
+ if (!_this->vk_data) {
+ return SDL_OutOfMemory();
+ }
+
+ if (!vk_path) {
+ vk_dll_handle = SDL_LoadObject(vk_path);
+ }
+
+ if (!vk_dll_handle) {
+ path = SDL_getenv("SDL_VIDEO_VULKAN_DRIVER");
+
+ if (!path) {
+ path = DEFAULT_VULKAN;
+ }
+
+ vk_dll_handle = SDL_LoadObject(path);
+ }
+
+ _this->vk_data->vk_dll_handle = vk_dll_handle;
+
+ if (vk_dll_handle == NULL) {
+ return SDL_SetError("Could not initialize Vulkan library");
+ }
+
+ LOAD_FUNC(vkEnumerateInstanceExtensionProperties);
+ LOAD_FUNC(vkCreateWaylandSurfaceKHR);
+
+ _this->vk_config.driver_loaded = 1;
+
+ return 0;
+}
+
#endif
#include <vulkan/vulkan.h>
#include "../SDL_sysvideo.h"
-extern SDL_bool Wayland_vulkan_GetInstanceExtensions(const char* driver, unsigned int* count, char** names);
+typedef struct SDL_vulkan_Data{
+ void *vk_dll_handle;
+ VkResult (VKAPI_PTR *vkEnumerateInstanceExtensionProperties) (const char* pLayerName, uint32_t* pPropertyCount, VkExtensionProperties* pProperties);
+ VkResult (VKAPI_PTR *vkCreateWaylandSurfaceKHR) (VkInstance instance, const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
+} SDL_vulkan_Data;
+
+extern SDL_bool Wayland_vulkan_GetInstanceExtensions(_THIS, const char* driver, unsigned int* count, char** names);
extern SDL_bool Wayland_vulkan_CreateSurface(_THIS, SDL_Window* window, SDL_vulkanInstance instance, SDL_vulkanSurface* surface);
+extern int Wayland_vulkan_LoadLibrary(_THIS, const char *vk_path);
#endif
#endif /* _SDL_waylandvulkan_h */
#if SDL_VIDEO_VULKAN
device->vulkan_GetInstanceExtensions = X11_vulkan_GetInstanceExtensions;
device->vulkan_CreateSurface = X11_vulkan_CreateSurface;
+ device->vulkan_LoadLibrary = X11_vulkan_LoadLibrary;
#endif
return device;
#include "SDL_x11video.h"
#include "SDL_x11vulkan.h"
+#define DEFAULT_VULKAN "libvulkan.so"
+
+#define LOAD_FUNC(NAME) \
+_this->vk_data->NAME = SDL_LoadFunction(_this->vk_data->vk_dll_handle, #NAME); \
+if (!_this->vk_data->NAME) \
+{ \
+ return SDL_SetError("Could not retrieve Vulkan function " #NAME); \
+}
+
SDL_bool
-X11_vulkan_GetInstanceExtensions(const char* driver, unsigned int* count, char** names)
+X11_vulkan_GetInstanceExtensions(_THIS, const char* driver, unsigned int* count, char** names)
{
uint32_t instance_extension_count = 0;
uint32_t enabled_extension_count = 0;
return SDL_FALSE;
}
- err = vkEnumerateInstanceExtensionProperties(NULL, &instance_extension_count, NULL);
+ err = _this->vkEnumerateInstanceExtensionProperties(NULL, &instance_extension_count, NULL);
if (err < 0) {
SDL_SetError("Fail to get Instance extension");
return SDL_FALSE;
uint32_t i;
VkExtensionProperties *instance_extensions =
malloc(sizeof(VkExtensionProperties) * instance_extension_count);
- err = vkEnumerateInstanceExtensionProperties(
+ err = _this->vkEnumerateInstanceExtensionProperties(
NULL, &instance_extension_count, instance_extensions);
for (i = 0; i < instance_extension_count; i++) {
if (!strcmp(VK_KHR_SURFACE_EXTENSION_NAME,instance_extensions[i].extensionName)) {
createInfo.connection = XGetXCBConnection(wminfo.info.x11.display);
createInfo.window = wminfo.info.x11.window;
- ret = vkCreateXcbSurfaceKHR((VkInstance)instance, &createInfo, NULL, (VkSurfaceKHR*)surface);
+ ret = _this->vkCreateXcbSurfaceKHR((VkInstance)instance, &createInfo, NULL, (VkSurfaceKHR*)surface);
if (ret != VK_SUCCESS) {
SDL_SetError("fail to vkCreateXcbSurfaceKHR : %i", (int)ret);
return SDL_FALSE;
}
}
+int
+X11_vulkan_LoadLibrary(_THIS, const char *vk_path)
+{
+ void *vk_dll_handle = NULL;
+ char *path = NULL;
+
+ if (_this->vk_config.driver_loaded) {
+ return 0;
+ }
+
+ _this->vk_data = (struct SDL_vulkan_Data *) SDL_calloc(1, sizeof(SDL_vulkan_Data));
+ if (!_this->vk_data) {
+ return SDL_OutOfMemory();
+ }
+
+ if (!vk_path) {
+ vk_dll_handle = SDL_LoadObject(vk_path);
+ }
+
+ if (!vk_dll_handle) {
+ path = SDL_getenv("SDL_VIDEO_VULKAN_DRIVER");
+
+ if (!path) {
+ path = DEFAULT_VULKAN;
+ }
+
+ vk_dll_handle = SDL_LoadObject(path);
+ }
+
+ _this->vk_data->vk_dll_handle = vk_dll_handle;
+
+ if (vk_dll_handle == NULL) {
+ return SDL_SetError("Could not initialize Vulkan library");
+ }
+
+ LOAD_FUNC(vkEnumerateInstanceExtensionProperties);
+ LOAD_FUNC(vkCreateWaylandSurfaceKHR);
+
+ _this->vk_config.driver_loaded = 1;
+
+ return 0;
+}
+
#endif
#define _SDL_x11vulkan_h
#if SDL_VIDEO_VULKAN
-extern SDL_bool X11_vulkan_GetInstanceExtensions(const char* driver, unsigned int* count, char** names);
+typedef struct SDL_vulkan_Data{
+ void *vk_dll_handle;
+ VkResult (VKAPI_PTR *vkEnumerateInstanceExtensionProperties) (const char* pLayerName, uint32_t* pPropertyCount, VkExtensionProperties* pProperties);
+ VkResult (VKAPI_PTR *vkCreateWaylandSurfaceKHR) (VkInstance instance, const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
+} SDL_vulkan_Data;
+
+extern SDL_bool X11_vulkan_GetInstanceExtensions(_THIS, const char* driver, unsigned int* count, char** names);
extern SDL_bool X11_vulkan_CreateSurface(_THIS, SDL_Window* window,SDL_vulkanInstance instance, SDL_vulkanSurface* surface);
+extern int X11_vulkan_LoadLibrary(_THIS, const char *vk_path);
#endif
#endif /* _SDL_x11vulkan_h */