Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorr.kuznetsov <r.kuznetsov@corp.mail.ru>2018-07-20 11:25:40 +0300
committerVlad Mihaylenko <vxmihaylenko@gmail.com>2018-07-20 14:51:41 +0300
commit579b08ea3a072bad7fb89cadeba796559a1b3fb2 (patch)
tree863b899d148ea2b55af03cadbc825ba0c0750ff8 /drape_frontend
parent7b43d193de785c16725e63b161461585ec38c61a (diff)
Fixed crash in set default framebuffer on some Android devices
Diffstat (limited to 'drape_frontend')
-rwxr-xr-xdrape_frontend/frontend_renderer.cpp14
-rw-r--r--drape_frontend/postprocess_renderer.cpp33
-rw-r--r--drape_frontend/postprocess_renderer.hpp4
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;