summaryrefslogtreecommitdiff
path: root/src/screen/screen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/screen/screen.c')
-rw-r--r--src/screen/screen.c45
1 files changed, 34 insertions, 11 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);
+ }
}