diff --git a/graphics/opengl/renderbuffer.cpp b/graphics/opengl/renderbuffer.cpp index b2f1afd341..eb2d0a56ce 100644 --- a/graphics/opengl/renderbuffer.cpp +++ b/graphics/opengl/renderbuffer.cpp @@ -11,40 +11,22 @@ namespace graphics { namespace gl { - RenderBuffer::RenderBuffer(size_t width, size_t height) - : m_id(0), m_isDepthBuffer(true), m_width(width), m_height(height) + RenderBuffer::RenderBuffer(size_t width, size_t height, bool isDepthBuffer, bool isRgba4) + : m_id(0), m_isDepthBuffer(isDepthBuffer), m_width(width), m_height(height) { OGLCHECK(glGenRenderbuffersFn(1, &m_id)); makeCurrent(); - OGLCHECK(glRenderbufferStorageFn(GL_RENDERBUFFER_MWM, - GL_DEPTH_COMPONENT16_MWM, - m_width, - m_height)); - } + GLenum target = GL_RENDERBUFFER_MWM; + GLenum internalFormat = m_isDepthBuffer ? GL_DEPTH_COMPONENT16_MWM : GL_RGBA8_MWM; - RenderBuffer::RenderBuffer(size_t width, size_t height, graphics::DataFormat format) - : m_id(0), m_isDepthBuffer(false), m_width(width), m_height(height) - { - OGLCHECK(glGenRenderbuffersFn(1, &m_id)); - - makeCurrent(); - - GLenum internalFormat; - switch(format) - { - case graphics::Data4Bpp: + if (m_isDepthBuffer == false && isRgba4 == true) internalFormat = GL_RGBA4_MWM; - break; - case graphics::Data8Bpp: - internalFormat = GL_RGBA8_MWM; - break; - default: - ASSERT(false, ("Incorrect color buffer format")); - } - OGLCHECK(glRenderbufferStorageFn(GL_RENDERBUFFER_MWM, + if (m_isDepthBuffer == false) + LOG(LINFO, ("Color buffer format : ", internalFormat)); + OGLCHECK(glRenderbufferStorageFn(target, internalFormat, m_width, m_height)); diff --git a/graphics/opengl/renderbuffer.hpp b/graphics/opengl/renderbuffer.hpp index 4cfff40158..b2c85ae090 100644 --- a/graphics/opengl/renderbuffer.hpp +++ b/graphics/opengl/renderbuffer.hpp @@ -21,9 +21,7 @@ namespace graphics public: // Create depth buffer - RenderBuffer(size_t width, size_t height); - // Create color bufer - RenderBuffer(size_t width, size_t height, graphics::DataFormat format); + RenderBuffer(size_t width, size_t height, bool isDepthBuffer = false, bool isRgba4 = false); ~RenderBuffer(); unsigned int id() const; diff --git a/graphics/resource_manager.cpp b/graphics/resource_manager.cpp index 1bac2ef0d3..0c19e66a84 100644 --- a/graphics/resource_manager.cpp +++ b/graphics/resource_manager.cpp @@ -248,6 +248,13 @@ namespace if (isGPU("Imagination Technologies", "PowerVR MBX", false)) m_texRtFormat = graphics::Data8Bpp; + m_rgba4RenderBuffer = false; +#ifdef OMIM_OS_ANDROID + if (isGPU("NVIDIA Corporation", "NVIDIA Tegra", false)) + m_rgba4RenderBuffer = true; +#endif + + LOG(LINFO, ("using GL_RGBA4 for color buffer : ", m_rgba4RenderBuffer)); LOG(LINFO, ("selected", graphics::formatName(m_texRtFormat), "format for tile textures")); } diff --git a/graphics/resource_manager.hpp b/graphics/resource_manager.hpp index af5cb6544e..4444c46dfb 100644 --- a/graphics/resource_manager.hpp +++ b/graphics/resource_manager.hpp @@ -199,6 +199,8 @@ namespace graphics unsigned m_renderThreadsCount; unsigned m_threadSlotsCount; + bool m_rgba4RenderBuffer; + Params(); void distributeFreeMemory(int freeVideoMemory); diff --git a/iphone/Maps/Classes/EAGLView.mm b/iphone/Maps/Classes/EAGLView.mm index 0f4ff996b9..0cef454a4b 100644 --- a/iphone/Maps/Classes/EAGLView.mm +++ b/iphone/Maps/Classes/EAGLView.mm @@ -141,7 +141,7 @@ renderBuffer = make_shared_ptr(new iphone::RenderBuffer(renderContext, (CAEAGLLayer*)self.layer)); screen->setRenderTarget(renderBuffer); - screen->setDepthBuffer(make_shared_ptr(new graphics::gl::RenderBuffer(width, height))); + screen->setDepthBuffer(make_shared_ptr(new graphics::gl::RenderBuffer(width, height, true))); GetFramework().OnSize(width, height); diff --git a/map/tile_renderer.cpp b/map/tile_renderer.cpp index 641844b27c..7328ecc750 100644 --- a/map/tile_renderer.cpp +++ b/map/tile_renderer.cpp @@ -92,9 +92,9 @@ TileRenderer::TileRenderer( m_threadData[i].m_drawerParams = params; m_threadData[i].m_drawer = 0; m_threadData[i].m_threadSlot = params.m_threadSlot; - m_threadData[i].m_colorBuffer = make_shared_ptr(new graphics::gl::RenderBuffer(tileSz.first, tileSz.second, - m_resourceManager->params().m_texRtFormat)); - m_threadData[i].m_depthBuffer = make_shared_ptr(new graphics::gl::RenderBuffer(tileSz.first, tileSz.second)); + m_threadData[i].m_colorBuffer = make_shared_ptr(new graphics::gl::RenderBuffer(tileSz.first, tileSz.second, false, + m_resourceManager->params().m_rgba4RenderBuffer)); + m_threadData[i].m_depthBuffer = make_shared_ptr(new graphics::gl::RenderBuffer(tileSz.first, tileSz.second, true)); } m_queue.AddInitCommand(bind(&TileRenderer::InitializeThreadGL, this, _1)); diff --git a/map/yopme_render_policy.cpp b/map/yopme_render_policy.cpp index f1477d8119..594143644b 100644 --- a/map/yopme_render_policy.cpp +++ b/map/yopme_render_policy.cpp @@ -234,8 +234,8 @@ void YopmeRP::OnSize(int w, int h) { RenderPolicy::OnSize(w, h); m_offscreenDrawer->onSize(w, h); - m_offscreenDrawer->screen()->setDepthBuffer(make_shared_ptr(new gl::RenderBuffer(w, h))); - m_offscreenDrawer->screen()->setRenderTarget(make_shared_ptr(new gl::RenderBuffer(w, h, m_resourceManager->params().m_texRtFormat))); + m_offscreenDrawer->screen()->setDepthBuffer(make_shared_ptr(new gl::RenderBuffer(w, h, true))); + m_offscreenDrawer->screen()->setRenderTarget(make_shared_ptr(new gl::RenderBuffer(w, h, false))); } void YopmeRP::SetDrawingApiPin(bool isNeed, m2::PointD const & point)