From 3b1610da64c2ea8d4dc13cc105a1d012386195b8 Mon Sep 17 00:00:00 2001 From: Alex Zolotarev Date: Fri, 20 Jan 2012 03:03:44 +0300 Subject: [PATCH] Free opengl resources before allocating new ones, this fixes crashes with low video memory --- map/render_policy_st.cpp | 4 ++++ map/render_queue_routine.cpp | 3 +++ yg/render_state_updater.cpp | 3 +++ 3 files changed, 10 insertions(+) diff --git a/map/render_policy_st.cpp b/map/render_policy_st.cpp index b5de631ec3..11c46bc43f 100644 --- a/map/render_policy_st.cpp +++ b/map/render_policy_st.cpp @@ -105,6 +105,7 @@ RenderPolicyST::RenderPolicyST(VideoTimer * videoTimer, rmp.fitIntoLimits(); + m_resourceManager.reset(); m_resourceManager.reset(new yg::ResourceManager(rmp)); Platform::FilesList fonts; @@ -123,8 +124,10 @@ RenderPolicyST::RenderPolicyST(VideoTimer * videoTimer, p.m_isSynchronized = false; p.m_useGuiResources = true; + m_drawer.reset(); m_drawer.reset(new DrawerYG(p)); + m_windowHandle.reset(); m_windowHandle.reset(new WindowHandle()); m_windowHandle->setUpdatesEnabled(false); @@ -132,6 +135,7 @@ RenderPolicyST::RenderPolicyST(VideoTimer * videoTimer, m_windowHandle->setVideoTimer(videoTimer); m_windowHandle->setRenderContext(primaryRC); + m_renderQueue.reset(); m_renderQueue.reset(new RenderQueue(GetPlatform().SkinName(), false, false, diff --git a/map/render_queue_routine.cpp b/map/render_queue_routine.cpp index dba00ff874..097bfd3a99 100644 --- a/map/render_queue_routine.cpp +++ b/map/render_queue_routine.cpp @@ -75,6 +75,7 @@ void RenderQueueRoutine::onSize(int w, int h) size_t texW = m_renderState->m_textureWidth; size_t texH = m_renderState->m_textureHeight; + m_newDepthBuffer.reset(); m_newDepthBuffer.reset(new yg::gl::RenderBuffer(texW, texH, true)); m_newActualTarget = m_resourceManager->createRenderTarget(texW, texH); m_newBackBuffer = m_resourceManager->createRenderTarget(texW, texH); @@ -563,7 +564,9 @@ void RenderQueueRoutine::addCommand(render_fn_t const & fn, ScreenBase const & f void RenderQueueRoutine::initializeGL(shared_ptr const & renderContext, shared_ptr const & resourceManager) { + m_frameBuffer.reset(); m_frameBuffer.reset(new yg::gl::FrameBuffer()); + m_auxFrameBuffer.reset(); m_auxFrameBuffer.reset(new yg::gl::FrameBuffer()); m_renderContext = renderContext; m_resourceManager = resourceManager; diff --git a/yg/render_state_updater.cpp b/yg/render_state_updater.cpp index 36e08eeb12..29784a26e8 100644 --- a/yg/render_state_updater.cpp +++ b/yg/render_state_updater.cpp @@ -28,7 +28,10 @@ namespace yg m_updateInterval(params.m_updateInterval) { if ((m_doPeriodicalUpdate) && (!m_auxFrameBuffer)) + { + m_auxFrameBuffer.reset(); m_auxFrameBuffer.reset(new FrameBuffer()); + } } shared_ptr const & RenderStateUpdater::renderState() const