From efa524931836e5e0b65adc301de7fb157dbadb54 Mon Sep 17 00:00:00 2001 From: rachytski Date: Sat, 26 Nov 2011 02:37:24 +0400 Subject: [PATCH] refactored OpenGL extensions initialization. --- iphone/Maps/Classes/EAGLView.mm | 10 +-- map/benchmark_render_policy_mt.cpp | 4 +- map/benchmark_render_policy_mt.hpp | 2 +- map/benchmark_tiling_render_policy_mt.cpp | 4 +- map/benchmark_tiling_render_policy_mt.hpp | 2 +- map/partial_render_policy.cpp | 5 +- map/partial_render_policy.hpp | 2 +- map/render_policy.cpp | 20 +++-- map/render_policy.hpp | 2 +- map/render_policy_mt.cpp | 5 +- map/render_policy_mt.hpp | 2 +- map/render_policy_st.cpp | 5 +- map/render_policy_st.hpp | 2 +- map/tiling_render_policy_mt.cpp | 5 +- map/tiling_render_policy_mt.hpp | 2 +- map/tiling_render_policy_st.cpp | 5 +- map/tiling_render_policy_st.hpp | 2 +- qt/draw_widget.cpp | 5 +- yg/base_texture.cpp | 7 +- yg/framebuffer.cpp | 61 ++++----------- yg/indexbuffer.cpp | 23 ++---- yg/internal/gl_procedures.inl | 39 +++++----- yg/internal/opengl.cpp | 53 ++++++++++++- yg/internal/opengl.hpp | 68 ++++++++++++++--- yg/internal/opengl_es.cpp | 66 ++++++++++++++++ yg/internal/opengl_ext.cpp | 70 +++++++++++++++++ yg/internal/opengl_win32.cpp | 91 ++++++++++++----------- yg/internal/opengl_win32.hpp | 32 -------- yg/renderbuffer.cpp | 69 +++++------------ yg/vertexbuffer.cpp | 27 +++---- yg/yg.pro | 11 ++- 31 files changed, 415 insertions(+), 286 deletions(-) create mode 100644 yg/internal/opengl_es.cpp create mode 100644 yg/internal/opengl_ext.cpp diff --git a/iphone/Maps/Classes/EAGLView.mm b/iphone/Maps/Classes/EAGLView.mm index 002902f9d4..e0198acef1 100644 --- a/iphone/Maps/Classes/EAGLView.mm +++ b/iphone/Maps/Classes/EAGLView.mm @@ -81,18 +81,11 @@ - (void)initRenderPolicy { - frameBuffer = shared_ptr(new yg::gl::FrameBuffer()); - - NSLog(@"Vendor: %s, Renderer: %s", glGetString(GL_VENDOR), glGetString(GL_RENDERER)); - // to avoid grid bug on 3G device yg::RtFormat fmt = yg::Rt4Bpp; if ([[NSString stringWithFormat:@"%s", glGetString(GL_RENDERER)] hasPrefix:@"PowerVR MBX"]) fmt = yg::Rt8Bpp; - DrawerYG::params_t p; - p.m_frameBuffer = frameBuffer; - typedef void (*drawFrameFn)(id, SEL); SEL drawFrameSel = @selector(drawFrame); drawFrameFn drawFrameImpl = (drawFrameFn)[self methodForSelector:drawFrameSel]; @@ -103,7 +96,8 @@ rmParams.m_videoMemoryLimit = GetPlatform().VideoMemoryLimit(); rmParams.m_rtFormat = fmt; - renderPolicy = CreateRenderPolicy(videoTimer, p, rmParams, renderContext); + renderPolicy = CreateRenderPolicy(videoTimer, false, rmParams, renderContext); + frameBuffer = renderPolicy->GetDrawer()->screen()->frameBuffer(); framework->SetRenderPolicy(renderPolicy); } diff --git a/map/benchmark_render_policy_mt.cpp b/map/benchmark_render_policy_mt.cpp index 3d697b1fbc..d5ffa1b6af 100644 --- a/map/benchmark_render_policy_mt.cpp +++ b/map/benchmark_render_policy_mt.cpp @@ -5,10 +5,10 @@ #include "../base/logging.hpp" BenchmarkRenderPolicyMT::BenchmarkRenderPolicyMT(VideoTimer * videoTimer, - DrawerYG::Params const & params, + bool useDefaultFB, yg::ResourceManager::Params const & rmParams, shared_ptr const & primaryRC) - : RenderPolicyMT(videoTimer, params, rmParams, primaryRC) + : RenderPolicyMT(videoTimer, useDefaultFB, rmParams, primaryRC) {} void BenchmarkRenderPolicyMT::DrawFrame(shared_ptr const & e, diff --git a/map/benchmark_render_policy_mt.hpp b/map/benchmark_render_policy_mt.hpp index a27f941177..487943e160 100644 --- a/map/benchmark_render_policy_mt.hpp +++ b/map/benchmark_render_policy_mt.hpp @@ -6,7 +6,7 @@ class BenchmarkRenderPolicyMT : public RenderPolicyMT { public: BenchmarkRenderPolicyMT(VideoTimer * videoTimer, - DrawerYG::Params const & params, + bool useDefaultFB, yg::ResourceManager::Params const & rmParams, shared_ptr const & primaryRC); diff --git a/map/benchmark_tiling_render_policy_mt.cpp b/map/benchmark_tiling_render_policy_mt.cpp index 7d34a60cb9..4d07586601 100644 --- a/map/benchmark_tiling_render_policy_mt.cpp +++ b/map/benchmark_tiling_render_policy_mt.cpp @@ -3,10 +3,10 @@ BenchmarkTilingRenderPolicyMT::BenchmarkTilingRenderPolicyMT( VideoTimer * videoTimer, - DrawerYG::Params const & params, + bool useDefaultFB, yg::ResourceManager::Params const & rmParams, shared_ptr const & primaryRC) - : TilingRenderPolicyMT(videoTimer, params, rmParams, primaryRC) + : TilingRenderPolicyMT(videoTimer, useDefaultFB, rmParams, primaryRC) {} void BenchmarkTilingRenderPolicyMT::DrawFrame(shared_ptr const & e, diff --git a/map/benchmark_tiling_render_policy_mt.hpp b/map/benchmark_tiling_render_policy_mt.hpp index 486789b819..7e804f4d2e 100644 --- a/map/benchmark_tiling_render_policy_mt.hpp +++ b/map/benchmark_tiling_render_policy_mt.hpp @@ -7,7 +7,7 @@ class BenchmarkTilingRenderPolicyMT : public TilingRenderPolicyMT public: BenchmarkTilingRenderPolicyMT(VideoTimer * videoTimer, - DrawerYG::Params const & params, + bool useDefaultFB, yg::ResourceManager::Params const & rmParams, shared_ptr const & primaryRC); diff --git a/map/partial_render_policy.cpp b/map/partial_render_policy.cpp index 4fbf103556..8749831c90 100644 --- a/map/partial_render_policy.cpp +++ b/map/partial_render_policy.cpp @@ -14,7 +14,7 @@ #include "../std/bind.hpp" PartialRenderPolicy::PartialRenderPolicy(VideoTimer * videoTimer, - DrawerYG::Params const & params, + bool useDefaultFB, yg::ResourceManager::Params const & rmParams, shared_ptr const & primaryRC) : RenderPolicy(primaryRC, false), @@ -100,8 +100,9 @@ PartialRenderPolicy::PartialRenderPolicy(VideoTimer * videoTimer, GetPlatform().GetFontNames(fonts); m_resourceManager->addFonts(fonts); - DrawerYG::params_t p = params; + DrawerYG::params_t p; + p.m_frameBuffer = make_shared_ptr(new yg::gl::FrameBuffer(useDefaultFB)); p.m_resourceManager = m_resourceManager; p.m_dynamicPagesCount = 2; p.m_textPagesCount = 2; diff --git a/map/partial_render_policy.hpp b/map/partial_render_policy.hpp index f4a3ea902e..705eb3ad67 100644 --- a/map/partial_render_policy.hpp +++ b/map/partial_render_policy.hpp @@ -32,7 +32,7 @@ private: public: PartialRenderPolicy(VideoTimer * videoTimer, - DrawerYG::Params const & params, + bool useDefaultFB, yg::ResourceManager::Params const & rmParams, shared_ptr const & primaryRC); diff --git a/map/render_policy.cpp b/map/render_policy.cpp index 72d06d4da9..1bf64bfac1 100644 --- a/map/render_policy.cpp +++ b/map/render_policy.cpp @@ -12,6 +12,8 @@ #include "../map/benchmark_render_policy_mt.hpp" #include "../map/benchmark_tiling_render_policy_mt.hpp" +#include "../yg/internal/opengl.hpp" + #include "../platform/video_timer.hpp" #include "../platform/settings.hpp" @@ -26,7 +28,11 @@ RenderPolicy::RenderPolicy(shared_ptr const & primaryRC, m_primaryRC(primaryRC), m_doSupportRotation(doSupportRotation), m_doForceUpdate(false) -{} +{ + yg::gl::InitExtensions(); + if (!yg::gl::CheckExtensionSupport()) + throw std::exception(); +} m2::RectI const RenderPolicy::OnSize(int w, int h) { @@ -126,7 +132,7 @@ void RenderPolicy::SetForceUpdate(bool flag) } RenderPolicy * CreateRenderPolicy(VideoTimer * videoTimer, - DrawerYG::Params const & params, + bool useDefaultFB, yg::ResourceManager::Params const & rmParams, shared_ptr const & primaryRC) { @@ -139,20 +145,20 @@ RenderPolicy * CreateRenderPolicy(VideoTimer * videoTimer, Settings::Get("IsBenchmarkingMT", isBenchmarkingMT); if (isBenchmarkingMT) - return new BenchmarkTilingRenderPolicyMT(videoTimer, params, rmParams, primaryRC); + return new BenchmarkTilingRenderPolicyMT(videoTimer, useDefaultFB, rmParams, primaryRC); else - return new BenchmarkRenderPolicyMT(videoTimer, params, rmParams, primaryRC); + return new BenchmarkRenderPolicyMT(videoTimer, useDefaultFB, rmParams, primaryRC); } else { #ifdef OMIM_OS_ANDROID - return new PartialRenderPolicy(videoTimer, params, rmParams, primaryRC); + return new PartialRenderPolicy(videoTimer, useDefaultFB, rmParams, primaryRC); #endif #ifdef OMIM_OS_IPHONE - return new RenderPolicyMT(videoTimer, params, rmParams, primaryRC); + return new RenderPolicyMT(videoTimer, useDefaultFB, rmParams, primaryRC); #endif #ifdef OMIM_OS_DESKTOP - return new RenderPolicyMT(videoTimer, params, rmParams, primaryRC); + return new RenderPolicyMT(videoTimer, useDefaultFB, rmParams, primaryRC); #endif } } diff --git a/map/render_policy.hpp b/map/render_policy.hpp index 7303b1c76b..bc1ec71c3f 100644 --- a/map/render_policy.hpp +++ b/map/render_policy.hpp @@ -92,7 +92,7 @@ public: }; RenderPolicy * CreateRenderPolicy(VideoTimer * videoTimer, - DrawerYG::Params const & params, + bool useDefaultFB, yg::ResourceManager::Params const & rmParams, shared_ptr const & primaryRC); diff --git a/map/render_policy_mt.cpp b/map/render_policy_mt.cpp index 087fd0e93f..3b037954a8 100644 --- a/map/render_policy_mt.cpp +++ b/map/render_policy_mt.cpp @@ -14,7 +14,7 @@ #include "../platform/platform.hpp" RenderPolicyMT::RenderPolicyMT(VideoTimer * videoTimer, - DrawerYG::Params const & params, + bool useDefaultFB, yg::ResourceManager::Params const & rmParams, shared_ptr const & primaryRC) : RenderPolicy(primaryRC, false), @@ -100,8 +100,9 @@ RenderPolicyMT::RenderPolicyMT(VideoTimer * videoTimer, GetPlatform().GetFontNames(fonts); m_resourceManager->addFonts(fonts); - DrawerYG::params_t p = params; + DrawerYG::params_t p; + p.m_frameBuffer = make_shared_ptr(new yg::gl::FrameBuffer(useDefaultFB)); p.m_resourceManager = m_resourceManager; p.m_dynamicPagesCount = 2; p.m_textPagesCount = 2; diff --git a/map/render_policy_mt.hpp b/map/render_policy_mt.hpp index abe5ca738a..3a77a465dc 100644 --- a/map/render_policy_mt.hpp +++ b/map/render_policy_mt.hpp @@ -20,7 +20,7 @@ protected: public: RenderPolicyMT(VideoTimer * videoTimer, - DrawerYG::Params const & params, + bool useDefaultFB, yg::ResourceManager::Params const & rmParams, shared_ptr const & primaryRC); diff --git a/map/render_policy_st.cpp b/map/render_policy_st.cpp index 04cf16aece..ec7b56337b 100644 --- a/map/render_policy_st.cpp +++ b/map/render_policy_st.cpp @@ -13,7 +13,7 @@ #include "../platform/platform.hpp" RenderPolicyST::RenderPolicyST(VideoTimer * videoTimer, - DrawerYG::Params const & params, + bool useDefaultFB, yg::ResourceManager::Params const & rmParams, shared_ptr const & primaryRC) : RenderPolicy(primaryRC, false) @@ -87,8 +87,9 @@ RenderPolicyST::RenderPolicyST(VideoTimer * videoTimer, GetPlatform().GetFontNames(fonts); m_resourceManager->addFonts(fonts); - DrawerYG::params_t p = params; + DrawerYG::params_t p; + p.m_frameBuffer = make_shared_ptr(new yg::gl::FrameBuffer(useDefaultFB)); p.m_resourceManager = m_resourceManager; p.m_dynamicPagesCount = 2; p.m_textPagesCount = 2; diff --git a/map/render_policy_st.hpp b/map/render_policy_st.hpp index cf8edf6f06..0c081b3d36 100644 --- a/map/render_policy_st.hpp +++ b/map/render_policy_st.hpp @@ -9,7 +9,7 @@ class RenderPolicyST : public RenderPolicy { public: RenderPolicyST(VideoTimer * videoTimer, - DrawerYG::Params const & params, + bool useDefaultFB, yg::ResourceManager::Params const & rmParams, shared_ptr const & primaryRC); diff --git a/map/tiling_render_policy_mt.cpp b/map/tiling_render_policy_mt.cpp index b66e3927c3..06f99f3131 100644 --- a/map/tiling_render_policy_mt.cpp +++ b/map/tiling_render_policy_mt.cpp @@ -15,7 +15,7 @@ #include "screen_coverage.hpp" TilingRenderPolicyMT::TilingRenderPolicyMT(VideoTimer * videoTimer, - DrawerYG::Params const & params, + bool useDefaultFB, yg::ResourceManager::Params const & rmParams, shared_ptr const & primaryRC) : RenderPolicy(primaryRC, true) @@ -128,8 +128,9 @@ TilingRenderPolicyMT::TilingRenderPolicyMT(VideoTimer * videoTimer, GetPlatform().GetFontNames(fonts); m_resourceManager->addFonts(fonts); - DrawerYG::params_t p = params; + DrawerYG::params_t p; + p.m_frameBuffer = make_shared_ptr(new yg::gl::FrameBuffer(useDefaultFB)); p.m_resourceManager = m_resourceManager; p.m_dynamicPagesCount = 2; p.m_textPagesCount = 2; diff --git a/map/tiling_render_policy_mt.hpp b/map/tiling_render_policy_mt.hpp index 0db53c0961..e9395eb065 100644 --- a/map/tiling_render_policy_mt.hpp +++ b/map/tiling_render_policy_mt.hpp @@ -41,7 +41,7 @@ protected: public: TilingRenderPolicyMT(VideoTimer * videoTimer, - DrawerYG::Params const & params, + bool useDefaultFB, yg::ResourceManager::Params const & rmParams, shared_ptr const & primaryRC); diff --git a/map/tiling_render_policy_st.cpp b/map/tiling_render_policy_st.cpp index 1241357302..49a9269375 100644 --- a/map/tiling_render_policy_st.cpp +++ b/map/tiling_render_policy_st.cpp @@ -15,7 +15,7 @@ #include "../platform/platform.hpp" TilingRenderPolicyST::TilingRenderPolicyST(VideoTimer * videoTimer, - DrawerYG::Params const & params, + bool useDefaultFB, yg::ResourceManager::Params const & rmParams, shared_ptr const & primaryRC) : RenderPolicy(primaryRC, true), @@ -121,8 +121,9 @@ TilingRenderPolicyST::TilingRenderPolicyST(VideoTimer * videoTimer, GetPlatform().GetFontNames(fonts); m_resourceManager->addFonts(fonts); - DrawerYG::params_t p = params; + DrawerYG::params_t p; + p.m_frameBuffer = make_shared_ptr(new yg::gl::FrameBuffer(useDefaultFB)); p.m_resourceManager = m_resourceManager; p.m_dynamicPagesCount = 2; p.m_textPagesCount = 2; diff --git a/map/tiling_render_policy_st.hpp b/map/tiling_render_policy_st.hpp index d5bab9752f..bb954a7100 100644 --- a/map/tiling_render_policy_st.hpp +++ b/map/tiling_render_policy_st.hpp @@ -37,7 +37,7 @@ private: public: TilingRenderPolicyST(VideoTimer * videoTimer, - DrawerYG::Params const & params, + bool useDefaultFB, yg::ResourceManager::Params const & rmParams, shared_ptr const & primaryRC); diff --git a/qt/draw_widget.cpp b/qt/draw_widget.cpp index 9476063ca7..a60ea068ae 100644 --- a/qt/draw_widget.cpp +++ b/qt/draw_widget.cpp @@ -206,16 +206,13 @@ namespace qt { m_videoTimer.reset(CreateVideoTimer()); - DrawerYG::Params params; - params.m_frameBuffer = make_shared_ptr(new yg::gl::FrameBuffer(true)); - shared_ptr primaryRC(new qt::gl::RenderContext(this)); yg::ResourceManager::Params rmParams; rmParams.m_rtFormat = yg::Rt8Bpp; rmParams.m_videoMemoryLimit = GetPlatform().VideoMemoryLimit(); - m_framework->SetRenderPolicy(CreateRenderPolicy(m_videoTimer.get(), params, rmParams, primaryRC)); + m_framework->SetRenderPolicy(CreateRenderPolicy(m_videoTimer.get(), true, rmParams, primaryRC)); m_isInitialized = true; } diff --git a/yg/base_texture.cpp b/yg/base_texture.cpp index 122c5aef4b..a832e33fe8 100644 --- a/yg/base_texture.cpp +++ b/yg/base_texture.cpp @@ -61,11 +61,8 @@ namespace yg void BaseTexture::attachToFrameBuffer() { checkID(); -#ifdef OMIM_GL_ES - OGLCHECK(glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, id(), 0)); -#else - OGLCHECK(glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, id(), 0)); -#endif + OGLCHECK(glFramebufferTexture2DFn(GL_FRAMEBUFFER_MWM, + GL_COLOR_ATTACHMENT0_MWM, GL_TEXTURE_2D, id(), 0)); utils::setupCoordinates(width(), height(), false); } diff --git a/yg/framebuffer.cpp b/yg/framebuffer.cpp index 58d548fd3a..a1416928d9 100644 --- a/yg/framebuffer.cpp +++ b/yg/framebuffer.cpp @@ -17,11 +17,7 @@ namespace yg unsigned FrameBuffer::current() { int id; -#ifdef OMIM_GL_ES - OGLCHECK(glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &id)); -#else - OGLCHECK(glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &id)); -#endif + OGLCHECK(glGetIntegerv(GL_FRAMEBUFFER_BINDING_MWM, &id)); return id; } @@ -30,25 +26,13 @@ namespace yg if (defaultFB) m_id = 0; else - { -#ifdef OMIM_GL_ES - OGLCHECK(glGenFramebuffersOES(1, &m_id)); -#else - OGLCHECK(glGenFramebuffers(1, &m_id)); -#endif - } + OGLCHECK(glGenFramebuffersFn(1, &m_id)); } FrameBuffer::~FrameBuffer() { if ((m_id != 0) && g_doDeleteOnDestroy) - { -#ifdef OMIM_GL_ES - OGLCHECK(glDeleteFramebuffersOES(1, &m_id)); -#else - OGLCHECK(glDeleteFramebuffers(1, &m_id)); -#endif - } + OGLCHECK(glDeleteFramebuffersFn(1, &m_id)); } void FrameBuffer::makeCurrent() @@ -57,11 +41,7 @@ namespace yg if (m_id != current()) #endif { -#ifdef OMIM_GL_ES - OGLCHECK(glBindFramebufferOES(GL_FRAMEBUFFER_OES, m_id)); -#else - OGLCHECK(glBindFramebuffer(GL_FRAMEBUFFER_EXT, m_id)); -#endif + OGLCHECK(glBindFramebufferFn(GL_FRAMEBUFFER_MWM, m_id)); // LOG(LINFO, ("FrameBuffer::makeCurrent", m_id)); } @@ -129,31 +109,16 @@ namespace yg void FrameBuffer::checkStatus() { - if (!yg::gl::g_doFakeOpenGLCalls) + GLenum res = glCheckFramebufferStatusFn(GL_FRAMEBUFFER_MWM); + if (res == GL_FRAMEBUFFER_UNSUPPORTED_MWM) + LOG(LINFO, ("unsupported combination of attached target formats. could be possibly skipped")); + else if (res == GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_MWM) + LOG(LINFO, ("incomplete attachement")); + else if (res == GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_MWM) + LOG(LINFO, ("incomplete missing attachement")); + else if (res == GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_MWM) { -#ifdef OMIM_GL_ES - GLenum res = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES); - if (res == GL_FRAMEBUFFER_UNSUPPORTED_OES) - LOG(LINFO, ("unsupported combination of attached target formats. could be possibly skipped")); - else if (res == GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES) - LOG(LINFO, ("incomplete attachement")); - else if (res == GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES) - LOG(LINFO, ("incomplete missing attachement")); - else if (res == GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES) - { - LOG(LINFO, ("incomplete dimensions")); - } -#else - GLenum res = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - if (res == GL_FRAMEBUFFER_UNSUPPORTED) - { - LOG(LINFO, ("unsupported combination of attached target formats. could be possibly skipped")); - } - else if (res != GL_FRAMEBUFFER_COMPLETE_EXT) - { - LOG(LERROR, ("incomplete framebuffer")); - } -#endif + LOG(LINFO, ("incomplete dimensions")); } } } diff --git a/yg/indexbuffer.cpp b/yg/indexbuffer.cpp index 8cb673f580..4919258167 100644 --- a/yg/indexbuffer.cpp +++ b/yg/indexbuffer.cpp @@ -25,14 +25,14 @@ namespace yg : m_size(0), m_gpuData(0), m_useVA(useVA), m_isLocked(false) { if (!m_useVA) - OGLCHECK(glGenBuffers(1, &m_id)); + OGLCHECK(glGenBuffersFn(1, &m_id)); } IndexBuffer::IndexBuffer(size_t size, bool useVA) : m_size(0), m_gpuData(0), m_useVA(useVA), m_isLocked(false) { if (!m_useVA) - OGLCHECK(glGenBuffers(1, &m_id)); + OGLCHECK(glGenBuffersFn(1, &m_id)); resize(size); } @@ -45,7 +45,7 @@ namespace yg m_size = size; makeCurrent(); if (!m_useVA) - OGLCHECK(glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_size, 0, GL_DYNAMIC_DRAW)); + OGLCHECK(glBufferDataFn(GL_ELEMENT_ARRAY_BUFFER, m_size, 0, GL_DYNAMIC_DRAW)); } } @@ -57,7 +57,7 @@ namespace yg IndexBuffer::~IndexBuffer() { if ((!m_useVA) && (g_doDeleteOnDestroy)) - OGLCHECK(glDeleteBuffers(1, &m_id)); + OGLCHECK(glDeleteBuffersFn(1, &m_id)); } bool IndexBuffer::isLocked() const @@ -91,11 +91,8 @@ namespace yg /// this provides that the glMapBuffer will not wait. OGLCHECK(glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_size, 0, GL_DYNAMIC_DRAW)); -#ifdef OMIM_GL_ES - m_gpuData = glMapBufferOES(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY_OES); -#else - m_gpuData = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY); -#endif + m_gpuData = glMapBufferFn(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY_MWM); + OGLCHECKAFTER; return m_gpuData; } @@ -110,11 +107,7 @@ namespace yg ASSERT(m_gpuData != 0, ("IndexBuffer is not locked")); makeCurrent(); -#ifdef OMIM_GL_ES - OGLCHECK(glUnmapBufferOES(GL_ELEMENT_ARRAY_BUFFER)); -#else - OGLCHECK(glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER)); -#endif + OGLCHECK(glUnmapBufferFn(GL_ELEMENT_ARRAY_BUFFER)); m_gpuData = 0; } @@ -139,7 +132,7 @@ namespace yg #ifndef OMIM_OS_ANDROID if (m_id != current()) #endif - OGLCHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_id)); + OGLCHECK(glBindBufferFn(GL_ELEMENT_ARRAY_BUFFER, m_id)); } void * IndexBuffer::glPtr() diff --git a/yg/internal/gl_procedures.inl b/yg/internal/gl_procedures.inl index 123e5a91a9..a9d78d67de 100644 --- a/yg/internal/gl_procedures.inl +++ b/yg/internal/gl_procedures.inl @@ -2,31 +2,26 @@ // buffer objects extensions -DEFINE_GL_PROC(PFNGLBINDBUFFERPROC, glBindBuffer) -DEFINE_GL_PROC(PFNGLGENBUFFERSPROC, glGenBuffers) -DEFINE_GL_PROC(PFNGLBUFFERDATAPROC, glBufferData) -DEFINE_GL_PROC(PFNGLBUFFERSUBDATAPROC, glBufferSubData) -DEFINE_GL_PROC(PFNGLDELETEBUFFERSPROC, glDeleteBuffers) -DEFINE_GL_PROC(PFNGLMAPBUFFERPROC, glMapBuffer) -DEFINE_GL_PROC(PFNGLUNMAPBUFFERPROC, glUnmapBuffer) +DEFINE_GL_PROC(PFNGLBINDBUFFERPROC, "glBindBufferFn", glBindBufferFn) +DEFINE_GL_PROC(PFNGLGENBUFFERSPROC, "glGenBuffers", glGenBuffersFn) +DEFINE_GL_PROC(PFNGLBUFFERDATAPROC, "glBufferData", glBufferDataFn) +DEFINE_GL_PROC(PFNGLBUFFERSUBDATAPROC, "glBufferSubData", glBufferSubDataFn) +DEFINE_GL_PROC(PFNGLDELETEBUFFERSPROC, "glDeleteBuffers", glDeleteBuffersFn) +DEFINE_GL_PROC(PFNGLMAPBUFFERPROC, "glMapBuffer", glMapBufferFn) +DEFINE_GL_PROC(PFNGLUNMAPBUFFERPROC, "glUnmapBuffer", glUnmapBufferFn) // framebuffers extensions -DEFINE_GL_PROC(PFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer) -DEFINE_GL_PROC(PFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D) -DEFINE_GL_PROC(PFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer) -DEFINE_GL_PROC(PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers) -DEFINE_GL_PROC(PFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers) -DEFINE_GL_PROC(PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, glCheckFramebufferStatusEXT) -DEFINE_GL_PROC(PFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer) +DEFINE_GL_PROC(PFNGLBINDFRAMEBUFFERPROC, "glBindFramebuffer", glBindFramebufferFn) +DEFINE_GL_PROC(PFNGLFRAMEBUFFERTEXTURE2DPROC, "glFramebufferTexture2D", glFramebufferTexture2DFn) +DEFINE_GL_PROC(PFNGLFRAMEBUFFERRENDERBUFFERPROC, "glFramebufferRenderbuffer", glFramebufferRenderbufferFn) +DEFINE_GL_PROC(PFNGLGENFRAMEBUFFERSPROC, "glGenFramebuffers", glGenFramebuffersFn) +DEFINE_GL_PROC(PFNGLDELETEFRAMEBUFFERSPROC, "glDeleteFramebuffers", glDeleteFramebuffersFn) +DEFINE_GL_PROC(PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, "glCheckFramebufferStatus", glCheckFramebufferStatusFn) // renderbuffer extensions -DEFINE_GL_PROC(PFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers) -DEFINE_GL_PROC(PFNGLDELETERENDERBUFFERSEXTPROC, glDeleteRenderbuffersEXT) -DEFINE_GL_PROC(PFNGLBINDRENDERBUFFEREXTPROC, glBindRenderbufferEXT) -DEFINE_GL_PROC(PFNGLRENDERBUFFERSTORAGEEXTPROC, glRenderbufferStorageEXT) - -// multisampling extensions - -DEFINE_GL_PROC(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample) +DEFINE_GL_PROC(PFNGLGENRENDERBUFFERSPROC, "glGenRenderbuffers", glGenRenderbuffersFn) +DEFINE_GL_PROC(PFNGLDELETERENDERBUFFERSEXTPROC, "glDeleteRenderbuffers", glDeleteRenderbuffersFn) +DEFINE_GL_PROC(PFNGLBINDRENDERBUFFEREXTPROC, "glBindRenderbuffer", glBindRenderbufferFn) +DEFINE_GL_PROC(PFNGLRENDERBUFFERSTORAGEEXTPROC, "glRenderbufferStorage", glRenderbufferStorageFn) diff --git a/yg/internal/opengl.cpp b/yg/internal/opengl.cpp index ddb27460f5..f3255ab67b 100644 --- a/yg/internal/opengl.cpp +++ b/yg/internal/opengl.cpp @@ -1,6 +1,8 @@ #include "opengl.hpp" #include "../../base/logging.hpp" +#include "../../base/string_utils.hpp" +#include "../../std/bind.hpp" #ifdef OMIM_OS_BADA #include @@ -10,11 +12,58 @@ namespace yg { namespace gl { - bool g_doFakeOpenGLCalls = false; + bool HasExtension(const char *name) + { + string allExtensions(reinterpret_cast(glGetString(GL_EXTENSIONS))); + return allExtensions.find(name) != string::npos; + } + + void DumpGLInformation() + { + LOG(LINFO, ("OpenGL Information")); + LOG(LINFO, ("--------------------------------------------")); + LOG(LINFO, ("Vendor : ", glGetString(GL_VENDOR))); + LOG(LINFO, ("Renderer : ", glGetString(GL_RENDERER))); + LOG(LINFO, ("Version : ", glGetString(GL_VERSION))); + + vector names; + + strings::Tokenize(string(reinterpret_cast(glGetString(GL_EXTENSIONS))), " ", bind(&vector::push_back, &names, _1)); + + for (unsigned i = 0; i < names.size(); ++i) + { + if (i == 0) + LOG(LINFO, ("Extensions : ", names[i])); + else + LOG(LINFO, (" ", names[i])); + } + + LOG(LINFO, ("--------------------------------------------")); + } + bool g_isBufferObjectsSupported = true; bool g_isFramebufferSupported = true; bool g_isRenderbufferSupported = true; - bool g_isMultisamplingSupported = true; + + void (* glBindBufferFn) (GLenum target, GLuint buffer); + void (* glGenBuffersFn) (GLsizei n, GLuint *buffers); + void (* glBufferDataFn) (GLenum target, long size, const GLvoid *data, GLenum usage); + void (* glBufferSubDataFn) (GLenum target, long offset, long size, const GLvoid *data); + void (* glDeleteBuffersFn) (GLsizei n, const GLuint *buffers); + void* (* glMapBufferFn) (GLenum target, GLenum access); + GLboolean (* glUnmapBufferFn) (GLenum target); + + void (* glBindFramebufferFn) (GLenum target, GLuint framebuffer); + void (* glFramebufferTexture2DFn) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + void (* glFramebufferRenderbufferFn) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); + void (* glGenFramebuffersFn) (GLsizei n, GLuint *framebuffers); + void (* glDeleteFramebuffersFn) (GLsizei n, const GLuint *framebuffers); + GLenum (* glCheckFramebufferStatusFn) (GLenum target); + + void (* glGenRenderbuffersFn) (GLsizei n, GLuint *renderbuffers); + void (* glDeleteRenderbuffersFn) (GLsizei n, const GLuint *renderbuffers); + void (* glBindRenderbufferFn) (GLenum target, GLuint renderbuffer); + void (* glRenderbufferStorageFn) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); bool g_doDeleteOnDestroy = true; diff --git a/yg/internal/opengl.hpp b/yg/internal/opengl.hpp index 9fb7fe41cf..6102d010a1 100644 --- a/yg/internal/opengl.hpp +++ b/yg/internal/opengl.hpp @@ -2,7 +2,9 @@ #include "../../std/target_os.hpp" #if defined(OMIM_OS_WINDOWS) - #include "opengl_win32.hpp" + + #include "../../std/windows.hpp" + #include #elif defined(OMIM_OS_BADA) #include @@ -15,17 +17,13 @@ #ifdef OMIM_OS_IPHONE #define USE_OPENGLES20_IF_AVAILABLE 0 #include - #include #define OMIM_GL_ES #else #include - #include #endif #elif defined(OMIM_OS_ANDROID) #include - #define GL_GLEXT_PROTOTYPES - #include #define OMIM_GL_ES #else @@ -40,19 +38,71 @@ namespace yg { namespace gl { - extern bool g_doFakeOpenGLCalls; //< for testing support - extern bool g_isBufferObjectsSupported; extern bool g_isFramebufferSupported; + extern bool g_isBufferObjectsSupported; extern bool g_isRenderbufferSupported; - extern bool g_isMultisamplingSupported; + + // buffer objects extensions + + extern const int GL_WRITE_ONLY_MWM; + + extern void (* glBindBufferFn) (GLenum target, GLuint buffer); + extern void (* glGenBuffersFn) (GLsizei n, GLuint *buffers); + extern void (* glBufferDataFn) (GLenum target, long size, const GLvoid *data, GLenum usage); + extern void (* glBufferSubDataFn) (GLenum target, long offset, long size, const GLvoid *data); + extern void (* glDeleteBuffersFn) (GLsizei n, const GLuint *buffers); + extern void* (* glMapBufferFn) (GLenum target, GLenum access); + extern GLboolean (* glUnmapBufferFn) (GLenum target); + + // framebuffers extensions + + extern const int GL_FRAMEBUFFER_BINDING_MWM; + extern const int GL_FRAMEBUFFER_MWM; + extern const int GL_FRAMEBUFFER_UNSUPPORTED_MWM; + extern const int GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_MWM; + extern const int GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_MWM; + extern const int GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_MWM; + extern const int GL_FRAMEBUFFER_COMPLETE_MWM; + extern const int GL_DEPTH_ATTACHMENT_MWM; + extern const int GL_COLOR_ATTACHMENT0_MWM; + extern const int GL_RENDERBUFFER_MWM; + extern const int GL_RENDERBUFFER_BINDING_MWM; + extern const int GL_DEPTH_COMPONENT16_MWM; + extern const int GL_DEPTH_COMPONENT24_MWM; + extern const int GL_RGBA8_MWM; + + extern void (* glBindFramebufferFn) (GLenum target, GLuint framebuffer); + extern void (* glFramebufferTexture2DFn) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + extern void (* glFramebufferRenderbufferFn) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); + extern void (* glGenFramebuffersFn) (GLsizei n, GLuint *framebuffers); + extern void (* glDeleteFramebuffersFn) (GLsizei n, const GLuint *framebuffers); + extern GLenum (* glCheckFramebufferStatusFn) (GLenum target); + + // renderbuffer extensions + + + extern void (* glGenRenderbuffersFn) (GLsizei n, GLuint *renderbuffers); + extern void (* glDeleteRenderbuffersFn) (GLsizei n, const GLuint *renderbuffers); + extern void (* glBindRenderbufferFn) (GLenum target, GLuint renderbuffer); + extern void (* glRenderbufferStorageFn) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); /// This flag controls, whether OpenGL resources should delete themselves upon destruction. /// Sounds odd, but in EGL there are cases when the only function one should call to finish /// its work with resources is eglTerminate, which by itself internally deletes all OpenGL resources. - /// In this case we should set this variable to true to correctly deletes all our classes. + /// In this case we should set this variable to true to correctly deletes all our wrapper + /// classes without calls to glDeleteXXX. extern bool g_doDeleteOnDestroy; + /// each platform should have an implementation of this function + /// to check extensions support and initialize function pointers. + void InitExtensions(); + + /// Does we have an extension with the specified name? + bool HasExtension(char const * name); + + void DumpGLInformation(); + /// return false to terminate program bool CheckExtensionSupport(); diff --git a/yg/internal/opengl_es.cpp b/yg/internal/opengl_es.cpp new file mode 100644 index 0000000000..6525d403d8 --- /dev/null +++ b/yg/internal/opengl_es.cpp @@ -0,0 +1,66 @@ +#include "opengl.hpp" + +#ifdef OMIM_OS_ANDROID + #define GL_GLEXT_PROTOTYPES + #include +#endif + +#ifdef OMIM_OS_IPHONE + #include + #include +#endif + +namespace yg +{ + namespace gl + { + const int GL_FRAMEBUFFER_BINDING_MWM = GL_FRAMEBUFFER_BINDING_OES; + const int GL_FRAMEBUFFER_MWM = GL_FRAMEBUFFER_OES; + const int GL_FRAMEBUFFER_UNSUPPORTED_MWM = GL_FRAMEBUFFER_UNSUPPORTED_OES; + const int GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_MWM = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES; + const int GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_MWM = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES; + const int GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_MWM = GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES; + const int GL_FRAMEBUFFER_COMPLETE_MWM = GL_FRAMEBUFFER_COMPLETE_OES; + + const int GL_DEPTH_ATTACHMENT_MWM = GL_DEPTH_ATTACHMENT_OES; + const int GL_COLOR_ATTACHMENT0_MWM = GL_COLOR_ATTACHMENT0_OES; + const int GL_RENDERBUFFER_MWM = GL_RENDERBUFFER_OES; + const int GL_RENDERBUFFER_BINDING_MWM = GL_RENDERBUFFER_BINDING_OES; + const int GL_DEPTH_COMPONENT16_MWM = GL_DEPTH_COMPONENT16_OES; + const int GL_DEPTH_COMPONENT24_MWM = GL_DEPTH_COMPONENT24_OES; + const int GL_RGBA8_MWM = GL_RGBA8_OES; + + const int GL_WRITE_ONLY_MWM = GL_WRITE_ONLY_OES; + + void InitExtensions() + { + DumpGLInformation(); + + g_isBufferObjectsSupported = HasExtension("GL_OES_mapbuffer"); + + glBindBufferFn = &glBindBuffer; + glGenBuffersFn = &glGenBuffers; + glBufferDataFn = &glBufferData; + glBufferSubDataFn = &glBufferSubData; + glDeleteBuffersFn = &glDeleteBuffers; + glMapBufferFn = &glMapBufferOES; + glUnmapBufferFn = &glUnmapBufferOES; + + g_isFramebufferSupported = true; + + glBindFramebufferFn = &glBindFramebufferOES; + glFramebufferTexture2DFn = &glFramebufferTexture2DOES; + glFramebufferRenderbufferFn = &glFramebufferRenderbufferOES; + glGenFramebuffersFn = &glGenFramebuffersOES; + glDeleteFramebuffersFn = &glDeleteFramebuffersOES; + glCheckFramebufferStatusFn = &glCheckFramebufferStatusOES; + + g_isRenderbufferSupported = true; + + glGenRenderbuffersFn = &glGenRenderbuffersOES; + glDeleteRenderbuffersFn = &glDeleteRenderbuffersOES; + glBindRenderbufferFn = &glBindRenderbufferOES; + glRenderbufferStorageFn = &glRenderbufferStorageOES; + } + } +} diff --git a/yg/internal/opengl_ext.cpp b/yg/internal/opengl_ext.cpp new file mode 100644 index 0000000000..96e4280f01 --- /dev/null +++ b/yg/internal/opengl_ext.cpp @@ -0,0 +1,70 @@ +#include "opengl.hpp" + +#ifdef OMIM_OS_MAC + #include + #include +#endif + +namespace yg +{ + namespace gl + { + const int GL_FRAMEBUFFER_BINDING_MWM = GL_FRAMEBUFFER_BINDING_EXT; + const int GL_FRAMEBUFFER_MWM = GL_FRAMEBUFFER_EXT; + const int GL_FRAMEBUFFER_UNSUPPORTED_MWM = GL_FRAMEBUFFER_UNSUPPORTED_EXT; + const int GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_MWM = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT; + const int GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_MWM = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT; + const int GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_MWM = GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT; + const int GL_FRAMEBUFFER_COMPLETE_MWM = GL_FRAMEBUFFER_COMPLETE_EXT; + + const int GL_DEPTH_ATTACHMENT_MWM = GL_DEPTH_ATTACHMENT_EXT; + const int GL_COLOR_ATTACHMENT0_MWM = GL_COLOR_ATTACHMENT0_EXT; + const int GL_RENDERBUFFER_MWM = GL_RENDERBUFFER_EXT; + const int GL_RENDERBUFFER_BINDING_MWM = GL_RENDERBUFFER_BINDING_EXT; + const int GL_DEPTH_COMPONENT16_MWM = GL_DEPTH_COMPONENT16; + const int GL_DEPTH_COMPONENT24_MWM = GL_DEPTH_COMPONENT24; + const int GL_RGBA8_MWM = GL_RGBA8; + + const int GL_WRITE_ONLY_MWM = GL_WRITE_ONLY; + + void InitExtensions(bool once) + { + static bool isInitialized = false; + + if ((!once) || (!isInitialized)) + { + DumpGLInformation(); + + 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; + + g_isFramebufferSupported = HasExtension("GL_ARB_framebuffer_object"); + + glBindFramebufferFn = &glBindFramebufferEXT; + glFramebufferTexture2DFn = &glFramebufferTexture2DEXT; + glFramebufferRenderbufferFn = &glFramebufferRenderbufferEXT; + glGenFramebuffersFn = &glGenFramebuffersEXT; + glDeleteFramebuffersFn = &glDeleteFramebuffersEXT; + glCheckFramebufferStatusFn = &glCheckFramebufferStatusEXT; + + g_isRenderbufferSupported = g_isFramebufferSupported; + + glGenRenderbuffersFn = &glGenRenderbuffersEXT; + glDeleteRenderbuffersFn = &glDeleteRenderbuffersEXT; + glBindRenderbufferFn = &glBindRenderbufferEXT; + glRenderbufferStorageFn = &glRenderbufferStorageEXT; + + isInitialized = true; + } + } + } +} + diff --git a/yg/internal/opengl_win32.cpp b/yg/internal/opengl_win32.cpp index ed268d6167..ad64f7d734 100644 --- a/yg/internal/opengl_win32.cpp +++ b/yg/internal/opengl_win32.cpp @@ -1,62 +1,63 @@ -#include "opengl_win32.hpp" +#include "opengl.hpp" + +#include "../../3party/GL/glext.h" #include "../../base/logging.hpp" -#ifdef OMIM_OS_WINDOWS - -#define DEFINE_GL_PROC(type, name) \ - type name; -#include "gl_procedures.inl" -#undef DEFINE_GL_PROC - -namespace win32 +namespace yg { - template - TRet GetGLProc(HMODULE, char const * name) + namespace gl { - PROC p = ::wglGetProcAddress(name); - if (p == 0) + GL_FRAMEBUFFER_BINDING = GL_FRAMEBUFFER_BINDING_EXT; + + template + TRet GetGLProc(HMODULE, char const * name) { - DWORD const err = ::GetLastError(); - LOG(LINFO, ("OpenGL extension function ", name, " not found. Last error = ", err)); + PROC p = ::wglGetProcAddress(name); + if (p == 0) + { + DWORD const err = ::GetLastError(); + LOG(LINFO, ("OpenGL extension function ", name, " not found. Last error = ", err)); + } + return reinterpret_cast(p); } - return reinterpret_cast(p); - } - void InitOpenGL() - { - HMODULE hInst = 0; + void InitExtensions() + { + HMODULE hInst = 0; - // Loading procedures, trying "EXT" suffix if alias doesn't exist -#define DEFINE_GL_PROC(type, name) \ - name = GetGLProc(hInst, #name); \ - if (name == NULL) \ - name = GetGLProc(hInst, #name "EXT"); + // Loading procedures, trying "EXT" suffix if alias doesn't exist + +#define DEFINE_GL_PROC_WIN32(type, name, fn) \ + fn = GetGLProc(hInst, name); \ + if (fn == NULL) + { + string extName = string(name) + "EXT"; + fn = GetGLProc(hInst, extName); + } #include "gl_procedures.inl" #undef DEFINE_GL_PROC - yg::gl::g_isBufferObjectsSupported = glBindBuffer - && glGenBuffers - && glBufferData - && glBufferSubData - && glDeleteBuffers - && glMapBuffer - && glUnmapBuffer; + yg::gl::g_isBufferObjectsSupported = glBindBufferFn + && glGenBuffersFn + && glBufferDataFn + && glBufferSubDataFn + && glDeleteBuffersFn + && glMapBufferFn + && glUnmapBufferFn; - yg::gl::g_isFramebufferSupported = glBindFramebuffer - && glFramebufferTexture2D - && glFramebufferRenderbuffer - && glGenFramebuffers - && glDeleteFramebuffers - && glCheckFramebufferStatusEXT - && glBlitFramebuffer; + yg::gl::g_isFramebufferSupported = glBindFramebufferFn + && glFramebufferTexture2DFn + && glFramebufferRenderbufferFn + && glGenFramebuffersFn + && glDeleteFramebuffersFn + && glCheckFramebufferStatusFn; - yg::gl::g_isRenderbufferSupported = glGenRenderbuffers - && glDeleteRenderbuffersEXT - && glBindRenderbufferEXT - && glRenderbufferStorageEXT; - - yg::gl::g_isMultisamplingSupported = (glRenderbufferStorageMultisample != NULL); + yg::gl::g_isRenderbufferSupported = glGenRenderbuffersFn + && glDeleteRenderbuffersFn + && glBindRenderbufferFn + && glRenderbufferStorageFn; + } } } // namespace win32 diff --git a/yg/internal/opengl_win32.hpp b/yg/internal/opengl_win32.hpp index 980725e99b..e69de29bb2 100644 --- a/yg/internal/opengl_win32.hpp +++ b/yg/internal/opengl_win32.hpp @@ -1,32 +0,0 @@ -#pragma once - -#include "../../std/target_os.hpp" - -#ifdef OMIM_OS_WINDOWS - -#include "../../std/windows.hpp" -#include -#include "../../3party/GL/glext.h" - -#define DEFINE_GL_PROC(type, name) \ - extern type name; -#include "gl_procedures.inl" -#undef DEFINE_GL_PROC - -namespace yg -{ - namespace gl - { - extern bool g_isBufferObjectsSupported; - extern bool g_isFramebufferSupported; - extern bool g_isRenderbufferSupported; - extern bool g_isMultisamplingSupported; - } -} - -namespace win32 -{ - void InitOpenGL(); -} - -#endif diff --git a/yg/renderbuffer.cpp b/yg/renderbuffer.cpp index 6e11e9d4eb..b439be534e 100644 --- a/yg/renderbuffer.cpp +++ b/yg/renderbuffer.cpp @@ -17,11 +17,7 @@ namespace yg int RenderBuffer::current() { int id; -#ifdef OMIM_GL_ES - OGLCHECK(glGetIntegerv(GL_RENDERBUFFER_BINDING_OES, &id)); -#else - OGLCHECK(glGetIntegerv(GL_RENDERBUFFER_BINDING_EXT, &id)); -#endif + OGLCHECK(glGetIntegerv(GL_RENDERBUFFER_BINDING_MWM, &id)); return id; } @@ -30,30 +26,21 @@ namespace yg if (!m_hasID) { m_hasID = true; -#ifdef OMIM_GL_ES - OGLCHECK(glGenRenderbuffersOES(1, &m_id)); + OGLCHECK(glGenRenderbuffersFn(1, &m_id)); makeCurrent(); - GLenum target = GL_RENDERBUFFER_OES; - GLenum internalFormat = m_isDepthBuffer ? GL_DEPTH_COMPONENT24_OES : GL_RGBA8_OES; + GLenum target = GL_RENDERBUFFER_MWM; + GLenum internalFormat = m_isDepthBuffer ? GL_DEPTH_COMPONENT24_MWM : GL_RGBA8_MWM; - OGLCHECK(glRenderbufferStorageOES(target, - internalFormat, - m_width, - m_height)); -#else - OGLCHECK(glGenRenderbuffers(1, &m_id)); - makeCurrent(); + OGLCHECK(glRenderbufferStorageFn(target, + internalFormat, + m_width, + m_height)); - GLenum target = GL_RENDERBUFFER_EXT; - GLenum internalFormat = m_isDepthBuffer ? GL_DEPTH_COMPONENT24 : GL_RGBA8; - - OGLCHECK(glRenderbufferStorageEXT(target, - internalFormat, - m_width, - m_height)); - -#endif + OGLCHECK(glRenderbufferStorageFn(target, + internalFormat, + m_width, + m_height)); } } @@ -65,11 +52,7 @@ namespace yg { if ((m_hasID) && (g_doDeleteOnDestroy)) { -#ifdef OMIM_GL_ES - OGLCHECK(glDeleteRenderbuffersOES(1, &m_id)); -#else - OGLCHECK(glDeleteRenderbuffersEXT(1, &m_id)); -#endif + OGLCHECK(glDeleteRenderbuffersFn(1, &m_id)); } } @@ -82,19 +65,13 @@ namespace yg void RenderBuffer::attachToFrameBuffer() { checkID(); -#ifdef OMIM_GL_ES - OGLCHECK(glFramebufferRenderbufferOES( - GL_FRAMEBUFFER_OES, - isDepthBuffer() ? GL_DEPTH_ATTACHMENT_OES : GL_COLOR_ATTACHMENT0_OES, - GL_RENDERBUFFER_OES, + + OGLCHECK(glFramebufferRenderbufferFn( + GL_FRAMEBUFFER_MWM, + isDepthBuffer() ? GL_DEPTH_ATTACHMENT_MWM : GL_COLOR_ATTACHMENT0_MWM, + GL_RENDERBUFFER_MWM, id())); -#else - OGLCHECK(glFramebufferRenderbuffer( - GL_FRAMEBUFFER_EXT, - isDepthBuffer() ? GL_DEPTH_ATTACHMENT_EXT : GL_COLOR_ATTACHMENT0_EXT, - GL_RENDERBUFFER_EXT, - id())); -#endif + if (!isDepthBuffer()) utils::setupCoordinates(width(), height(), false); } @@ -105,13 +82,7 @@ namespace yg #ifndef OMIM_OS_ANDROID if (m_id != current()) #endif - { -#ifdef OMIM_GL_ES - OGLCHECK(glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_id)); -#else - OGLCHECK(glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_id)); -#endif - } + OGLCHECK(glBindRenderbufferFn(GL_RENDERBUFFER_MWM, m_id)); } bool RenderBuffer::isDepthBuffer() const diff --git a/yg/vertexbuffer.cpp b/yg/vertexbuffer.cpp index a6b7a1956a..4234e72b45 100644 --- a/yg/vertexbuffer.cpp +++ b/yg/vertexbuffer.cpp @@ -25,14 +25,14 @@ namespace yg : m_size(0), m_gpuData(0), m_useVA(useVA), m_isLocked(false) { if (!m_useVA) - OGLCHECK(glGenBuffers(1, &m_id)); + OGLCHECK(glGenBuffersFn(1, &m_id)); } VertexBuffer::VertexBuffer(size_t size, bool useVA) : m_size(0), m_gpuData(0), m_useVA(useVA), m_isLocked(false) { if (!m_useVA) - OGLCHECK(glGenBuffers(1, &m_id)); + OGLCHECK(glGenBuffersFn(1, &m_id)); resize(size); } @@ -47,7 +47,7 @@ namespace yg m_size = size; makeCurrent(); if (!m_useVA) - OGLCHECK(glBufferData(GL_ARRAY_BUFFER, m_size, 0, GL_DYNAMIC_DRAW)); + OGLCHECK(glBufferDataFn(GL_ARRAY_BUFFER, m_size, 0, GL_DYNAMIC_DRAW)); } } @@ -59,7 +59,7 @@ namespace yg VertexBuffer::~VertexBuffer() { if ((!m_useVA) && (g_doDeleteOnDestroy)) - OGLCHECK(glDeleteBuffers(1, &m_id)); + OGLCHECK(glDeleteBuffersFn(1, &m_id)); } void * VertexBuffer::data() @@ -86,13 +86,10 @@ namespace yg /// orphaning the old copy of the buffer data. /// this provides that the glMapBuffer will not wait. - OGLCHECK(glBufferData(GL_ARRAY_BUFFER, m_size, 0, GL_DYNAMIC_DRAW)); + OGLCHECK(glBufferDataFn(GL_ARRAY_BUFFER, m_size, 0, GL_DYNAMIC_DRAW)); + + m_gpuData = glMapBufferFn(GL_ARRAY_BUFFER, GL_WRITE_ONLY_MWM); -#ifdef OMIM_GL_ES - m_gpuData = glMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES); -#else - m_gpuData = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); -#endif OGLCHECKAFTER; return m_gpuData; } @@ -107,11 +104,9 @@ namespace yg ASSERT(m_gpuData != 0, ("VertexBuffer is not locked")); makeCurrent(); -#ifdef OMIM_GL_ES - OGLCHECK(glUnmapBufferOES(GL_ARRAY_BUFFER)); -#else - OGLCHECK(glUnmapBuffer(GL_ARRAY_BUFFER)); -#endif + + OGLCHECK(glUnmapBufferFn(GL_ARRAY_BUFFER)); + m_gpuData = 0; } @@ -148,7 +143,7 @@ namespace yg #ifndef OMIM_OS_ANDROID if (m_id != current()) #endif - OGLCHECK(glBindBuffer(GL_ARRAY_BUFFER, m_id)); + OGLCHECK(glBindBufferFn(GL_ARRAY_BUFFER, m_id)); } } diff --git a/yg/yg.pro b/yg/yg.pro index 85df6c52af..33e6b94dc9 100644 --- a/yg/yg.pro +++ b/yg/yg.pro @@ -118,7 +118,14 @@ HEADERS += \ agg_traits.hpp \ circle_element.hpp -win32 { - HEADERS += internal/opengl_win32.hpp +win32* { SOURCES += internal/opengl_win32.cpp } + +android*|iphone* { + SOURCES += internal/opengl_es.cpp +} + +macx* { + SOURCES += internal/opengl_ext.cpp +}