vulkan: final cleanup, ensure it works fully on windows.

git-svn-id: http://svn2.nishi.boats/svn/milsko/trunk@121 b9cfdab3-6d41-4d17-bbe4-086880011989
This commit is contained in:
IoIxD 2025-10-01 23:26:56 +00:00
commit f7fbf66396
2 changed files with 50 additions and 22 deletions

View file

@ -387,7 +387,7 @@ void vulkan_setup(MwWidget handle) {
vertBuf = malloc(vertFileSize); vertBuf = malloc(vertFileSize);
memset(vertBuf, 0, vertFileSize); memset(vertBuf, 0, vertFileSize);
amountRead = fread(vertBuf, 1, vertFileSize, vertFile); amountRead = fread(vertBuf, 1, vertFileSize, vertFile);
printf("triangle.vert.spv: read %ld bytes\n", amountRead); printf("triangle.vert.spv: read %zu bytes\n", amountRead);
vertInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; vertInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
vertInfo.pNext = NULL; vertInfo.pNext = NULL;
@ -407,7 +407,7 @@ void vulkan_setup(MwWidget handle) {
fragBuf = malloc(fragFileSize); fragBuf = malloc(fragFileSize);
memset(fragBuf, 0, fragFileSize); memset(fragBuf, 0, fragFileSize);
amountRead = fread(fragBuf, 1, fragFileSize, fragFile); amountRead = fread(fragBuf, 1, fragFileSize, fragFile);
printf("triangle.frag.spv: read %ld bytes\n", amountRead); printf("triangle.frag.spv: read %zu bytes\n", amountRead);
fragInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; fragInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
fragInfo.pNext = NULL; fragInfo.pNext = NULL;

View file

@ -7,6 +7,7 @@
#include <stdlib.h> #include <stdlib.h>
#include "../error_internal.h" #include "../error_internal.h"
#include "Mw/TypeDefs.h"
/** /**
* ioixd maintains this file. nishi doesn't know vulkan at all * ioixd maintains this file. nishi doesn't know vulkan at all
@ -48,8 +49,14 @@ MwVulkanConfig vulkan_config = {
#ifndef _WIN32 #ifndef _WIN32
#define LIB_TYPE void* #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 #else
#define LIB_TYPE HINSTANCE #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 #endif
// convienence macro for handling vulkan errors // convienence macro for handling vulkan errors
@ -143,20 +150,44 @@ static void create(MwWidget handle) {
MwSetDefault(handle); MwSetDefault(handle);
} }
static void destroy(MwWidget handle) { static MwErrorEnum _destroy(MwWidget handle) {
vulkan_t* o = (vulkan_t*)handle->internal; vulkan_t* o = (vulkan_t*)handle->internal;
LOAD_VK_FUNCTION(vkDestroyInstance);
LOAD_VK_FUNCTION(vkDestroySurfaceKHR);
LOAD_VK_FUNCTION(vkDestroyDevice);
free(o->vkLayers);
free(o->vkDeviceExtensions);
free(o->vkInstanceExtensions);
_vkDestroyDevice(o->vkLogicalDevice, NULL);
_vkDestroySurfaceKHR(o->vkInstance, o->vkSurface, NULL);
_vkDestroyInstance(o->vkInstance, NULL);
LIB_CLOSE(o->vulkanLibrary);
free(o); free(o);
return MwEsuccess;
}
static void destroy(MwWidget handle) {
MwErrorEnum err = _destroy(handle);
if(err == MwEerror) {
printf("[Vulkan Widget] %s", MwGetLastError());
}
} }
static LIB_TYPE vulkan_lib_load() { static LIB_TYPE vulkan_lib_load() {
#ifndef _WIN32 #ifdef _WIN32
return dlopen("libvulkan.so", RTLD_LAZY | RTLD_GLOBAL); return LIB_OPEN("vulkan-1.dll", RTLD_LAZY | RTLD_GLOBAL);
#else #else
return LoadLibrary("vulkan-1.dll"); return LIB_OPEN("libvulkan.so", RTLD_LAZY | RTLD_GLOBAL);
#endif #endif
} }
static MwErrorEnum vulkan_instance_setup(MwWidget handle, vulkan_t* o) { static MwErrorEnum vulkan_instance_setup(MwWidget handle, vulkan_t* o) {
(void)(handle);
uint32_t vulkan_version = vulkan_config.vk_version; uint32_t vulkan_version = vulkan_config.vk_version;
uint32_t api_version = vulkan_config.api_version; uint32_t api_version = vulkan_config.api_version;
uint32_t extension_count = 0; uint32_t extension_count = 0;
@ -186,25 +217,14 @@ static MwErrorEnum vulkan_instance_setup(MwWidget handle, vulkan_t* o) {
vulkan_supported = VULKAN_SUPPORTED_YES; vulkan_supported = VULKAN_SUPPORTED_YES;
} }
#ifndef _WIN32 o->vkGetInstanceProcAddr = LIB_SYM(o->vulkanLibrary, "vkGetInstanceProcAddr");
o->vkGetInstanceProcAddr = dlsym(o->vulkanLibrary, "vkGetInstanceProcAddr");
VK_ASSERT(o->vkGetInstanceProcAddr); VK_ASSERT(o->vkGetInstanceProcAddr);
_vkEnumerateInstanceExtensionProperties = dlsym(o->vulkanLibrary, "vkEnumerateInstanceExtensionProperties"); _vkEnumerateInstanceExtensionProperties = LIB_SYM(o->vulkanLibrary, "vkEnumerateInstanceExtensionProperties");
VK_ASSERT(_vkEnumerateInstanceExtensionProperties); VK_ASSERT(_vkEnumerateInstanceExtensionProperties);
_vkEnumerateInstanceLayerProperties = dlsym(o->vulkanLibrary, "vkEnumerateInstanceLayerProperties"); _vkEnumerateInstanceLayerProperties = LIB_SYM(o->vulkanLibrary, "vkEnumerateInstanceLayerProperties");
VK_ASSERT(_vkEnumerateInstanceLayerProperties); VK_ASSERT(_vkEnumerateInstanceLayerProperties);
_vkCreateInstance = dlsym(o->vulkanLibrary, "vkCreateInstance"); _vkCreateInstance = LIB_SYM(o->vulkanLibrary, "vkCreateInstance");
VK_ASSERT(_vkCreateInstance); VK_ASSERT(_vkCreateInstance);
#else
o->vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)(void*)GetProcAddress(o->vulkanLibrary, "vkGetInstanceProcAddr");
VK_ASSERT(o->vkGetInstanceProcAddr);
_vkEnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties)(void*)GetProcAddress(o->vulkanLibrary, "vkEnumerateInstanceExtensionProperties");
VK_ASSERT(_vkEnumerateInstanceExtensionProperties);
_vkEnumerateInstanceLayerProperties = (PFN_vkEnumerateInstanceLayerProperties)(void*)GetProcAddress(o->vulkanLibrary, "vkEnumerateInstanceLayerProperties");
VK_ASSERT(_vkEnumerateInstanceLayerProperties);
_vkCreateInstance = (PFN_vkCreateInstance)(void*)GetProcAddress(o->vulkanLibrary, "vkCreateInstance");
VK_ASSERT(_vkCreateInstance);
#endif
// setup enabled extensions // setup enabled extensions
arrput(enabledExtensions, VK_KHR_SURFACE_EXTENSION_NAME); arrput(enabledExtensions, VK_KHR_SURFACE_EXTENSION_NAME);
@ -308,6 +328,8 @@ static MwErrorEnum vulkan_surface_setup(MwWidget handle, vulkan_t* o) {
} }
static MwErrorEnum vulkan_devices_setup(MwWidget handle, vulkan_t* o) { static MwErrorEnum vulkan_devices_setup(MwWidget handle, vulkan_t* o) {
(void)(handle);
int vk_res; int vk_res;
unsigned long i, n; unsigned long i, n;
uint32_t deviceCount; uint32_t deviceCount;
@ -460,8 +482,14 @@ void* MwVulkanGetField(MwWidget handle, MwVulkanField field, MwErrorEnum* out) {
return o->vkPresentQueue; return o->vkPresentQueue;
default: default:
setLastError("Unknown vulkan field request (%d given)", field); setLastError("Unknown vulkan field request (%d given)", field);
if(out != NULL) {
*out = MwEerror;
}
return NULL; return NULL;
} }
if(out != NULL) {
*out = MwEsuccess;
}
}; };
VkBool32 MwVulkanSupported() { VkBool32 MwVulkanSupported() {
@ -471,7 +499,7 @@ VkBool32 MwVulkanSupported() {
vulkan_supported = VULKAN_SUPPORTED_NO; vulkan_supported = VULKAN_SUPPORTED_NO;
} else { } else {
vulkan_supported = VULKAN_SUPPORTED_YES; vulkan_supported = VULKAN_SUPPORTED_YES;
dlclose(lib); LIB_CLOSE(lib);
} }
} }
if(vulkan_supported == VULKAN_SUPPORTED_YES) { if(vulkan_supported == VULKAN_SUPPORTED_YES) {