diff options
| author | 2025-05-25 18:49:20 -0400 | |
|---|---|---|
| committer | 2025-05-25 18:49:20 -0400 | |
| commit | 2fa7ea95c891981684a55b41977172d040c2cc55 (patch) | |
| tree | d349e810b3178045a420b625f6dbe5634b64807b /src/screen | |
| parent | 01f852081b1291da7fc342976bf5228ffb618736 (diff) | |
| download | camu-2fa7ea95c891981684a55b41977172d040c2cc55.tar.gz camu-2fa7ea95c891981684a55b41977172d040c2cc55.tar.bz2 camu-2fa7ea95c891981684a55b41977172d040c2cc55.zip | |
Support Windows XP (Old FFmpeg and build fixes)
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/screen')
| -rw-r--r-- | src/screen/screen.c | 33 | ||||
| -rw-r--r-- | src/screen/screen.h | 1 |
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; |