diff options
author | r.kuznetsov <r.kuznetsov@corp.mail.ru> | 2018-07-20 11:25:40 +0300 |
---|---|---|
committer | Vlad Mihaylenko <vxmihaylenko@gmail.com> | 2018-07-20 14:51:41 +0300 |
commit | 579b08ea3a072bad7fb89cadeba796559a1b3fb2 (patch) | |
tree | 863b899d148ea2b55af03cadbc825ba0c0750ff8 /drape_frontend | |
parent | 7b43d193de785c16725e63b161461585ec38c61a (diff) |
Fixed crash in set default framebuffer on some Android devices
Diffstat (limited to 'drape_frontend')
-rwxr-xr-x | drape_frontend/frontend_renderer.cpp | 14 | ||||
-rw-r--r-- | drape_frontend/postprocess_renderer.cpp | 33 | ||||
-rw-r--r-- | drape_frontend/postprocess_renderer.hpp | 4 |
3 files changed, 34 insertions, 17 deletions
diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index e3e9434de3..077e8e2eeb 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -1302,7 +1302,9 @@ void FrontendRenderer::RenderScene(ScreenBase const & modelView, bool activeFram for (auto const & arrow : m_overlayTree->GetDisplacementInfo()) dp::DebugRectRenderer::Instance().DrawArrow(modelView, arrow); } - m_postprocessRenderer->EndFrame(make_ref(m_gpuProgramManager)); + + if (!m_postprocessRenderer->EndFrame(make_ref(m_gpuProgramManager))) + return; GLFunctions::glDisable(gl_const::GLDepthTest); m_myPositionController->Render(modelView, m_currentZoomLevel, make_ref(m_gpuProgramManager), @@ -1988,7 +1990,13 @@ void FrontendRenderer::OnContextCreate() // Resources recovering. m_screenQuadRenderer = make_unique_dp<ScreenQuadRenderer>(); - m_postprocessRenderer->Init(m_apiVersion, [context]() { context->setDefaultFramebuffer(); }); + m_postprocessRenderer->Init(m_apiVersion, [context]() + { + if (!context->validate()) + return false; + context->setDefaultFramebuffer(); + return true; + }); #ifndef OMIM_OS_IPHONE_SIMULATOR if (dp::SupportManager::Instance().IsAntialiasingEnabledByDefault()) m_postprocessRenderer->SetEffectEnabled(PostprocessRenderer::Antialiasing, true); @@ -1997,7 +2005,7 @@ void FrontendRenderer::OnContextCreate() m_buildingsFramebuffer = make_unique_dp<dp::Framebuffer>(gl_const::GLRGBA, false /* stencilEnabled */); m_buildingsFramebuffer->SetFramebufferFallback([this]() { - m_postprocessRenderer->OnFramebufferFallback(); + return m_postprocessRenderer->OnFramebufferFallback(); }); m_transitBackground = make_unique_dp<ScreenQuadRenderer>(); diff --git a/drape_frontend/postprocess_renderer.cpp b/drape_frontend/postprocess_renderer.cpp index b0666d1387..ec0012e338 100644 --- a/drape_frontend/postprocess_renderer.cpp +++ b/drape_frontend/postprocess_renderer.cpp @@ -307,8 +307,8 @@ bool PostprocessRenderer::BeginFrame(bool activeFrame) { if (!IsEnabled()) { - m_framebufferFallback(); - return true; + CHECK(m_framebufferFallback != nullptr, ()); + return m_framebufferFallback(); } m_frameStarted = activeFrame || !m_isMainFramebufferRendered; @@ -322,10 +322,10 @@ bool PostprocessRenderer::BeginFrame(bool activeFrame) return m_frameStarted; } -void PostprocessRenderer::EndFrame(ref_ptr<gpu::ProgramManager> gpuProgramManager) +bool PostprocessRenderer::EndFrame(ref_ptr<gpu::ProgramManager> gpuProgramManager) { if (!IsEnabled()) - return; + return true; // Subpixel Morphological Antialiasing (SMAA). if (m_frameStarted && CanRenderAntialiasing()) @@ -391,12 +391,18 @@ void PostprocessRenderer::EndFrame(ref_ptr<gpu::ProgramManager> gpuProgramManage else finalFramebuffer = make_ref(m_mainFramebuffer); - m_framebufferFallback(); - ASSERT(dynamic_cast<DefaultScreenQuadContext *>(m_defaultScreenQuadContext.get()) != nullptr, ()); - auto context = static_cast<DefaultScreenQuadContext *>(m_defaultScreenQuadContext.get()); - context->SetParams(finalFramebuffer->GetTextureId()); - m_screenQuadRenderer->Render(gpuProgramManager, make_ref(m_defaultScreenQuadContext)); + CHECK(m_framebufferFallback != nullptr, ()); + bool m_wasRendered = false; + if (m_framebufferFallback()) + { + ASSERT(dynamic_cast<DefaultScreenQuadContext *>(m_defaultScreenQuadContext.get()) != nullptr, ()); + auto context = static_cast<DefaultScreenQuadContext *>(m_defaultScreenQuadContext.get()); + context->SetParams(finalFramebuffer->GetTextureId()); + m_screenQuadRenderer->Render(gpuProgramManager, make_ref(m_defaultScreenQuadContext)); + m_wasRendered = true; + } m_frameStarted = false; + return m_wasRendered; } void PostprocessRenderer::EnableWritingToStencil() const @@ -443,12 +449,15 @@ void PostprocessRenderer::UpdateFramebuffers(uint32_t width, uint32_t height) } } -void PostprocessRenderer::OnFramebufferFallback() +bool PostprocessRenderer::OnFramebufferFallback() { if (m_frameStarted) + { m_mainFramebuffer->Enable(); - else - m_framebufferFallback(); + return true; + } + + return m_framebufferFallback(); } void PostprocessRenderer::OnChangedRouteFollowingMode(bool isRouteFollowingActive) diff --git a/drape_frontend/postprocess_renderer.hpp b/drape_frontend/postprocess_renderer.hpp index 8c9be8f1c9..e78baa07b8 100644 --- a/drape_frontend/postprocess_renderer.hpp +++ b/drape_frontend/postprocess_renderer.hpp @@ -47,11 +47,11 @@ public: void SetEffectEnabled(Effect effect, bool enabled); bool IsEffectEnabled(Effect effect) const; - void OnFramebufferFallback(); + bool OnFramebufferFallback(); void OnChangedRouteFollowingMode(bool isRouteFollowingActive); bool BeginFrame(bool activeFrame); - void EndFrame(ref_ptr<gpu::ProgramManager> gpuProgramManager); + bool EndFrame(ref_ptr<gpu::ProgramManager> gpuProgramManager); void EnableWritingToStencil() const; void DisableWritingToStencil() const; |