diff options
Diffstat (limited to 'src/screen')
| -rw-r--r-- | src/screen/screen.c | 45 | ||||
| -rw-r--r-- | src/screen/screen.h | 5 |
2 files changed, 37 insertions, 13 deletions
diff --git a/src/screen/screen.c b/src/screen/screen.c index 701b39e..0a0473d 100644 --- a/src/screen/screen.c +++ b/src/screen/screen.c @@ -7,14 +7,18 @@ #include "view.h" #include "screen.h" +#define SCREEN_INVALID_TS ((u64)-1) + #define SCREEN_MOD1(scr) ((scr)->window->held_modifiers & (STELA_MOD_LCONTROL | STELA_MOD_RCONTROL)) #define SCREEN_MOD2(scr) ((scr)->window->held_modifiers & (STELA_MOD_LSHIFT | STELA_MOD_RSHIFT)) #define SCREEN_MOUSE_MOD(scr) ((scr)->flags & CAMU_SCREEN_MOUSE_MOD) + #define SCREEN_IS_DRAGGING(scr) ((scr)->flags & CAMU_SCREEN_DRAGGING) #define SCREEN_IS_ZOOMING(scr) ((scr)->flags & CAMU_SCREEN_ZOOMING) #define SCREEN_ZOOM_MODE(scr, mode) ((scr)->flags & mode) -#define SCREEN_INVALID_TS ((u64)-1) + #define SCREEN_DEFAULT_CURSOR(scr) ((scr->fullscreen || scr->vr_emulation) ? STELA_CURSOR_HIDDEN : STELA_CURSOR_NORMAL) + #define SCREEN_LAST_CLICK_WITHIN(ns) \ (((scr)->last_click_ts != SCREEN_INVALID_TS) && (nn_get_timestamp() - (scr)->last_click_ts <= ns)) @@ -302,10 +306,17 @@ static bool key_callback(void *userdata, u8 state, u16 button) } break; case STELA_KEY_E: - scr->callback(scr->userdata, CAMU_SCREEN_RESEEK, NULL); + if (scr->vr_emulation) { + if (scr->vr_emulation == CAMU_VR_180) { + scr->vr_left_eye = !scr->vr_left_eye; + log_info(scr->vr_left_eye ? "Left eye." : "Right eye."); + } + } else { + scr->callback(scr->userdata, CAMU_SCREEN_RESEEK, NULL); + } break; case STELA_KEY_M: { - f32 volume = SCREEN_MOD1(scr) ? 1.f : 0.f; + f32 volume = SCREEN_MOD1(scr) ? 1.f : -1.f; scr->callback(scr->userdata, CAMU_SCREEN_SET_VOLUME, &volume); break; } @@ -410,6 +421,7 @@ static bool key_callback(void *userdata, u8 state, u16 button) struct camu_view *view = get_view_from_mouse_pos(scr); if (SCREEN_MOD2(scr) && scr->vr_emulation == CAMU_VR_180) { scr->vr_emulation = CAMU_VR_360; + log_info("VR 360 degrees."); break; } if (!scr->vr_emulation) { @@ -417,11 +429,13 @@ static bool key_callback(void *userdata, u8 state, u16 button) scr->flags = (scr->flags & ~CAMU_SCREEN_ZOOM_PAN_SIMPLE) | CAMU_SCREEN_ZOOM_FOV; scr->window->set_cursor(scr->window, STELA_CURSOR_HIDDEN); scr->vr_emulation = SCREEN_MOD2(scr) ? CAMU_VR_360 : CAMU_VR_180; + log_info("VR %s degrees.", (scr->vr_emulation == CAMU_VR_180) ? "180" : "360"); } else { if (view) view->mode = CAMU_DEFAULT_VIEW; scr->flags = (scr->flags & ~CAMU_SCREEN_ZOOM_FOV) | CAMU_SCREEN_ZOOM_PAN_SIMPLE; scr->window->set_cursor(scr->window, STELA_CURSOR_NORMAL); scr->vr_emulation = CAMU_VR_DISABLED; + log_info("VR disabled."); } if (view) { camu_view_calculate(view, scr->width, scr->height); @@ -496,6 +510,7 @@ bool camu_screen_init(struct camu_screen *scr) scr->last_seek_ts = 0; #endif scr->vr_emulation = CAMU_VR_DISABLED; + scr->vr_left_eye = false; scr->vr_calibrate_x = 0.5; scr->vr_calibrate_y = 0.5; al_array_init(scr->videos); @@ -525,7 +540,7 @@ static nn_thread_result NNWT_THREADCALL event_thread(void *userdata) bool camu_screen_create_window(struct camu_screen *scr, const char *name) { u32 flags = STELA_WINDOW_VSYNC; - if (!scr->window->create_window(scr->window, CAMU_SCREEN_WIDTH, CAMU_SCREEN_HEIGHT, "", name, flags)) { + if (!scr->window->create_window(scr->window, CAMU_SCREEN_WIDTH, CAMU_SCREEN_HEIGHT, flags, "", name, "camu_screen")) { return false; } scr->width = scr->window->width; @@ -583,9 +598,6 @@ static void add_buffer_internal(struct camu_screen *scr, struct camu_video_buffe camu_view_init(&video.view, fmt->width, fmt->height); } camu_view_calculate(&video.view, scr->width, scr->height); -#ifdef CAMU_SCREEN_THREADED - atomic_store(bool)(&buf->ref, true, AL_ATOMIC_RELAXED); -#endif al_array_push(scr->videos, video); } @@ -595,10 +607,10 @@ static void remove_buffer_internal(struct camu_screen *scr, struct camu_video_bu al_array_foreach_ptr(scr->videos, i, video) { if (video->buf == buf) { buf->view = video->view; + al_array_remove_at(scr->videos, i); #ifdef CAMU_SCREEN_THREADED atomic_store(bool)(&buf->ref, false, AL_ATOMIC_RELAXED); #endif - al_array_remove_at(scr->videos, i); break; } } @@ -631,7 +643,7 @@ void camu_screen_add_buffer(struct camu_screen *scr, struct camu_video_buffer *b al_array_foreach(scr->add_queue, i, queued) { if (queued == buf) { nn_mutex_unlock(&scr->mutex); - return; + al_assert_and_return(); } } al_array_foreach_rev(scr->rem_queue, i, queued) { @@ -646,6 +658,9 @@ void camu_screen_add_buffer(struct camu_screen *scr, struct camu_video_buffer *b } } al_array_push(scr->add_queue, buf); +#ifdef CAMU_SCREEN_THREADED + atomic_store(bool)(&buf->ref, true, AL_ATOMIC_RELAXED); +#endif atomic_store(bool)(&scr->queued, true, AL_ATOMIC_RELAXED); nn_mutex_unlock(&scr->mutex); #else @@ -661,6 +676,10 @@ void camu_screen_remove_buffer(struct camu_screen *scr, struct camu_video_buffer struct camu_video_buffer *queued; al_array_foreach(scr->rem_queue, i, queued) { if (queued == buf) { + // A sink entry that has an added video buffer (state set to BUFFER_ADDED) + // that was previously removed (called screen_remove_buffer()), could + // then be removed again without ever calling screen_add_buffer() + // if that entry's audio buffer was not yet buffered. nn_mutex_unlock(&scr->mutex); return; } @@ -668,6 +687,9 @@ void camu_screen_remove_buffer(struct camu_screen *scr, struct camu_video_buffer al_array_foreach_rev(scr->add_queue, i, queued) { if (queued == buf) { al_array_remove_at(scr->add_queue, i); +#ifdef CAMU_SCREEN_THREADED + atomic_store(bool)(&buf->ref, false, AL_ATOMIC_RELAXED); +#endif bool queue_empty = scr->add_queue.count + scr->rem_queue.count == 0; if (queue_empty) { atomic_store(bool)(&scr->queued, false, AL_ATOMIC_RELAXED); @@ -750,7 +772,6 @@ bool camu_screen_tick(struct camu_screen *scr, bool *force) u32 force_refresh = atomic_load(u32)(&scr->force_refresh, AL_ATOMIC_ACQUIRE); bool paused = !scr->vr_emulation && state == CAMU_SCREEN_PAUSED && force_refresh == 0; bool do_render = camu_screen_poll(scr, paused) || !paused; - // Should be AL_ATOMIC_ACQ_REL. force_refresh = atomic_load(u32)(&scr->force_refresh, AL_ATOMIC_ACQUIRE); do_render |= force_refresh > 0; *force = force_refresh > 0; @@ -781,5 +802,7 @@ void camu_screen_close(struct camu_screen *scr) #ifdef STELA_EVENT_BUFFER nn_thread_join(&scr->thread); #endif - scr->window->free(&scr->window); + if (scr->window) { + scr->window->free(&scr->window); + } } diff --git a/src/screen/screen.h b/src/screen/screen.h index aded49c..b92cfe5 100644 --- a/src/screen/screen.h +++ b/src/screen/screen.h @@ -12,9 +12,9 @@ #include "view.h" -//#define CAMU_SCREEN_DEBUG_KEY +#define CAMU_SCREEN_DEBUG_KEY -// Interpret click and drag as seeking. This is mainly a seek performance test. +// Interpret click and drag as seeking. Mainly a seek performance test. //#define CAMU_SCREEN_DRAG_SEEK #define CAMU_SCREEN_WIDTH 700 @@ -80,6 +80,7 @@ struct camu_screen { u64 last_seek_ts; #endif u8 vr_emulation; + bool vr_left_eye; f64 vr_calibrate_x; f64 vr_calibrate_y; array(struct camu_screen_video) videos; |