summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2025-11-30 14:10:56 -0500
committerAndrew Opalach <andrew@akon.city> 2025-11-30 14:10:56 -0500
commit22e9e4d6e2c2e8e5eea065e5b7cd04fa6626559c (patch)
treeb2de15790928a7b7335a08076b37ec890d6d0b11 /src
parent9d69eec9ab48f009a04b9ab710f57c85b240dd19 (diff)
downloadstela-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.c23
-rw-r--r--src/vk_common.h4
-rw-r--r--src/window_wayland.c24
-rw-r--r--src/window_wayland.h5
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;