From c2616bbdb630f4096c05b774b6f38573f75a4f29 Mon Sep 17 00:00:00 2001 From: rachytski Date: Sat, 26 Nov 2011 16:28:57 +0400 Subject: [PATCH] refactored RenderPolicy and OpenGL extensions initialization. --- android/jni/com/mapswithme/maps/Framework.cpp | 18 +++---- iphone/Maps/Classes/EAGLView.mm | 9 ++-- map/render_policy.cpp | 37 ++++++------- qt/draw_widget.cpp | 14 +++-- qt_tstfrm/tstwidgets.cpp | 11 ++-- yg/internal/opengl.cpp | 19 ++++++- yg/internal/opengl.hpp | 9 +++- yg/internal/opengl_ext.cpp | 53 ++++++++----------- 8 files changed, 92 insertions(+), 78 deletions(-) diff --git a/android/jni/com/mapswithme/maps/Framework.cpp b/android/jni/com/mapswithme/maps/Framework.cpp index e19ca66818..9786fcbaed 100644 --- a/android/jni/com/mapswithme/maps/Framework.cpp +++ b/android/jni/com/mapswithme/maps/Framework.cpp @@ -71,19 +71,19 @@ namespace android rmParams.m_videoMemoryLimit = 15 * 1024 * 1024; rmParams.m_rtFormat = yg::Rt8Bpp; - RenderPolicy * renderPolicy = new PartialRenderPolicy(m_videoTimer, - true, - rmParams, - make_shared_ptr(new android::RenderContext())); - - if (renderPolicy == 0) + try { - LOG(LINFO, ("No Render Policy is created")); + m_work.SetRenderPolicy(CreateRenderPolicy(m_videoTimer, + true, + rmParams, + make_shared_ptr(new android::RenderContext()))); + } + catch (yg::gl::platform_unsupported const & e) + { + LOG(LINFO, ("this android platform is unsupported, reason=", e.what())); return false; } - m_work.SetRenderPolicy(renderPolicy); - m_work.SetUpdatesEnabled(true); LOG(LDEBUG, ("AF::InitRenderer 3")); diff --git a/iphone/Maps/Classes/EAGLView.mm b/iphone/Maps/Classes/EAGLView.mm index 122c37f716..02ba2dbb06 100644 --- a/iphone/Maps/Classes/EAGLView.mm +++ b/iphone/Maps/Classes/EAGLView.mm @@ -96,10 +96,11 @@ rmParams.m_videoMemoryLimit = GetPlatform().VideoMemoryLimit(); rmParams.m_rtFormat = fmt; - renderPolicy = CreateRenderPolicy(videoTimer, false, rmParams, renderContext); - - // check for error - if (renderPolicy == 0) + try + { + renderPolicy = CreateRenderPolicy(videoTimer, false, rmParams, renderContext); + } + catch (yg::gl::platform_unsupported const & ) { /// terminate program (though this situation is unreal :) ) } diff --git a/map/render_policy.cpp b/map/render_policy.cpp index 696a6c9664..5abfd24db3 100644 --- a/map/render_policy.cpp +++ b/map/render_policy.cpp @@ -135,36 +135,29 @@ RenderPolicy * CreateRenderPolicy(VideoTimer * videoTimer, yg::ResourceManager::Params const & rmParams, shared_ptr const & primaryRC) { - try + bool benchmarkingEnabled = false; + Settings::Get("IsBenchmarking", benchmarkingEnabled); + + if (benchmarkingEnabled) { - bool benchmarkingEnabled = false; - Settings::Get("IsBenchmarking", benchmarkingEnabled); + bool isBenchmarkingMT = false; + Settings::Get("IsBenchmarkingMT", isBenchmarkingMT); - 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); - } + if (isBenchmarkingMT) + return new BenchmarkTilingRenderPolicyMT(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/qt/draw_widget.cpp b/qt/draw_widget.cpp index a60ea068ae..09b34da627 100644 --- a/qt/draw_widget.cpp +++ b/qt/draw_widget.cpp @@ -195,10 +195,6 @@ namespace qt void DrawWidget::initializeGL() { -#ifdef OMIM_OS_WINDOWS - win32::InitOpenGL(); -#endif - /// we'll perform swap by ourselves, see issue #333 setAutoBufferSwap(false); @@ -212,7 +208,15 @@ namespace qt rmParams.m_rtFormat = yg::Rt8Bpp; rmParams.m_videoMemoryLimit = GetPlatform().VideoMemoryLimit(); - m_framework->SetRenderPolicy(CreateRenderPolicy(m_videoTimer.get(), true, rmParams, primaryRC)); + try + { + m_framework->SetRenderPolicy(CreateRenderPolicy(m_videoTimer.get(), true, rmParams, primaryRC)); + } + catch (yg::gl::platform_unsupported const & e) + { + LOG(LERROR, ("OpenGL platform is unsupported, reason: ", e.what())); + /// TODO: Show "Please Update Drivers" dialog and close the program. + } m_isInitialized = true; } diff --git a/qt_tstfrm/tstwidgets.cpp b/qt_tstfrm/tstwidgets.cpp index 01e1ae7b39..571237aeb1 100644 --- a/qt_tstfrm/tstwidgets.cpp +++ b/qt_tstfrm/tstwidgets.cpp @@ -31,11 +31,12 @@ GLDrawWidget::~GLDrawWidget() void GLDrawWidget::initializeGL() { -#ifdef OMIM_OS_WINDOWS - win32::InitOpenGL(); -#endif - - if (!yg::gl::CheckExtensionSupport()) + try + { + yg::gl::InitExtensions(); + yg::gl::CheckExtensionSupport(); + } + catch (yg::gl::platform_unsupported & e) { /// TODO: Show "Please Update Drivers" dialog and close the program. } diff --git a/yg/internal/opengl.cpp b/yg/internal/opengl.cpp index 708cc8bc02..12ce50f0fd 100644 --- a/yg/internal/opengl.cpp +++ b/yg/internal/opengl.cpp @@ -12,6 +12,18 @@ namespace yg { namespace gl { + platform_unsupported::platform_unsupported(char const * reason) + : m_reason(reason) + {} + + platform_unsupported::~platform_unsupported() throw() + {} + + char const * platform_unsupported::what() const throw() + { + return m_reason.c_str(); + } + bool HasExtension(const char *name) { string allExtensions(reinterpret_cast(glGetString(GL_EXTENSIONS))); @@ -69,8 +81,11 @@ namespace yg void CheckExtensionSupport() { - if (!(g_isFramebufferSupported && g_isRenderbufferSupported)) - throw platform_unsupported(); + if (!g_isFramebufferSupported) + throw platform_unsupported("no framebuffer support"); + + if (!g_isRenderbufferSupported) + throw platform_unsupported("no renderbuffer support"); } void LogError(char const * err, my::SrcPoint const & srcPt) diff --git a/yg/internal/opengl.hpp b/yg/internal/opengl.hpp index 0dac05fdda..cf946c6fc0 100644 --- a/yg/internal/opengl.hpp +++ b/yg/internal/opengl.hpp @@ -33,6 +33,7 @@ #endif #include "../../base/src_point.hpp" +#include "../../std/exception.hpp" namespace yg { @@ -107,7 +108,13 @@ namespace yg /// @throws platform_unsupported - is the platform we are running on is unsupported. void CheckExtensionSupport(); - struct platform_unsupported{}; + struct platform_unsupported : public exception + { + string m_reason; + const char * what() const throw(); + platform_unsupported(char const * reason); + ~platform_unsupported() throw(); + }; void CheckError(my::SrcPoint const & srcPt); void CheckEGLError(my::SrcPoint const & srcPt); diff --git a/yg/internal/opengl_ext.cpp b/yg/internal/opengl_ext.cpp index 96e4280f01..38e907ca7c 100644 --- a/yg/internal/opengl_ext.cpp +++ b/yg/internal/opengl_ext.cpp @@ -27,43 +27,36 @@ namespace yg const int GL_WRITE_ONLY_MWM = GL_WRITE_ONLY; - void InitExtensions(bool once) + void InitExtensions() { - static bool isInitialized = false; + DumpGLInformation(); - if ((!once) || (!isInitialized)) - { - DumpGLInformation(); + g_isBufferObjectsSupported = HasExtension("GL_ARB_vertex_buffer_object") + || HasExtension("GLX_ARB_vertex_buffer_object"); - g_isBufferObjectsSupported = HasExtension("GL_ARB_vertex_buffer_object") - || HasExtension("GLX_ARB_vertex_buffer_object"); + glBindBufferFn = &glBindBuffer; + glGenBuffersFn = &glGenBuffers; + glBufferDataFn = &glBufferData; + glBufferSubDataFn = &glBufferSubData; + glDeleteBuffersFn = &glDeleteBuffers; + glMapBufferFn = &glMapBuffer; + glUnmapBufferFn = &glUnmapBuffer; - glBindBufferFn = &glBindBuffer; - glGenBuffersFn = &glGenBuffers; - glBufferDataFn = &glBufferData; - glBufferSubDataFn = &glBufferSubData; - glDeleteBuffersFn = &glDeleteBuffers; - glMapBufferFn = &glMapBuffer; - glUnmapBufferFn = &glUnmapBuffer; + g_isFramebufferSupported = HasExtension("GL_ARB_framebuffer_object"); - g_isFramebufferSupported = HasExtension("GL_ARB_framebuffer_object"); + glBindFramebufferFn = &glBindFramebufferEXT; + glFramebufferTexture2DFn = &glFramebufferTexture2DEXT; + glFramebufferRenderbufferFn = &glFramebufferRenderbufferEXT; + glGenFramebuffersFn = &glGenFramebuffersEXT; + glDeleteFramebuffersFn = &glDeleteFramebuffersEXT; + glCheckFramebufferStatusFn = &glCheckFramebufferStatusEXT; - glBindFramebufferFn = &glBindFramebufferEXT; - glFramebufferTexture2DFn = &glFramebufferTexture2DEXT; - glFramebufferRenderbufferFn = &glFramebufferRenderbufferEXT; - glGenFramebuffersFn = &glGenFramebuffersEXT; - glDeleteFramebuffersFn = &glDeleteFramebuffersEXT; - glCheckFramebufferStatusFn = &glCheckFramebufferStatusEXT; + g_isRenderbufferSupported = g_isFramebufferSupported; - g_isRenderbufferSupported = g_isFramebufferSupported; - - glGenRenderbuffersFn = &glGenRenderbuffersEXT; - glDeleteRenderbuffersFn = &glDeleteRenderbuffersEXT; - glBindRenderbufferFn = &glBindRenderbufferEXT; - glRenderbufferStorageFn = &glRenderbufferStorageEXT; - - isInitialized = true; - } + glGenRenderbuffersFn = &glGenRenderbuffersEXT; + glDeleteRenderbuffersFn = &glDeleteRenderbuffersEXT; + glBindRenderbufferFn = &glBindRenderbufferEXT; + glRenderbufferStorageFn = &glRenderbufferStorageEXT; } } }