diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp b/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp index 7196d1438a..9d60f72b62 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp @@ -472,11 +472,11 @@ void ConfigDialog::AdvancedSettingsChanged(wxCommandEvent& event) case ID_TEXFMTOVERLAY: g_Config.bTexFmtOverlayEnable = m_TexFmtOverlay->IsChecked(); m_TexFmtCenter->Enable(m_TexFmtOverlay->IsChecked()); - TextureMngr::Invalidate(); + TextureMngr::Invalidate(false); break; case ID_TEXFMTCENTER: g_Config.bTexFmtOverlayCenter = m_TexFmtCenter->IsChecked(); - TextureMngr::Invalidate(); + TextureMngr::Invalidate(false); break; case ID_USEXFB: g_Config.bUseXFB = m_UseXFB->IsChecked(); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp index c4460465ab..510463e393 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp @@ -880,9 +880,9 @@ void Renderer::Swap(const TRectangle& rc) // The picture width PictureWidth = WinWidth / Ratio; // Move the left of the picture to the middle of the screen - FloatXOffset = FloatXOffset + WinWidth / 2.0; + FloatXOffset = FloatXOffset + WinWidth / 2.0f; // Then remove half the picture height to move it to the horizontal center - FloatXOffset = FloatXOffset - PictureWidth / 2.0; + FloatXOffset = FloatXOffset - PictureWidth / 2.0f; // -------------------- } // The window is to high, we have to limit the height @@ -1113,7 +1113,7 @@ void Renderer::SwapBuffers() // Clean out old stuff from caches PixelShaderCache::Cleanup(); - TextureMngr::Cleanup(); + TextureMngr::ProgressiveCleanup(); frameCount++; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/TextureMngr.cpp b/Source/Plugins/Plugin_VideoOGL/Src/TextureMngr.cpp index 1d00b882a8..cc57583f12 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/TextureMngr.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/TextureMngr.cpp @@ -129,18 +129,15 @@ void TextureMngr::TCacheEntry::SetTextureParameters(TexMode0 &newmode) } } -void TextureMngr::TCacheEntry::Destroy() +void TextureMngr::TCacheEntry::Destroy(bool shutdown) { if (!texture) return; - glDeleteTextures(1, &texture); - if (!isRenderTarget) { - if (!g_Config.bSafeTextureCache) { - u32 *ptr = (u32*)g_VideoInitialize.pGetMemoryPointer(addr + hashoffset * 4); - if (*ptr == hash) - *ptr = oldpixel; - } + if (!isRenderTarget && !shutdown && !g_Config.bSafeTextureCache) { + u32 *ptr = (u32*)g_VideoInitialize.pGetMemoryPointer(addr + hashoffset * 4); + if (ptr && *ptr == hash) + *ptr = oldpixel; } texture = 0; } @@ -152,20 +149,20 @@ void TextureMngr::Init() TexDecoder_SetTexFmtOverlayOptions(g_Config.bTexFmtOverlayEnable, g_Config.bTexFmtOverlayCenter); } -void TextureMngr::Invalidate() +void TextureMngr::Invalidate(bool shutdown) { - TexCache::iterator iter = textures.begin(); - for (; iter!=textures.end(); iter++) - iter->second.Destroy(); + for (TexCache::iterator iter = textures.begin(); iter != textures.end(); ++iter) + iter->second.Destroy(shutdown); textures.clear(); - TexDecoder_SetTexFmtOverlayOptions(g_Config.bTexFmtOverlayEnable, g_Config.bTexFmtOverlayCenter); } void TextureMngr::Shutdown() { - Invalidate(); + Invalidate(true); + std::map::iterator itdepth = mapDepthTargets.begin(); - for (itdepth = mapDepthTargets.begin(); itdepth != mapDepthTargets.end(); ++itdepth) { + for (itdepth = mapDepthTargets.begin(); itdepth != mapDepthTargets.end(); ++itdepth) + { glDeleteRenderbuffersEXT(1, &itdepth->second.targ); } mapDepthTargets.clear(); @@ -179,13 +176,15 @@ void TextureMngr::Shutdown() temp = NULL; } -void TextureMngr::Cleanup() +void TextureMngr::ProgressiveCleanup() { TexCache::iterator iter = textures.begin(); - while (iter != textures.end()) { - if (frameCount > TEXTURE_KILL_THRESHOLD + iter->second.frameCount) { + while (iter != textures.end()) + { + if (frameCount > TEXTURE_KILL_THRESHOLD + iter->second.frameCount) + { if (!iter->second.isRenderTarget) { - iter->second.Destroy(); + iter->second.Destroy(false); #ifdef _WIN32 iter = textures.erase(iter); #else @@ -193,7 +192,7 @@ void TextureMngr::Cleanup() #endif } else { - iter->second.Destroy(); + iter->second.Destroy(false); #ifdef _WIN32 iter = textures.erase(iter); #else @@ -206,7 +205,8 @@ void TextureMngr::Cleanup() } std::map::iterator itdepth = mapDepthTargets.begin(); - while (itdepth != mapDepthTargets.end()) { + while (itdepth != mapDepthTargets.end()) + { if (frameCount > 20 + itdepth->second.framecount) { #ifdef _WIN32 itdepth = mapDepthTargets.erase(itdepth); @@ -218,8 +218,6 @@ void TextureMngr::Cleanup() } } -//int dbgTexIdx=0; - TextureMngr::TCacheEntry* TextureMngr::Load(int texstage, u32 address, int width, int height, int format, int tlutaddr, int tlutfmt) { /* notes (about "UNsafe texture cache"): @@ -306,7 +304,7 @@ TextureMngr::TCacheEntry* TextureMngr::Load(int texstage, u32 address, int width } else { - entry.Destroy(); + entry.Destroy(false); textures.erase(iter); } } @@ -422,7 +420,6 @@ TextureMngr::TCacheEntry* TextureMngr::Load(int texstage, u32 address, int width dbgTexIdx++; } */ - //SaveTexture("tex.tga", target, entry.texture, entry.w, entry.h); return &entry; } @@ -541,7 +538,7 @@ void TextureMngr::CopyRenderTargetToTexture(u32 address, bool bFromZBuffer, bool } else if (bIsIntensityFmt) { fConstAdd[0] = fConstAdd[1] = fConstAdd[2] = 16.0f/255.0f; - switch(copyfmt) { + switch (copyfmt) { case 0: // I4 case 1: // I8 case 2: // IA4 @@ -730,7 +727,6 @@ void TextureMngr::DisableStage(int stage) void TextureMngr::ClearRenderTargets() { - TexCache::iterator iter = textures.begin(); - for (; iter!=textures.end(); iter++) + for (TexCache::iterator iter = textures.begin(); iter!=textures.end(); iter++) iter->second.isRenderTarget = false; } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/TextureMngr.h b/Source/Plugins/Plugin_VideoOGL/Src/TextureMngr.h index 273a720901..1f0eb067f1 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/TextureMngr.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/TextureMngr.h @@ -49,7 +49,7 @@ public: bool bHaveMipMaps; void SetTextureParameters(TexMode0& newmode); - void Destroy(); + void Destroy(bool shutdown); void ConvertFromRenderTarget(u32 taddr, int twidth, int theight, int tformat, int tlutaddr, int tlutfmt); }; @@ -61,7 +61,7 @@ public: }; private: - typedef std::map TexCache; + typedef std::map TexCache; static u8 *temp; static TexCache textures; @@ -70,9 +70,9 @@ private: public: static void Init(); - static void Cleanup(); + static void ProgressiveCleanup(); static void Shutdown(); - static void Invalidate(); + static void Invalidate(bool shutdown); static TCacheEntry* Load(int texstage, u32 address, int width, int height, int format, int tlutaddr, int tlutfmt); static void CopyRenderTargetToTexture(u32 address, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, bool bScaleByHalf, TRectangle *source); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp index aca63c9ad3..c253c60bcc 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp @@ -255,7 +255,7 @@ void DoState(unsigned char **ptr, int mode) { OpenGL_MakeCurrent(); #endif // Clear all caches that touch RAM - TextureMngr::Invalidate(); + TextureMngr::Invalidate(false); // DisplayListManager::Invalidate(); VertexLoaderManager::MarkAllDirty(); @@ -306,12 +306,7 @@ void Shutdown(void) PixelShaderManager::Shutdown(); PixelShaderCache::Shutdown(); VertexManager::Shutdown(); - // This cause some kind of crash, at least in the Release build and with this setup option - // If there wasn't so little explanations and comments in this code I would be more interested - // in trying to fix this function, now I'll just leave it like this, because it works - #ifndef SETUP_FREE_VIDEO_PLUGIN_ON_BOOT - TextureMngr::Shutdown(); - #endif + TextureMngr::Shutdown(); OpcodeDecoder_Shutdown(); Renderer::Shutdown(); OpenGL_Shutdown();