mirror of
https://gitea.nishi.boats/pyrite-dev/milsko
synced 2026-02-01 05:53:07 +00:00
check backend for vulkan too
git-svn-id: http://svn2.nishi.boats/svn/milsko/trunk@689 b9cfdab3-6d41-4d17-bbe4-086880011989
This commit is contained in:
@@ -8,27 +8,27 @@
|
|||||||
* ioixd maintains this file. nishi doesn't know vulkan at all
|
* ioixd maintains this file. nishi doesn't know vulkan at all
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef USE_GDI
|
||||||
#define VK_USE_PLATFORM_WIN32_KHR 1
|
#define VK_USE_PLATFORM_WIN32_KHR 1
|
||||||
#endif
|
#endif
|
||||||
#ifdef __unix__
|
#ifdef USE_X11
|
||||||
#define VK_USE_PLATFORM_XLIB_KHR 1
|
#define VK_USE_PLATFORM_XLIB_KHR 1
|
||||||
#endif
|
#endif
|
||||||
#include <vulkan/vulkan.h>
|
#include <vulkan/vulkan.h>
|
||||||
#include <vulkan/vulkan_core.h>
|
#include <vulkan/vulkan_core.h>
|
||||||
|
|
||||||
#ifdef __unix__
|
#ifdef USE_GDI
|
||||||
#include <vulkan/vulkan_xlib.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#include <vulkan/vulkan_win32.h>
|
#include <vulkan/vulkan_win32.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef USE_X11
|
||||||
|
#include <vulkan/vulkan_xlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAS_VK_ENUM_STRING_HELPER
|
#ifdef HAS_VK_ENUM_STRING_HELPER
|
||||||
#include <vulkan/vk_enum_string_helper.h>
|
#include <vulkan/vk_enum_string_helper.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include "../../external/stb_ds.h"
|
#include "../../external/stb_ds.h"
|
||||||
@@ -39,18 +39,6 @@ MwVulkanConfig vulkan_config = {
|
|||||||
.validation_layers = VK_FALSE,
|
.validation_layers = VK_FALSE,
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef _WIN32
|
|
||||||
#define LIB_TYPE void*
|
|
||||||
#define LIB_OPEN(a, b) dlopen(a, b)
|
|
||||||
#define LIB_SYM(a, b) dlsym(a, b)
|
|
||||||
#define LIB_CLOSE(a) dlclose(a)
|
|
||||||
#else
|
|
||||||
#define LIB_TYPE HINSTANCE
|
|
||||||
#define LIB_OPEN(a, b) LoadLibrary(a)
|
|
||||||
#define LIB_SYM(a, b) (void*)GetProcAddress(a, b)
|
|
||||||
#define LIB_CLOSE(a) FreeLibrary(a)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* convienence macro for handling vulkan errors */
|
/* convienence macro for handling vulkan errors */
|
||||||
#ifdef HAS_VK_ENUM_STRING_HELPER
|
#ifdef HAS_VK_ENUM_STRING_HELPER
|
||||||
#define VK_CMD(func) \
|
#define VK_CMD(func) \
|
||||||
@@ -92,7 +80,7 @@ typedef enum vulkan_supported_state_t {
|
|||||||
vulkan_supported_state vulkan_supported = VULKAN_SUPPORTED_UNKNOWN;
|
vulkan_supported_state vulkan_supported = VULKAN_SUPPORTED_UNKNOWN;
|
||||||
|
|
||||||
typedef struct vulkan {
|
typedef struct vulkan {
|
||||||
LIB_TYPE vulkanLibrary;
|
void* vulkanLibrary;
|
||||||
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
|
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
|
||||||
VkInstance vkInstance;
|
VkInstance vkInstance;
|
||||||
VkSurfaceKHR vkSurface;
|
VkSurfaceKHR vkSurface;
|
||||||
@@ -157,7 +145,7 @@ static MwErrorEnum _destroy(MwWidget handle) {
|
|||||||
_vkDestroyDevice(o->vkLogicalDevice, NULL);
|
_vkDestroyDevice(o->vkLogicalDevice, NULL);
|
||||||
_vkDestroySurfaceKHR(o->vkInstance, o->vkSurface, NULL);
|
_vkDestroySurfaceKHR(o->vkInstance, o->vkSurface, NULL);
|
||||||
_vkDestroyInstance(o->vkInstance, NULL);
|
_vkDestroyInstance(o->vkInstance, NULL);
|
||||||
LIB_CLOSE(o->vulkanLibrary);
|
MwDynamicClose(o->vulkanLibrary);
|
||||||
|
|
||||||
free(o);
|
free(o);
|
||||||
|
|
||||||
@@ -171,11 +159,11 @@ static void destroy(MwWidget handle) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static LIB_TYPE vulkan_lib_load() {
|
static void* vulkan_lib_load() {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
return LIB_OPEN("vulkan-1.dll", RTLD_LAZY | RTLD_GLOBAL);
|
return MwDynamicOpen("vulkan-1.dll");
|
||||||
#else
|
#else
|
||||||
return LIB_OPEN("libvulkan.so", RTLD_LAZY | RTLD_GLOBAL);
|
return MwDynamicOpen("libvulkan.so");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -211,20 +199,20 @@ static MwErrorEnum vulkan_instance_setup(MwWidget handle, vulkan_t* o) {
|
|||||||
vulkan_supported = VULKAN_SUPPORTED_YES;
|
vulkan_supported = VULKAN_SUPPORTED_YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
o->vkGetInstanceProcAddr = LIB_SYM(o->vulkanLibrary, "vkGetInstanceProcAddr");
|
o->vkGetInstanceProcAddr = MwDynamicSymbol(o->vulkanLibrary, "vkGetInstanceProcAddr");
|
||||||
VK_ASSERT(o->vkGetInstanceProcAddr);
|
VK_ASSERT(o->vkGetInstanceProcAddr);
|
||||||
_vkEnumerateInstanceExtensionProperties = LIB_SYM(o->vulkanLibrary, "vkEnumerateInstanceExtensionProperties");
|
_vkEnumerateInstanceExtensionProperties = MwDynamicSymbol(o->vulkanLibrary, "vkEnumerateInstanceExtensionProperties");
|
||||||
VK_ASSERT(_vkEnumerateInstanceExtensionProperties);
|
VK_ASSERT(_vkEnumerateInstanceExtensionProperties);
|
||||||
_vkEnumerateInstanceLayerProperties = LIB_SYM(o->vulkanLibrary, "vkEnumerateInstanceLayerProperties");
|
_vkEnumerateInstanceLayerProperties = MwDynamicSymbol(o->vulkanLibrary, "vkEnumerateInstanceLayerProperties");
|
||||||
VK_ASSERT(_vkEnumerateInstanceLayerProperties);
|
VK_ASSERT(_vkEnumerateInstanceLayerProperties);
|
||||||
_vkCreateInstance = LIB_SYM(o->vulkanLibrary, "vkCreateInstance");
|
_vkCreateInstance = MwDynamicSymbol(o->vulkanLibrary, "vkCreateInstance");
|
||||||
VK_ASSERT(_vkCreateInstance);
|
VK_ASSERT(_vkCreateInstance);
|
||||||
|
|
||||||
/* setup enabled extensions */
|
/* setup enabled extensions */
|
||||||
arrput(enabledExtensions, VK_KHR_SURFACE_EXTENSION_NAME);
|
arrput(enabledExtensions, VK_KHR_SURFACE_EXTENSION_NAME);
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
arrput(enabledExtensions, VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
|
arrput(enabledExtensions, VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
|
||||||
#elif defined(__linux__) || defined(__FreeBSD__)
|
#elif defined(__linux__) || defined(__FreeBSD__) || defined(__NetBSD__)
|
||||||
arrput(enabledExtensions, VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
|
arrput(enabledExtensions, VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -292,31 +280,35 @@ static MwErrorEnum vulkan_instance_setup(MwWidget handle, vulkan_t* o) {
|
|||||||
|
|
||||||
static MwErrorEnum vulkan_surface_setup(MwWidget handle, vulkan_t* o) {
|
static MwErrorEnum vulkan_surface_setup(MwWidget handle, vulkan_t* o) {
|
||||||
int vk_res;
|
int vk_res;
|
||||||
#ifdef _WIN32
|
#ifdef USE_GDI
|
||||||
LOAD_VK_FUNCTION(vkCreateWin32SurfaceKHR);
|
if(handle->lowlevel->common.type == MwLLBackendGDI) {
|
||||||
|
LOAD_VK_FUNCTION(vkCreateWin32SurfaceKHR);
|
||||||
|
|
||||||
VkWin32SurfaceCreateInfoKHR createInfo = {
|
VkWin32SurfaceCreateInfoKHR createInfo = {
|
||||||
.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR,
|
.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR,
|
||||||
.pNext = NULL,
|
.pNext = NULL,
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.hinstance = handle->lowlevel->gdi.hInstance,
|
.hinstance = handle->lowlevel->gdi.hInstance,
|
||||||
.hwnd = handle->lowlevel->gdi.hWnd,
|
.hwnd = handle->lowlevel->gdi.hWnd,
|
||||||
};
|
};
|
||||||
|
|
||||||
VK_CMD(_vkCreateWin32SurfaceKHR(o->vkInstance, &createInfo, NULL,
|
VK_CMD(_vkCreateWin32SurfaceKHR(o->vkInstance, &createInfo, NULL,
|
||||||
&o->vkSurface));
|
&o->vkSurface));
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef __unix__
|
#ifdef USE_X11
|
||||||
LOAD_VK_FUNCTION(vkCreateXlibSurfaceKHR);
|
if(handle->lowlevel->common.type == MwLLBackendX11) {
|
||||||
|
LOAD_VK_FUNCTION(vkCreateXlibSurfaceKHR);
|
||||||
|
|
||||||
VkXlibSurfaceCreateInfoKHR createInfo = {
|
VkXlibSurfaceCreateInfoKHR createInfo = {
|
||||||
.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR,
|
.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR,
|
||||||
.pNext = NULL,
|
.pNext = NULL,
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.dpy = handle->lowlevel->x11.display,
|
.dpy = handle->lowlevel->x11.display,
|
||||||
.window = handle->lowlevel->x11.window,
|
.window = handle->lowlevel->x11.window,
|
||||||
};
|
};
|
||||||
VK_CMD(_vkCreateXlibSurfaceKHR(o->vkInstance, &createInfo, NULL, &o->vkSurface));
|
VK_CMD(_vkCreateXlibSurfaceKHR(o->vkInstance, &createInfo, NULL, &o->vkSurface));
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
return MwEsuccess;
|
return MwEsuccess;
|
||||||
}
|
}
|
||||||
@@ -455,12 +447,12 @@ void MwVulkanEnableLayer(const char* name) {
|
|||||||
|
|
||||||
VkBool32 MwVulkanSupported(void) {
|
VkBool32 MwVulkanSupported(void) {
|
||||||
if(vulkan_supported == VULKAN_SUPPORTED_UNKNOWN) {
|
if(vulkan_supported == VULKAN_SUPPORTED_UNKNOWN) {
|
||||||
LIB_TYPE lib = vulkan_lib_load();
|
void* lib = vulkan_lib_load();
|
||||||
if(lib == NULL) {
|
if(lib == NULL) {
|
||||||
vulkan_supported = VULKAN_SUPPORTED_NO;
|
vulkan_supported = VULKAN_SUPPORTED_NO;
|
||||||
} else {
|
} else {
|
||||||
vulkan_supported = VULKAN_SUPPORTED_YES;
|
vulkan_supported = VULKAN_SUPPORTED_YES;
|
||||||
LIB_CLOSE(lib);
|
MwDynamicClose(lib);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(vulkan_supported == VULKAN_SUPPORTED_YES) {
|
if(vulkan_supported == VULKAN_SUPPORTED_YES) {
|
||||||
|
|||||||
Reference in New Issue
Block a user