diff --git a/iphone/Maps/Classes/EAGLView.mm b/iphone/Maps/Classes/EAGLView.mm index e0198acef1..122c37f716 100644 --- a/iphone/Maps/Classes/EAGLView.mm +++ b/iphone/Maps/Classes/EAGLView.mm @@ -97,8 +97,14 @@ rmParams.m_rtFormat = fmt; renderPolicy = CreateRenderPolicy(videoTimer, false, rmParams, renderContext); + + // check for error + if (renderPolicy == 0) + { + /// terminate program (though this situation is unreal :) ) + } + frameBuffer = renderPolicy->GetDrawer()->screen()->frameBuffer(); - framework->SetRenderPolicy(renderPolicy); } diff --git a/map/render_policy.cpp b/map/render_policy.cpp index 1bf64bfac1..696a6c9664 100644 --- a/map/render_policy.cpp +++ b/map/render_policy.cpp @@ -30,8 +30,7 @@ RenderPolicy::RenderPolicy(shared_ptr const & primaryRC, m_doForceUpdate(false) { yg::gl::InitExtensions(); - if (!yg::gl::CheckExtensionSupport()) - throw std::exception(); + yg::gl::CheckExtensionSupport(); } m2::RectI const RenderPolicy::OnSize(int w, int h) @@ -136,29 +135,36 @@ RenderPolicy * CreateRenderPolicy(VideoTimer * videoTimer, yg::ResourceManager::Params const & rmParams, shared_ptr const & primaryRC) { - bool benchmarkingEnabled = false; - Settings::Get("IsBenchmarking", benchmarkingEnabled); - - if (benchmarkingEnabled) + try { - bool isBenchmarkingMT = false; - Settings::Get("IsBenchmarkingMT", isBenchmarkingMT); + bool benchmarkingEnabled = false; + Settings::Get("IsBenchmarking", benchmarkingEnabled); - if (isBenchmarkingMT) - return new BenchmarkTilingRenderPolicyMT(videoTimer, useDefaultFB, rmParams, primaryRC); + if (benchmarkingEnabled) + { + bool isBenchmarkingMT = false; + Settings::Get("IsBenchmarkingMT", isBenchmarkingMT); + + if (isBenchmarkingMT) + return new BenchmarkTilingRenderPolicyMT(videoTimer, useDefaultFB, rmParams, primaryRC); + else + return new BenchmarkRenderPolicyMT(videoTimer, useDefaultFB, rmParams, primaryRC); + } else - return new BenchmarkRenderPolicyMT(videoTimer, useDefaultFB, rmParams, primaryRC); - } - else - { + { #ifdef OMIM_OS_ANDROID - return new PartialRenderPolicy(videoTimer, useDefaultFB, rmParams, primaryRC); + return new PartialRenderPolicy(videoTimer, useDefaultFB, rmParams, primaryRC); #endif #ifdef OMIM_OS_IPHONE - return new RenderPolicyMT(videoTimer, useDefaultFB, rmParams, primaryRC); + return new RenderPolicyMT(videoTimer, useDefaultFB, rmParams, primaryRC); #endif #ifdef OMIM_OS_DESKTOP - return new RenderPolicyMT(videoTimer, useDefaultFB, rmParams, primaryRC); + return new RenderPolicyMT(videoTimer, useDefaultFB, rmParams, primaryRC); #endif + } + } + catch (yg::gl::platform_unsupported const &) + { + return 0; } } diff --git a/yg/internal/opengl.cpp b/yg/internal/opengl.cpp index f3255ab67b..708cc8bc02 100644 --- a/yg/internal/opengl.cpp +++ b/yg/internal/opengl.cpp @@ -67,10 +67,10 @@ namespace yg bool g_doDeleteOnDestroy = true; - bool CheckExtensionSupport() + void CheckExtensionSupport() { - /// this functionality must be supported - return (g_isFramebufferSupported && g_isRenderbufferSupported); + if (!(g_isFramebufferSupported && g_isRenderbufferSupported)) + throw platform_unsupported(); } void LogError(char const * err, my::SrcPoint const & srcPt) diff --git a/yg/internal/opengl.hpp b/yg/internal/opengl.hpp index 6102d010a1..0dac05fdda 100644 --- a/yg/internal/opengl.hpp +++ b/yg/internal/opengl.hpp @@ -104,10 +104,14 @@ namespace yg void DumpGLInformation(); /// return false to terminate program - bool CheckExtensionSupport(); + /// @throws platform_unsupported - is the platform we are running on is unsupported. + void CheckExtensionSupport(); + + struct platform_unsupported{}; void CheckError(my::SrcPoint const & srcPt); void CheckEGLError(my::SrcPoint const & srcPt); + } } diff --git a/yg/internal/opengl_es.cpp b/yg/internal/opengl_es.cpp index 6525d403d8..b1dc07195c 100644 --- a/yg/internal/opengl_es.cpp +++ b/yg/internal/opengl_es.cpp @@ -46,7 +46,7 @@ namespace yg glMapBufferFn = &glMapBufferOES; glUnmapBufferFn = &glUnmapBufferOES; - g_isFramebufferSupported = true; + g_isFramebufferSupported = HasExtension("GL_OES_framebuffer_object"); glBindFramebufferFn = &glBindFramebufferOES; glFramebufferTexture2DFn = &glFramebufferTexture2DOES; @@ -55,7 +55,7 @@ namespace yg glDeleteFramebuffersFn = &glDeleteFramebuffersOES; glCheckFramebufferStatusFn = &glCheckFramebufferStatusOES; - g_isRenderbufferSupported = true; + g_isRenderbufferSupported = g_isFramebufferSupported; glGenRenderbuffersFn = &glGenRenderbuffersOES; glDeleteRenderbuffersFn = &glDeleteRenderbuffersOES;