From 7c1e8a85cd3d84965502e5f9f6bad609cbd52a07 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Sun, 4 Jul 2021 21:54:44 +1000 Subject: [PATCH] [client] egl: fix race on resolution change A resolution switch could cause the renderer state to become invalid as the texture format may change while it's being rendered. This fixes this by adding a lock around the format change and render calls to the renderer. --- client/src/main.c | 12 ++++++++++++ client/src/main.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/client/src/main.c b/client/src/main.c index 671ede9a..b3a2e23d 100644 --- a/client/src/main.c +++ b/client/src/main.c @@ -106,6 +106,8 @@ static int renderThread(void * unused) return 1; } + LG_LOCK_INIT(g_state.lgrLock); + g_state.lgr->on_show_fps(g_state.lgrData, g_state.showFPS); /* signal to other threads that the renderer is ready */ @@ -132,8 +134,13 @@ static int renderThread(void * unused) atomic_compare_exchange_weak(&g_state.lgrResize, &resize, 0); } + LG_LOCK(g_state.lgrLock); if (!g_state.lgr->render(g_state.lgrData, g_params.winRotate)) + { + LG_UNLOCK(g_state.lgrLock); break; + } + LG_UNLOCK(g_state.lgrLock); if (g_state.showFPS) { @@ -184,6 +191,8 @@ static int renderThread(void * unused) g_state.lgr->deinitialize(g_state.lgrData); g_state.lgr = NULL; + LG_LOCK_FREE(g_state.lgrLock); + return 0; } @@ -492,12 +501,15 @@ int main_frameThread(void * unused) frame->stride, frame->pitch, frame->rotation); + LG_LOCK(g_state.lgrLock); if (!g_state.lgr->on_frame_format(g_state.lgrData, lgrFormat, useDMA)) { DEBUG_ERROR("renderer failed to configure format"); g_state.state = APP_STATE_SHUTDOWN; + LG_UNLOCK(g_state.lgrLock); break; } + LG_UNLOCK(g_state.lgrLock); g_state.srcSize.x = lgrFormat.width; g_state.srcSize.y = lgrFormat.height; diff --git a/client/src/main.h b/client/src/main.h index 856c32cf..20938f8f 100644 --- a/client/src/main.h +++ b/client/src/main.h @@ -28,6 +28,7 @@ #include "common/thread.h" #include "common/types.h" #include "common/ivshmem.h" +#include "common/locking.h" #include "spice/spice.h" #include @@ -73,6 +74,7 @@ struct AppState const LG_Renderer * lgr; void * lgrData; atomic_int lgrResize; + LG_Lock lgrLock; bool cbAvailable; SpiceDataType cbType;