diff --git a/iphone/Maps/Classes/EAGLView.mm b/iphone/Maps/Classes/EAGLView.mm index a51621c995..880681152d 100644 --- a/iphone/Maps/Classes/EAGLView.mm +++ b/iphone/Maps/Classes/EAGLView.mm @@ -113,22 +113,22 @@ - (void)onSize:(int)width withHeight:(int)height { - /// free old video memory - frameBuffer->resetRenderTarget(); - frameBuffer->resetDepthBuffer(); - renderBuffer.reset(); + frameBuffer->onSize(width, height); + + shared_ptr drawer = framework->GetRenderPolicy()->GetDrawer(); + + /// free old video memory + drawer->screen()->resetRenderTarget(); + drawer->screen()->resetDepthBuffer(); + renderBuffer.reset(); /// allocate the new one - renderBuffer = shared_ptr(new iphone::RenderBuffer(renderContext, (CAEAGLLayer*)self.layer)); - frameBuffer->setRenderTarget(renderBuffer); - frameBuffer->setDepthBuffer(make_shared_ptr(new yg::gl::RenderBuffer(width, height, true))); - - framework->OnSize(width, height); + renderBuffer = make_shared_ptr(new iphone::RenderBuffer(renderContext, (CAEAGLLayer*)self.layer)); -/* frameBuffer->onSize(width, height); - drawer->onSize(width, height);*/ + drawer->screen()->setRenderTarget(renderBuffer); + drawer->screen()->setDepthBuffer(make_shared_ptr(new yg::gl::RenderBuffer(width, height, true))); - shared_ptr drawer = framework->GetRenderPolicy()->GetDrawer(); + framework->OnSize(width, height); drawer->screen()->beginFrame(); drawer->screen()->clear(yg::gl::Screen::s_bgColor); diff --git a/map/queued_render_policy.cpp b/map/queued_render_policy.cpp index 4fa668612c..06cc716748 100644 --- a/map/queued_render_policy.cpp +++ b/map/queued_render_policy.cpp @@ -17,8 +17,7 @@ QueuedRenderPolicy::~QueuedRenderPolicy() delete [] m_Pipelines; - LOG(LINFO, ("resetting state")); - m_state.reset(); + LOG(LINFO, ("deleted QueuedRenderPolicy")); } bool QueuedRenderPolicy::NeedRedraw() const @@ -50,24 +49,21 @@ void QueuedRenderPolicy::EndFrame(shared_ptr const & ev, ScreenBase void QueuedRenderPolicy::DrawFrame(shared_ptr const & ev, ScreenBase const & s) { - if (!m_state) - { - m_state = ev->drawer()->screen()->createState(); - m_state->m_isDebugging = m_IsDebugging; - } + shared_ptr state = ev->drawer()->screen()->createState(); + state->m_isDebugging = m_IsDebugging; - ev->drawer()->screen()->getState(m_state.get()); + ev->drawer()->screen()->getState(state.get()); for (unsigned i = 0; i < m_PipelinesCount; ++i) { - RenderQueuedCommands(i); + RenderQueuedCommands(i, state); m_resourceManager->mergeFreeResources(); } } -void QueuedRenderPolicy::RenderQueuedCommands(int pipelineNum) +void QueuedRenderPolicy::RenderQueuedCommands(int pipelineNum, shared_ptr const & state) { - shared_ptr curState = m_state; + shared_ptr curState = state; unsigned cmdProcessed = 0; @@ -115,7 +111,7 @@ void QueuedRenderPolicy::RenderQueuedCommands(int pipelineNum) LOG(LINFO, (m_Pipelines[pipelineNum].m_Queue.Size(), "commands left")); } - m_state->apply(curState.get()); + state->apply(curState.get()); } void QueuedRenderPolicy::PacketsPipeline::FillFrameBucket(list & renderQueue, int maxFrames) diff --git a/map/queued_render_policy.hpp b/map/queued_render_policy.hpp index 0b0511efdc..5a39dfb136 100644 --- a/map/queued_render_policy.hpp +++ b/map/queued_render_policy.hpp @@ -30,13 +30,11 @@ private: bool m_IsDebugging; - shared_ptr m_state; - protected: void CopyQueuedCommands(list & l, list & r); - void RenderQueuedCommands(int pipelineNum); + void RenderQueuedCommands(int pipelineNum, shared_ptr const & state); void DismissQueuedCommands(int pipelineNum); public: diff --git a/yg/framebuffer.cpp b/yg/framebuffer.cpp index 45455174b3..0801c3499a 100644 --- a/yg/framebuffer.cpp +++ b/yg/framebuffer.cpp @@ -131,14 +131,14 @@ namespace yg GLenum res = glCheckFramebufferStatusFn(GL_FRAMEBUFFER_MWM); OGLCHECKAFTER; if (res == GL_FRAMEBUFFER_UNSUPPORTED_MWM) - LOG(LINFO, ("unsupported combination of attached target formats. could be possibly skipped")); + LOG(LINFO, ("unsupported combination of attached target formats. could be possibly skipped. id=", m_id)); else if (res == GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_MWM) - LOG(LINFO, ("incomplete attachement")); + LOG(LINFO, ("incomplete attachement. id=", m_id)); else if (res == GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_MWM) - LOG(LINFO, ("incomplete missing attachement")); + LOG(LINFO, ("incomplete missing attachement. id=", m_id)); else if (res == GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_MWM) { - LOG(LINFO, ("incomplete dimensions")); + LOG(LINFO, ("incomplete dimensions. id=", m_id)); } } } diff --git a/yg/renderer.cpp b/yg/renderer.cpp index 536fcb0749..67e5b30b4e 100644 --- a/yg/renderer.cpp +++ b/yg/renderer.cpp @@ -236,6 +236,13 @@ namespace yg } } + void Renderer::resetRenderTarget() + { + m_renderTarget.reset(); + if (!m_renderQueue) + m_frameBuffer->resetRenderTarget(); + } + shared_ptr const & Renderer::depthBuffer() const { return m_depthBuffer; @@ -249,6 +256,14 @@ namespace yg m_frameBuffer->setDepthBuffer(rt); } + void Renderer::resetDepthBuffer() + { + m_depthBuffer.reset(); + + if (!m_renderQueue) + m_frameBuffer->resetDepthBuffer(); + } + Renderer::ClearCommand::ClearCommand(yg::Color const & color, bool clearRT, float depth, diff --git a/yg/renderer.hpp b/yg/renderer.hpp index b5e1b59f49..ec544386e4 100644 --- a/yg/renderer.hpp +++ b/yg/renderer.hpp @@ -96,9 +96,11 @@ namespace yg void setRenderTarget(shared_ptr const & rt); shared_ptr const & renderTarget() const; + void resetRenderTarget(); void setDepthBuffer(shared_ptr const & rt); shared_ptr const & depthBuffer() const; + void resetDepthBuffer(); /// @param clearRT - should we clear the renderTarget data (visible pixels)? /// @param clearDepth - should we clear depthBuffer data?