[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.
This commit is contained in:
Geoffrey McRae 2021-07-04 21:54:44 +10:00
parent 82e10c1b7e
commit 7c1e8a85cd
2 changed files with 14 additions and 0 deletions

View File

@ -106,6 +106,8 @@ static int renderThread(void * unused)
return 1; return 1;
} }
LG_LOCK_INIT(g_state.lgrLock);
g_state.lgr->on_show_fps(g_state.lgrData, g_state.showFPS); g_state.lgr->on_show_fps(g_state.lgrData, g_state.showFPS);
/* signal to other threads that the renderer is ready */ /* 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); 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)) if (!g_state.lgr->render(g_state.lgrData, g_params.winRotate))
{
LG_UNLOCK(g_state.lgrLock);
break; break;
}
LG_UNLOCK(g_state.lgrLock);
if (g_state.showFPS) if (g_state.showFPS)
{ {
@ -184,6 +191,8 @@ static int renderThread(void * unused)
g_state.lgr->deinitialize(g_state.lgrData); g_state.lgr->deinitialize(g_state.lgrData);
g_state.lgr = NULL; g_state.lgr = NULL;
LG_LOCK_FREE(g_state.lgrLock);
return 0; return 0;
} }
@ -492,12 +501,15 @@ int main_frameThread(void * unused)
frame->stride, frame->pitch, frame->stride, frame->pitch,
frame->rotation); frame->rotation);
LG_LOCK(g_state.lgrLock);
if (!g_state.lgr->on_frame_format(g_state.lgrData, lgrFormat, useDMA)) if (!g_state.lgr->on_frame_format(g_state.lgrData, lgrFormat, useDMA))
{ {
DEBUG_ERROR("renderer failed to configure format"); DEBUG_ERROR("renderer failed to configure format");
g_state.state = APP_STATE_SHUTDOWN; g_state.state = APP_STATE_SHUTDOWN;
LG_UNLOCK(g_state.lgrLock);
break; break;
} }
LG_UNLOCK(g_state.lgrLock);
g_state.srcSize.x = lgrFormat.width; g_state.srcSize.x = lgrFormat.width;
g_state.srcSize.y = lgrFormat.height; g_state.srcSize.y = lgrFormat.height;

View File

@ -28,6 +28,7 @@
#include "common/thread.h" #include "common/thread.h"
#include "common/types.h" #include "common/types.h"
#include "common/ivshmem.h" #include "common/ivshmem.h"
#include "common/locking.h"
#include "spice/spice.h" #include "spice/spice.h"
#include <lgmp/client.h> #include <lgmp/client.h>
@ -73,6 +74,7 @@ struct AppState
const LG_Renderer * lgr; const LG_Renderer * lgr;
void * lgrData; void * lgrData;
atomic_int lgrResize; atomic_int lgrResize;
LG_Lock lgrLock;
bool cbAvailable; bool cbAvailable;
SpiceDataType cbType; SpiceDataType cbType;