diff options
| author | 2025-11-30 14:10:56 -0500 | |
|---|---|---|
| committer | 2025-11-30 14:10:56 -0500 | |
| commit | 22e9e4d6e2c2e8e5eea065e5b7cd04fa6626559c (patch) | |
| tree | b2de15790928a7b7335a08076b37ec890d6d0b11 /src | |
| parent | 9d69eec9ab48f009a04b9ab710f57c85b240dd19 (diff) | |
| download | stela-22e9e4d6e2c2e8e5eea065e5b7cd04fa6626559c.tar.gz stela-22e9e4d6e2c2e8e5eea065e5b7cd04fa6626559c.tar.bz2 stela-22e9e4d6e2c2e8e5eea065e5b7cd04fa6626559c.zip | |
Improve Vulkan loading and Wayland input handling
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src')
| -rw-r--r-- | src/vk_common.c | 23 | ||||
| -rw-r--r-- | src/vk_common.h | 4 | ||||
| -rw-r--r-- | src/window_wayland.c | 24 | ||||
| -rw-r--r-- | src/window_wayland.h | 5 |
4 files changed, 35 insertions, 21 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 <dlfcn.h> +#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; |