diff --git a/android/jni/com/mapswithme/opengl/androidoglcontext.cpp b/android/jni/com/mapswithme/opengl/androidoglcontext.cpp index e80133df4f..913bf1eca2 100644 --- a/android/jni/com/mapswithme/opengl/androidoglcontext.cpp +++ b/android/jni/com/mapswithme/opengl/androidoglcontext.cpp @@ -81,6 +81,8 @@ void AndroidOGLContext::setPresentAvailable(bool available) bool AndroidOGLContext::validate() { + if (!m_presentAvailable) + return false; return eglGetCurrentDisplay() != EGL_NO_DISPLAY && eglGetCurrentSurface(EGL_DRAW) != EGL_NO_SURFACE && eglGetCurrentContext() != EGL_NO_CONTEXT; diff --git a/drape/framebuffer.hpp b/drape/framebuffer.hpp index 96a95c2dcb..bc274557fb 100644 --- a/drape/framebuffer.hpp +++ b/drape/framebuffer.hpp @@ -7,7 +7,7 @@ namespace dp { -using FramebufferFallback = std::function; +using FramebufferFallback = std::function; class Framebuffer { 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(); - 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(gl_const::GLRGBA, false /* stencilEnabled */); m_buildingsFramebuffer->SetFramebufferFallback([this]() { - m_postprocessRenderer->OnFramebufferFallback(); + return m_postprocessRenderer->OnFramebufferFallback(); }); m_transitBackground = make_unique_dp(); 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 gpuProgramManager) +bool PostprocessRenderer::EndFrame(ref_ptr gpuProgramManager) { if (!IsEnabled()) - return; + return true; // Subpixel Morphological Antialiasing (SMAA). if (m_frameStarted && CanRenderAntialiasing()) @@ -391,12 +391,18 @@ void PostprocessRenderer::EndFrame(ref_ptr gpuProgramManage else finalFramebuffer = make_ref(m_mainFramebuffer); - m_framebufferFallback(); - ASSERT(dynamic_cast(m_defaultScreenQuadContext.get()) != nullptr, ()); - auto context = static_cast(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(m_defaultScreenQuadContext.get()) != nullptr, ()); + auto context = static_cast(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 gpuProgramManager); + bool EndFrame(ref_ptr gpuProgramManager); void EnableWritingToStencil() const; void DisableWritingToStencil() const;