diff --git a/desmume/src/GPU.cpp b/desmume/src/GPU.cpp index 3ae3d1473..305edfcfd 100644 --- a/desmume/src/GPU.cpp +++ b/desmume/src/GPU.cpp @@ -6100,7 +6100,11 @@ void GPUSubsystem::SetCustomFramebufferSize(size_t w, size_t h, u16 *clientNativ this->_engineMain->SetCustomFramebufferSize(w, h); this->_engineSub->SetCustomFramebufferSize(w, h); BaseRenderer->SetFramebufferSize(w, h); // Since BaseRenderer is persistent, we need to update this manually. - CurrentRenderer->SetFramebufferSize(w, h); + + if (CurrentRenderer != BaseRenderer) + { + CurrentRenderer->SetFramebufferSize(w, h); + } if (this->_displayInfo.didPerformCustomRender[NDSDisplayID_Main]) { diff --git a/desmume/src/OGLRender.cpp b/desmume/src/OGLRender.cpp index fb798ea3d..6bfb21e89 100644 --- a/desmume/src/OGLRender.cpp +++ b/desmume/src/OGLRender.cpp @@ -786,8 +786,9 @@ static void OpenGLRendererDestroy() if (CurrentRenderer != BaseRenderer) { - delete (OpenGLRenderer *)CurrentRenderer; + OpenGLRenderer *oldRenderer = (OpenGLRenderer *)CurrentRenderer; CurrentRenderer = BaseRenderer; + delete oldRenderer; } ENDGL(); diff --git a/desmume/src/cocoa/cocoa_GPU.mm b/desmume/src/cocoa/cocoa_GPU.mm index 78ecdd8c1..cec8a5d35 100644 --- a/desmume/src/cocoa/cocoa_GPU.mm +++ b/desmume/src/cocoa/cocoa_GPU.mm @@ -49,6 +49,7 @@ private: pthread_mutex_t *_mutexOutputList; NSMutableArray *_cdsOutputList; bool _isRender3DLockHeld; + bool _isIn3DRender; public: GPUEventHandlerOSX(); @@ -723,6 +724,7 @@ public: GPUEventHandlerOSX::GPUEventHandlerOSX() { _isRender3DLockHeld = false; + _isIn3DRender = false; _mutexOutputList = NULL; pthread_rwlock_init(&_rwlockFrame, NULL); pthread_mutex_init(&_mutex3DRender, NULL); @@ -778,12 +780,17 @@ void GPUEventHandlerOSX::DidFrameEnd(bool isFrameSkipped) void GPUEventHandlerOSX::DidRender3DBegin() { + this->_isIn3DRender = true; this->Render3DLock(); } void GPUEventHandlerOSX::DidRender3DEnd() { - this->Render3DUnlock(); + if (this->_isIn3DRender) + { + this->Render3DUnlock(); + this->_isIn3DRender = false; + } } void GPUEventHandlerOSX::FramebufferLockWrite() @@ -811,8 +818,8 @@ void GPUEventHandlerOSX::Render3DUnlock() { if (this->_isRender3DLockHeld) { - pthread_mutex_unlock(&this->_mutex3DRender); this->_isRender3DLockHeld = false; + pthread_mutex_unlock(&this->_mutex3DRender); } } diff --git a/desmume/src/gfx3d.cpp b/desmume/src/gfx3d.cpp index 0d1d9629b..2d834c3bb 100644 --- a/desmume/src/gfx3d.cpp +++ b/desmume/src/gfx3d.cpp @@ -2314,6 +2314,7 @@ void gfx3d_VBlankEndSignal(bool skipFrame) if (!CommonSettings.showGpu.main) { memset(GPU->GetEngineMain()->Get3DFramebufferRGBA6665(), 0, GPU->GetCustomFramebufferWidth() * GPU->GetCustomFramebufferHeight() * sizeof(FragmentColor)); + memset(GPU->GetEngineMain()->Get3DFramebufferRGBA5551(), 0, GPU->GetCustomFramebufferWidth() * GPU->GetCustomFramebufferHeight() * sizeof(u16)); return; } diff --git a/desmume/src/rasterize.cpp b/desmume/src/rasterize.cpp index 2c25e6dbf..ba75b62cb 100644 --- a/desmume/src/rasterize.cpp +++ b/desmume/src/rasterize.cpp @@ -1146,13 +1146,14 @@ static void SoftRasterizerRendererDestroy() if (CurrentRenderer != BaseRenderer) { #if defined(ENABLE_SSSE3) - delete (SoftRasterizerRenderer_SSSE3 *)CurrentRenderer; + SoftRasterizerRenderer_SSSE3 *oldRenderer = (SoftRasterizerRenderer_SSSE3 *)CurrentRenderer; #elif defined(ENABLE_SSE2) - delete (SoftRasterizerRenderer_SSE2 *)CurrentRenderer; + SoftRasterizerRenderer_SSE2 *oldRenderer = (SoftRasterizerRenderer_SSE2 *)CurrentRenderer; #else - delete (SoftRasterizerRenderer *)CurrentRenderer; + SoftRasterizerRenderer *oldRenderer = (SoftRasterizerRenderer *)CurrentRenderer; #endif CurrentRenderer = BaseRenderer; + delete oldRenderer; } } diff --git a/desmume/src/render3D.cpp b/desmume/src/render3D.cpp index 0e7581f86..1cf6353b3 100644 --- a/desmume/src/render3D.cpp +++ b/desmume/src/render3D.cpp @@ -119,8 +119,9 @@ void Render3DBaseDestroy() { if (CurrentRenderer != BaseRenderer) { - delete CurrentRenderer; + Render3D *oldRenderer = CurrentRenderer; CurrentRenderer = BaseRenderer; + delete oldRenderer; } }