Skip to content
Snippets Groups Projects
Commit 22c8b09f authored by Deucе's avatar Deucе :ok_hand_tone4:
Browse files

Get vstat out of sdl_add_key() path

This should almost completely remove vstatlock contention in SyncTERM,
which should bring SDL output performance close to X11 performance.
parent fdce00a4
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
Pipeline #4104 passed
...@@ -665,6 +665,11 @@ static void setup_surfaces_locked(struct video_stats *vs) ...@@ -665,6 +665,11 @@ static void setup_surfaces_locked(struct video_stats *vs)
sdl.DestroyTexture(texture); sdl.DestroyTexture(texture);
texture = newtexture; texture = newtexture;
} }
if (vs != &vstat) {
pthread_mutex_lock(&vstatlock);
*vs = vstat;
pthread_mutex_unlock(&vstatlock);
}
sdl.SetWindowMinimumSize(win, idealmw, idealmh); sdl.SetWindowMinimumSize(win, idealmw, idealmh);
if(win!=NULL) { if(win!=NULL) {
...@@ -686,14 +691,13 @@ static void setup_surfaces(void) ...@@ -686,14 +691,13 @@ static void setup_surfaces(void)
} }
/* Called from event thread only */ /* Called from event thread only */
static void sdl_add_key(unsigned int keyval) static void sdl_add_key(unsigned int keyval, struct video_stats *vs)
{ {
if(keyval==0xa600) { if(keyval==0xa600 && vs != NULL) {
fullscreen=!fullscreen; fullscreen=!fullscreen;
cio_api.mode=fullscreen?CIOLIB_MODE_SDL_FULLSCREEN:CIOLIB_MODE_SDL; cio_api.mode=fullscreen?CIOLIB_MODE_SDL_FULLSCREEN:CIOLIB_MODE_SDL;
sdl.SetWindowFullscreen(win, fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0); sdl.SetWindowFullscreen(win, fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0);
// TODO: This uses vstat from the video event thread... setup_surfaces_locked(vs);
setup_surfaces();
return; return;
} }
if(keyval <= 0xffff) { if(keyval <= 0xffff) {
...@@ -787,7 +791,7 @@ static unsigned int sdl_get_char_code(unsigned int keysym, unsigned int mod) ...@@ -787,7 +791,7 @@ static unsigned int sdl_get_char_code(unsigned int keysym, unsigned int mod)
} }
static void static void
sdl_add_keys(uint8_t *utf8s) sdl_add_keys(uint8_t *utf8s, struct video_stats *vs)
{ {
char *chars; char *chars;
char *p; char *p;
...@@ -795,7 +799,7 @@ sdl_add_keys(uint8_t *utf8s) ...@@ -795,7 +799,7 @@ sdl_add_keys(uint8_t *utf8s)
chars = utf8_to_cp(getcodepage(), utf8s, '\x00', strlen((char *)utf8s), NULL); chars = utf8_to_cp(getcodepage(), utf8s, '\x00', strlen((char *)utf8s), NULL);
if (chars) { if (chars) {
for (p = chars; *p; p++) { for (p = chars; *p; p++) {
sdl_add_key(*((uint8_t *)p)); sdl_add_key(*((uint8_t *)p), vs);
} }
free(chars); free(chars);
} }
...@@ -807,7 +811,7 @@ static void sdl_mouse_thread(void *data) ...@@ -807,7 +811,7 @@ static void sdl_mouse_thread(void *data)
SetThreadName("SDL Mouse"); SetThreadName("SDL Mouse");
while(1) { while(1) {
if(mouse_wait()) if(mouse_wait())
sdl_add_key(CIO_KEY_MOUSE); sdl_add_key(CIO_KEY_MOUSE, NULL);
} }
} }
...@@ -945,11 +949,11 @@ void sdl_video_event_thread(void *data) ...@@ -945,11 +949,11 @@ void sdl_video_event_thread(void *data)
|| ev.key.keysym.sym == SDLK_KP_PLUS || ev.key.keysym.sym == SDLK_KP_PLUS
|| ev.key.keysym.sym == SDLK_KP_PERIOD)) || ev.key.keysym.sym == SDLK_KP_PERIOD))
break; break;
sdl_add_key(sdl_get_char_code(ev.key.keysym.sym, ev.key.keysym.mod)); sdl_add_key(sdl_get_char_code(ev.key.keysym.sym, ev.key.keysym.mod), &cvstat);
} }
else if (!isprint(ev.key.keysym.sym)) { else if (!isprint(ev.key.keysym.sym)) {
if (ev.key.keysym.sym < 128) if (ev.key.keysym.sym < 128)
sdl_add_key(ev.key.keysym.sym); sdl_add_key(ev.key.keysym.sym, &cvstat);
} }
break; break;
case SDL_TEXTINPUT: case SDL_TEXTINPUT:
...@@ -957,9 +961,9 @@ void sdl_video_event_thread(void *data) ...@@ -957,9 +961,9 @@ void sdl_video_event_thread(void *data)
unsigned int charcode = sdl_get_char_code(last_sym, last_mod & ~(KMOD_ALT)); unsigned int charcode = sdl_get_char_code(last_sym, last_mod & ~(KMOD_ALT));
// If the key is exactly what we would expect, use sdl_get_char_code() // If the key is exactly what we would expect, use sdl_get_char_code()
if (*(uint8_t *)ev.text.text == charcode) if (*(uint8_t *)ev.text.text == charcode)
sdl_add_key(sdl_get_char_code(last_sym, last_mod)); sdl_add_key(sdl_get_char_code(last_sym, last_mod), &cvstat);
else else
sdl_add_keys((uint8_t *)ev.text.text); sdl_add_keys((uint8_t *)ev.text.text, &cvstat);
} }
break; break;
case SDL_KEYUP: case SDL_KEYUP:
...@@ -1025,7 +1029,7 @@ void sdl_video_event_thread(void *data) ...@@ -1025,7 +1029,7 @@ void sdl_video_event_thread(void *data)
if (ciolib_reaper) if (ciolib_reaper)
sdl_user_func(SDL_USEREVENT_QUIT); sdl_user_func(SDL_USEREVENT_QUIT);
else else
sdl_add_key(CIO_KEY_QUIT); sdl_add_key(CIO_KEY_QUIT, &cvstat);
break; break;
case SDL_WINDOWEVENT: case SDL_WINDOWEVENT:
switch(ev.window.event) { switch(ev.window.event) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment