From 22e9e4d6e2c2e8e5eea065e5b7cd04fa6626559c Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Sun, 30 Nov 2025 14:10:56 -0500 Subject: Improve Vulkan loading and Wayland input handling Signed-off-by: Andrew Opalach --- src/vk_common.c | 23 +++++++++++++++-------- src/vk_common.h | 4 ++++ src/window_wayland.c | 24 +++++++++++++----------- src/window_wayland.h | 5 +++-- subprojects/glfw3.wrap | 4 ++-- subprojects/libalabaster.wrap | 4 ++-- subprojects/libnaunet.wrap | 4 ++-- tests/window.c | 2 +- 8 files changed, 42 insertions(+), 28 deletions(-) diff --git a/src/vk_common.c b/src/vk_common.c index 3b40f2b..5f5555c 100644 --- a/src/vk_common.c +++ b/src/vk_common.c @@ -3,9 +3,14 @@ #include "vk_common.h" +#if defined VK_FORCE_DYNAMIC_LOAD && !defined NAUNET_ON_WINDOWS +#include +#endif + static VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL get_vk_proc_address(VkInstance inst, const char *name) { PFN_vkGetInstanceProcAddr vk_get_proc_addr; +#ifdef VK_FORCE_DYNAMIC_LOAD #ifdef NAUNET_ON_WINDOWS const char *VKLib = "vulkan-1.dll"; HMODULE VKModule = LoadLibraryA(VKLib); @@ -15,16 +20,16 @@ static VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL get_vk_proc_address(VkInstance i } vk_get_proc_addr = (void *)GetProcAddress(VKModule, "vkGetInstanceProcAddr"); #else - /* const char *vk_lib = "libvulkan.so.1"; - void *vk_module = dlopen(vk_lib, RTLD_LAZY | RTLD_LOCAL); + void *vk_module = dlopen(vk_lib, RTLD_LAZY | RTLD_GLOBAL | RTLD_NODELETE); if (!vk_module) { log_error("Failed to load %s.", vk_lib); return NULL; } vk_get_proc_addr = (PFN_vkGetInstanceProcAddr)dlsym(vk_module, "vkGetInstanceProcAddr"); dlclose(vk_module); - */ +#endif +#else vk_get_proc_addr = vkGetInstanceProcAddr; #endif if (!vk_get_proc_addr) return NULL; @@ -42,13 +47,15 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL stl_get_vk_proc_address(VkInstance inst VkResult stl_vk_destroy_surface(VkInstance inst, VkSurfaceKHR surface) { -#ifdef NAUNET_ON_WINDOWS - PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; - vkDestroySurfaceKHR = (PFN_vkDestroySurfaceKHR)get_vk_proc_address(inst, "vkDestroySurfaceKHR"); - if (!vkDestroySurfaceKHR) { + PFN_vkDestroySurfaceKHR pVkDestroySurfaceKHR; +#ifdef VK_FORCE_DYNAMIC_LOAD + pVkDestroySurfaceKHR = (PFN_vkDestroySurfaceKHR)get_vk_proc_address(inst, "vkDestroySurfaceKHR"); + if (!pVkDestroySurfaceKHR) { return VK_ERROR_EXTENSION_NOT_PRESENT; } +#else + pVkDestroySurfaceKHR = vkDestroySurfaceKHR; #endif - vkDestroySurfaceKHR(inst, surface, NULL); + pVkDestroySurfaceKHR(inst, surface, NULL); return VK_SUCCESS; } diff --git a/src/vk_common.h b/src/vk_common.h index 4fcfe14..2fe17e9 100644 --- a/src/vk_common.h +++ b/src/vk_common.h @@ -1,5 +1,9 @@ #include "window.h" +#ifdef NAUNET_ON_WINDOWS +#define VK_FORCE_DYNAMIC_LOAD +#endif + VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL stl_get_vk_proc_address(VkInstance inst, const char *name); VkResult stl_vk_create_surface(void *window, VkInstance inst, VkSurfaceKHR *surface); VkResult stl_vk_destroy_surface(VkInstance inst, VkSurfaceKHR surface); diff --git a/src/window_wayland.c b/src/window_wayland.c index 68a0444..1d3be16 100644 --- a/src/window_wayland.c +++ b/src/window_wayland.c @@ -10,7 +10,7 @@ #include "poll_common.h" #include "keys.h" -#define FRAME_NO_VALUE -DBL_MAX +#define FRAME_NO_VALUE ((f64)0xffffffffffffffff) f64 stl_scale_scroll(f64 v, f64 factor) { @@ -564,10 +564,10 @@ static void keyboard_enter(void *data, struct wl_keyboard *keyboard, (void)keyboard; (void)serial; (void)surface; - void *item; + u32 *item; wl_array_for_each(item, keys) { - u32 key = *(u32 *)item; - al_assert(key < STELA_WAYLAND_KEY_MAX); + u32 key = *item; + al_assert(key <= STELA_WAYLAND_KEY_MAX); u16 mapped_key = global.keycodes[key]; if (stl_key_to_mod(mapped_key) == STELA_MOD_NONE) continue; stl_window_send_key_event(&wl->w, STELA_BUTTON_PRESSED, mapped_key); @@ -591,7 +591,7 @@ static void keyboard_key(void *data, struct wl_keyboard *keyboard, (void)keyboard; (void)serial; (void)time; - al_assert(key < STELA_WAYLAND_KEY_MAX); + al_assert(key <= STELA_WAYLAND_KEY_MAX); u16 mapped_key = global.keycodes[key]; u8 mapped_state = (state == WL_KEYBOARD_KEY_STATE_PRESSED) ? STELA_BUTTON_PRESSED : STELA_BUTTON_RELEASED; stl_window_send_key_immediate_event(&wl->w, mapped_state, mapped_key); @@ -1198,15 +1198,17 @@ static VkResult window_wayland_vk_create_surface(void *window, VkInstance inst, .surface = wl->surface }; - /* - PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR; - vkCreateWaylandSurfaceKHR = (PFN_vkCreateWaylandSurfaceKHR)stl_get_vk_proc_address(inst, "vkCreateWaylandSurfaceKHR"); - if (!vkCreateWaylandSurfaceKHR) { + PFN_vkCreateWaylandSurfaceKHR pVkCreateWaylandSurfaceKHR; +#ifdef VK_FORCE_DYNAMIC_LOAD + pVkCreateWaylandSurfaceKHR = (PFN_vkCreateWaylandSurfaceKHR)stl_get_vk_proc_address(inst, "vkCreateWaylandSurfaceKHR"); + if (!pVkCreateWaylandSurfaceKHR) { return VK_ERROR_EXTENSION_NOT_PRESENT; } - */ +#else + pVkCreateWaylandSurfaceKHR = vkCreateWaylandSurfaceKHR; +#endif - VkResult ret = vkCreateWaylandSurfaceKHR(inst, &info, NULL, surface); + VkResult ret = pVkCreateWaylandSurfaceKHR(inst, &info, NULL, surface); if (ret != VK_SUCCESS) { log_error("Failed to create Wayland Vulkan surface."); } diff --git a/src/window_wayland.h b/src/window_wayland.h index 09c3821..3df2794 100644 --- a/src/window_wayland.h +++ b/src/window_wayland.h @@ -22,13 +22,14 @@ #include "egl_common.h" #endif -#define STELA_WAYLAND_KEY_MAX (KEY_MEDIA + 1) +#define STELA_WAYLAND_KEY_MAX KEY_MAX +#define STELA_WAYLAND_KEY_COUNT KEY_CNT struct stl_wayland_global { struct wl_display *display; s32 display_fd; struct wl_registry *registry; - u16 keycodes[STELA_WAYLAND_KEY_MAX]; + u16 keycodes[STELA_WAYLAND_KEY_COUNT]; array(struct stl_monitor *) monitors; #if defined STELA_API_VULKAN const char **vk_extensions; diff --git a/subprojects/glfw3.wrap b/subprojects/glfw3.wrap index 2e3e365..692b7a0 100644 --- a/subprojects/glfw3.wrap +++ b/subprojects/glfw3.wrap @@ -1,6 +1,6 @@ [wrap-git] -directory = glfw3-8e15281 +directory = glfw3-162896e url = https://github.com/glfw/glfw.git -revision = 8e15281d34a8b9ee9271ccce38177a3d812456f8 +revision = 162896e5b9a40dc382c5c438cd12c90a5ff86ddd depth = 1 method = cmake diff --git a/subprojects/libalabaster.wrap b/subprojects/libalabaster.wrap index e93a582..3f7a977 100644 --- a/subprojects/libalabaster.wrap +++ b/subprojects/libalabaster.wrap @@ -1,5 +1,5 @@ [wrap-git] -directory = libalabaster-ed6fc17 +directory = libalabaster-dd7a1d1 url = https://git.akon.city/libalabaster.git -revision = ed6fc176a1ef6afd43eaa198c43eb813c3a81d99 +revision = dd7a1d1afb8b3e93ab1005abdc21edb6efca840a depth = 1 diff --git a/subprojects/libnaunet.wrap b/subprojects/libnaunet.wrap index 53670a7..547bd75 100644 --- a/subprojects/libnaunet.wrap +++ b/subprojects/libnaunet.wrap @@ -1,5 +1,5 @@ [wrap-git] -directory = libnaunet-4aea807 +directory = libnaunet-1e0f603 url = https://git.akon.city/libnaunet.git -revision = 4aea807a167a894fd264718efc8c9fa8bced7dcb +revision = 1e0f60341192c79bf49e84e6b187ffb7bfded252 depth = 1 diff --git a/tests/window.c b/tests/window.c index e1c5de1..31447d8 100644 --- a/tests/window.c +++ b/tests/window.c @@ -4,9 +4,9 @@ #include #include #include +#include #include #include -#include #define DEFAULT_WIDTH 720 #define DEFAULT_HEIGHT 480 -- cgit v1.2.3-101-g0448