/* =============== GLimp_RendererSleep =============== */ void *GLimp_RendererSleep( void ) { void *data = NULL; GLimp_SetCurrentContext(NULL); SDL_LockMutex(smpMutex); { smpData = NULL; smpDataReady = qfalse; // after this, the front end can exit GLimp_FrontEndSleep SDL_CondSignal(renderCompletedEvent); while ( !smpDataReady ) SDL_CondWait(renderCommandsEvent, smpMutex); data = (void *)smpData; } SDL_UnlockMutex(smpMutex); GLimp_SetCurrentContext(opengl_context); return data; }
/* =============== GLimp_RendererSleep =============== */ void *GLimp_RendererSleep() { void *data = nullptr; GLimp_SetCurrentContext( false ); SDL_LockMutex( smpMutex ); { smpData = nullptr; smpDataReady = false; // after this, the front end can exit GLimp_FrontEndSleep SDL_CondSignal( renderCompletedEvent ); while ( !smpDataReady ) { SDL_CondWait( renderCommandsEvent, smpMutex ); } data = ( void * ) smpData; } SDL_UnlockMutex( smpMutex ); GLimp_SetCurrentContext( true ); return data; }
/* =============== GLimp_FrontEndSleep =============== */ void GLimp_FrontEndSleep( void ) { SDL_LockMutex(smpMutex); { while ( smpData ) SDL_CondWait(renderCompletedEvent, smpMutex); } SDL_UnlockMutex(smpMutex); GLimp_SetCurrentContext(opengl_context); }
/* =============== GLimp_RenderThreadWrapper =============== */ static int GLimp_RenderThreadWrapper( void *arg ) { Com_Printf( "Render thread starting\n" ); glimpRenderThread(); GLimp_SetCurrentContext(NULL); Com_Printf( "Render thread terminating\n" ); return 0; }
/* =============== GLimp_RenderThreadWrapper =============== */ static int GLimp_RenderThreadWrapper(void* arg) { // These printfs cause race conditions which mess up the console output Com_Printf("Render thread starting\n"); renderThreadFunction(); GLimp_SetCurrentContext(false); Com_Printf("Render thread terminating\n"); return 0; }
/* =============== GLimp_WakeRenderer =============== */ void GLimp_WakeRenderer(void* data) { GLimp_SetCurrentContext(false); SDL_LockMutex(smpMutex); { assert(smpData == nullptr); smpData = data; smpDataReady = true; // after this, the renderer can continue through GLimp_RendererSleep SDL_CondSignal(renderCommandsEvent); } SDL_UnlockMutex(smpMutex); }
/* =============== GLimp_SyncRenderThread =============== */ void GLimp_SyncRenderThread() { GLimp_FrontEndSleep(); GLimp_SetCurrentContext( true ); }