summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/window.c7
-rw-r--r--src/window.h3
-rw-r--r--src/window_glfm.c56
-rw-r--r--src/window_glfm.h5
-rw-r--r--src/window_win32.c39
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;
}