summaryrefslogtreecommitdiff
path: root/src/screen
diff options
context:
space:
mode:
Diffstat (limited to 'src/screen')
-rw-r--r--src/screen/screen.c33
-rw-r--r--src/screen/screen.h1
2 files changed, 25 insertions, 9 deletions
diff --git a/src/screen/screen.c b/src/screen/screen.c
index 23afa7e..0ff5eec 100644
--- a/src/screen/screen.c
+++ b/src/screen/screen.c
@@ -51,7 +51,7 @@ static void do_resize(struct camu_screen *scr, u32 width, u32 height)
camu_view_calculate(&video->view, scr->width, scr->height);
}
// No buffers resize.
- al_atomic_store(u32)(&scr->force_refresh, 1, AL_ATOMIC_RELAXED);
+ al_atomic_add(u32)(&scr->force_refresh, 1, AL_ATOMIC_RELAXED);
}
static void resize_callback(void *userdata, u32 width, u32 height)
@@ -309,6 +309,18 @@ static bool key_callback(void *userdata, u8 state, u16 button)
log_info("Scaling filters enabled.");
}
return true;
+ case STELA_KEY_C:
+ scr->transparent_background = !scr->transparent_background;
+ if (scr->transparent_background) {
+ scr->renderer->set_background(scr->renderer, CAMU_BACKGROUND_TRANSPARENT);
+ log_info("Background transparent.");
+ } else {
+ scr->renderer->set_background(scr->renderer, CAMU_BACKGROUND_DEFAULT);
+ log_info("Background solid.");
+ }
+ // Force refresh for if there's no video buffer.
+ al_atomic_add(u32)(&scr->force_refresh, 1, AL_ATOMIC_RELAXED);
+ return true;
default:
break;
}
@@ -402,6 +414,7 @@ bool camu_screen_create_window(struct camu_screen *scr, const char *name)
scr->height = scr->window->height;
scr->fullscreen = false;
scr->scaling_disabled = false;
+ scr->transparent_background = false;
#ifdef STELA_EVENT_BUFFER
nn_thread_create(&scr->thread, event_thread, scr);
#endif
@@ -412,13 +425,13 @@ bool camu_screen_create_renderer(struct camu_screen *scr, struct camu_renderer *
{
scr->renderer = renderer;
return renderer->create_renderer(renderer, &scr->width, &scr->height,
-#if defined CAMU_RENDERER_VULKAN
+#if defined STELA_API_VULKAN
scr->window->get_vk_proc_address,
scr->window->vk_create_surface,
scr->window->vk_get_extensions,
-#elif defined CAMU_RENDERER_DX11
+#elif defined STELA_API_DX11
scr->window->win32_window,
-#elif defined CAMU_RENDERER_OPENGL
+#elif defined STELA_API_OPENGL
#ifdef STELA_USE_EGL
scr->window->egl_display,
scr->window->egl_context,
@@ -587,14 +600,14 @@ void camu_screen_set_state(struct camu_screen *scr, s32 state)
if (al_atomic_load(s32)(&scr->state, AL_ATOMIC_ACQUIRE) != CAMU_SCREEN_STOPPED) {
al_atomic_store(s32)(&scr->state, state, AL_ATOMIC_RELEASE);
if (state == CAMU_SCREEN_PAUSED) {
- al_atomic_store(u32)(&scr->force_refresh, 1, AL_ATOMIC_RELAXED);
+ al_atomic_add(u32)(&scr->force_refresh, 1, AL_ATOMIC_RELAXED);
}
}
}
void camu_screen_force_refresh(struct camu_screen *scr)
{
- al_atomic_store(u32)(&scr->force_refresh, 1, AL_ATOMIC_RELAXED);
+ al_atomic_add(u32)(&scr->force_refresh, 1, AL_ATOMIC_RELAXED);
camu_screen_wake(scr);
}
@@ -622,13 +635,15 @@ bool camu_screen_tick(struct camu_screen *scr, bool *force)
{
s32 state = al_atomic_load(s32)(&scr->state, AL_ATOMIC_RELAXED);
al_assert(state != CAMU_SCREEN_STOPPED);
- bool paused = state == CAMU_SCREEN_PAUSED;
- bool do_render = camu_screen_poll(scr, paused) || !paused;
u32 force_refresh = al_atomic_load(u32)(&scr->force_refresh, AL_ATOMIC_ACQUIRE);
+ bool paused = state == CAMU_SCREEN_PAUSED && force_refresh == 0;
+ bool do_render = camu_screen_poll(scr, paused) || !paused;
+ // Should be AL_ATOMIC_ACQ_REL.
+ force_refresh = al_atomic_load(u32)(&scr->force_refresh, AL_ATOMIC_ACQUIRE);
do_render |= force_refresh > 0;
*force = force_refresh > 0;
if (force_refresh > 0) {
- al_atomic_store(u32)(&scr->force_refresh, 0, AL_ATOMIC_RELEASE);
+ al_atomic_sub(u32)(&scr->force_refresh, 1, AL_ATOMIC_RELEASE);
}
return do_render;
}
diff --git a/src/screen/screen.h b/src/screen/screen.h
index 4ba07c2..afd2dee 100644
--- a/src/screen/screen.h
+++ b/src/screen/screen.h
@@ -64,6 +64,7 @@ struct camu_screen {
u32 height;
bool fullscreen;
bool scaling_disabled;
+ bool transparent_background;
u64 last_click_ts;
f64 last_mouse_y;
f64 last_mouse_x;