diff options
| author | 2025-03-15 20:04:54 -0400 | |
|---|---|---|
| committer | 2025-03-15 20:04:54 -0400 | |
| commit | d7f90f660e2a944cd60f3c72906e2c7cd0ab4203 (patch) | |
| tree | f56b1ad378cfdf00da29095ce0108dd51f7ce08f /src | |
| parent | 95e41dbad47f6c5d3868143b46938ec25582b6f1 (diff) | |
| download | stela-d7f90f660e2a944cd60f3c72906e2c7cd0ab4203.tar.gz stela-d7f90f660e2a944cd60f3c72906e2c7cd0ab4203.tar.bz2 stela-d7f90f660e2a944cd60f3c72906e2c7cd0ab4203.zip | |
Attempt more GLFM setup, cleanup win32
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src')
| -rw-r--r-- | src/window.c | 7 | ||||
| -rw-r--r-- | src/window.h | 3 | ||||
| -rw-r--r-- | src/window_glfm.c | 56 | ||||
| -rw-r--r-- | src/window_glfm.h | 5 | ||||
| -rw-r--r-- | src/window_win32.c | 39 |
5 files changed, 66 insertions, 44 deletions
diff --git a/src/window.c b/src/window.c index 1da52df..db0eb45 100644 --- a/src/window.c +++ b/src/window.c @@ -117,6 +117,13 @@ void stl_window_send_resize_event(struct stl_window *window, u32 width, u32 heig #endif } +void stl_window_send_render_event(struct stl_window *window) +{ + if (window->render_callback) { + window->render_callback(window->userdata); + } +} + #ifdef STELA_POLL_INLINE void stl_window_send_refresh_event(struct stl_window *window) { diff --git a/src/window.h b/src/window.h index fadcebd..57f906f 100644 --- a/src/window.h +++ b/src/window.h @@ -101,6 +101,8 @@ struct stl_window { #endif // Callbacks. void (*output_discovered_callback)(void *, struct stl_monitor *); + void (*render_callback)(void *); + void (*refresh_callback)(void *); bool (*pointer_pos_callback)(void *, f64, f64); bool (*scroll_callback)(void *, f64); bool (*mouse_button_callback)(void *, u8, u8); @@ -108,7 +110,6 @@ struct stl_window { // Always runs on the thread that's processing events. void (*key_immediate_callback)(void *, u8, u16); void (*resize_callback)(void *, u32, u32); - void (*refresh_callback)(void *); void (*should_close_callback)(void *); void *userdata; }; diff --git a/src/window_glfm.c b/src/window_glfm.c index 7668eca..d61eef3 100644 --- a/src/window_glfm.c +++ b/src/window_glfm.c @@ -1,7 +1,10 @@ #include <al/log.h> +#include <nnwt/common.h> #include "window_glfm.h" +static struct stl_glfm_global global; + void stl_set_output_discovered_callback(void (*output_discovered)(void *, struct stl_monitor *), void *userdata) { (void)output_discovered; @@ -30,6 +33,49 @@ void stl_global_close(void) { } +static bool one_main = false; + +static void onSurfaceCreated(GLFMDisplay *display, s32 width, s32 height) +{ + GLFMRenderingAPI api = glfmGetRenderingAPI(display); + if (!one_main) { + window_system_main(0, NULL); + one_main = true; + } + al_log_info("window_glfm", "Created GLES context of version %s.", + api == GLFMRenderingAPIOpenGLES32 ? "3.2" : + api == GLFMRenderingAPIOpenGLES31 ? "3.1" : + api == GLFMRenderingAPIOpenGLES3 ? "3.0" : "2.0"); +} + +static void onSurfaceDestroyed(GLFMDisplay *display) +{ + (void)display; +} + +static void onDraw(GLFMDisplay *display) +{ + struct stl_window_glfm *glfm = (struct stl_window_glfm *)glfmGetUserData(display); + if (glfm->w.render_callback) { + glfm->w.render_callback(glfm->w.userdata); + } +} + +void glfmMain(GLFMDisplay *display) +{ + nn_common_init(); + global.display = display; + glfmSetDisplayConfig(display, + GLFMRenderingAPIOpenGLES2, + GLFMColorFormatRGBA8888, + GLFMDepthFormatNone, + GLFMStencilFormatNone, + GLFMMultisampleNone); + glfmSetSurfaceCreatedFunc(display, onSurfaceCreated); + glfmSetSurfaceDestroyedFunc(display, onSurfaceDestroyed); + glfmSetRenderFunc(display, onDraw); +} + static bool window_glfm_create_window(struct stl_window *window, u32 width, u32 height, const char *monitor, const char *name, u32 flags) { @@ -37,14 +83,15 @@ static bool window_glfm_create_window(struct stl_window *window, u32 width, u32 (void)monitor; (void)name; (void)flags; + glfmSetUserData(global.display, glfm); s32 display_width, display_height; - glfmGetDisplaySize(glfm->display, &display_width, &display_height); + glfmGetDisplaySize(global.display, &display_width, &display_height); al_assert(display_width > 0 && display_height > 0); glfm->w.width = (u32)display_width; glfm->w.height = (u32)display_height; #ifdef STELA_USE_EGL - glfm->w.egl_display = (EGLDisplay)glfmGetEglDisplay(glfm->display); - glfm->w.egl_context = (EGLContext)glfmGetEglContext(glfm->display); + glfm->w.egl_display = (EGLDisplay)glfmGetEglDisplay(global.display); + glfm->w.egl_context = (EGLContext)glfmGetEglContext(global.display); #endif return true; } @@ -124,7 +171,7 @@ static void window_glfm_gl_release_current(void *data) static void window_glfm_gl_swap_buffers(void *data) { struct stl_window_glfm *glfm = (struct stl_window_glfm *)data; - glfmSwapBuffers(glfm->display); + glfmSwapBuffers(global.display); } #endif @@ -132,7 +179,6 @@ struct stl_window *stl_window_create(void *context) { al_log_info("stela", "Wrapping GLFM window."); struct stl_window_glfm *glfm = al_alloc_object(struct stl_window_glfm); - glfm->display = (GLFMDisplay *)context; stl_window_common_init(&glfm->w); glfm->w.fullscreen = false; glfm->w.create_window = window_glfm_create_window; diff --git a/src/window_glfm.h b/src/window_glfm.h index 9b4c223..9513c45 100644 --- a/src/window_glfm.h +++ b/src/window_glfm.h @@ -4,7 +4,10 @@ #include "window.h" +struct stl_glfm_global { + GLFMDisplay *display; +}; + struct stl_window_glfm { struct stl_window w; - GLFMDisplay *display; }; diff --git a/src/window_win32.c b/src/window_win32.c index c0713b1..5ff9f3c 100644 --- a/src/window_win32.c +++ b/src/window_win32.c @@ -29,8 +29,8 @@ struct the_baby { #define CREATE_DANGEROUS_WINDOW (WM_USER + 0x1337) #define DESTROY_DANGEROUS_WINDOW (WM_USER + 0x1338) -#define EXIT_PROCESS (WM_USER + 0x1339) -#define WAKE_WINDOW (WM_USER + 0x133a) +#define WAKE_WINDOW (WM_USER + 0x1339) +#define EXIT_PROCESS (WM_USER + 0x133a) static DWORD MainThreadID; static struct stl_win32_global global; @@ -446,32 +446,6 @@ static void window_win32_free(struct stl_window **window) al_wstr_free(&w32->WindowName); } -#if defined STELA_API_VULKAN -#elif defined STELA_API_OPENGL -static bool window_win32_gl_loader_load(void *data) -{ - (void)data; - return true; -} - -static bool window_win32_gl_make_current(void *data) -{ - (void)data; - return true; -} - -static void window_win32_gl_release_current(void *data) -{ - (void)data; -} - -static void window_win32_gl_swap_buffers(void *data) -{ - struct stl_window_win32 *w32 = (struct stl_window_win32 *)data; - (void)w32; -} -#endif - struct stl_window *stl_window_create(void *context) { (void)context; @@ -494,14 +468,5 @@ struct stl_window *stl_window_create(void *context) w32->w.should_refresh = window_win32_should_refresh; #endif w32->w.free = window_win32_free; -#if defined STELA_API_VULKAN -#elif defined STELA_API_OPENGL - win32->w.get_gl_proc_address = NULL; - win32->w.gl_loader_load = window_win32_gl_loader_load; - win32->w.gl_make_current = window_win32_gl_make_current; - win32->w.gl_release_current = window_win32_gl_release_current; - win32->w.gl_swap_buffers = window_win32_gl_swap_buffers; -#elif defined STELA_API_DX11 -#endif return (struct stl_window *)w32; } |