mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-08-31 09:45:24 +02:00
GLRenderManager is documented as "emu thread records, render thread executes", but GL has to record device object creation as init steps rather than just doing it, and InitGPU() runs on the ExecLoader thread - GPU_GLES's constructor builds DrawEngineGLES, whose InitDeviceObjects() reaches initSteps_ through CreatePushBuffer and CreateInputLayout. The emu thread is still drawing the loading screen into the same FastVec until the loader thread is joined, so two concurrent push_uninitialized() can both reallocate, and one writes its step into a freed buffer - losing a shader or buffer creation, or scribbling an owned pointer into freed memory. frameData_[].activePushBuffers is genuinely three-threaded too: inserted into by whoever creates a push buffer, erased on the render thread via GLDeleter, and walked on the render thread each frame. A mutex each, uncontended in practice. Note this makes the existing access safe rather than fixing the layering - Vulkan avoids the problem by creating objects directly and deferring the rest to FinishInitOnMainThread, which GPU_GLES has never had. Moving GL's device object creation there would be the better fix. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Vd8ntC2brCUtCrDJMqLbs8