diff --git a/android/jni/com/mapswithme/maps/Framework.cpp b/android/jni/com/mapswithme/maps/Framework.cpp index 0954389846..4a7f4bbd7a 100644 --- a/android/jni/com/mapswithme/maps/Framework.cpp +++ b/android/jni/com/mapswithme/maps/Framework.cpp @@ -99,7 +99,6 @@ namespace android rmParams.m_videoMemoryLimit = 30 * 1024 * 1024; rmParams.m_rtFormat = yg::Data8Bpp; rmParams.m_texFormat = yg::Data4Bpp; - rmParams.m_texRtFormat = yg::Data4Bpp; try { diff --git a/map/basic_render_policy.cpp b/map/basic_render_policy.cpp index 3c7602712a..6a83743bca 100644 --- a/map/basic_render_policy.cpp +++ b/map/basic_render_policy.cpp @@ -21,6 +21,8 @@ BasicRenderPolicy::BasicRenderPolicy(VideoTimer * videoTimer, { yg::ResourceManager::Params rmp = rmParams; + rmp.selectTexRTFormat(); + rmp.m_primaryStoragesParams = yg::ResourceManager::StoragePoolParams(50000 * sizeof(yg::gl::Vertex), sizeof(yg::gl::Vertex), 10000 * sizeof(unsigned short), diff --git a/map/render_policy_mt.cpp b/map/render_policy_mt.cpp index 761c7e65ce..b32b3d1ad9 100644 --- a/map/render_policy_mt.cpp +++ b/map/render_policy_mt.cpp @@ -22,6 +22,8 @@ RenderPolicyMT::RenderPolicyMT(VideoTimer * videoTimer, { yg::ResourceManager::Params rmp = rmParams; + rmp.selectTexRTFormat(); + rmp.m_primaryStoragesParams = yg::ResourceManager::StoragePoolParams(5000 * sizeof(yg::gl::Vertex), sizeof(yg::gl::Vertex), 10000 * sizeof(unsigned short), diff --git a/map/render_policy_st.cpp b/map/render_policy_st.cpp index 2ad202c547..767ab2ecd8 100644 --- a/map/render_policy_st.cpp +++ b/map/render_policy_st.cpp @@ -23,6 +23,8 @@ RenderPolicyST::RenderPolicyST(VideoTimer * videoTimer, { yg::ResourceManager::Params rmp = rmParams; + rmp.selectTexRTFormat(); + rmp.m_primaryStoragesParams = yg::ResourceManager::StoragePoolParams(5000 * sizeof(yg::gl::Vertex), sizeof(yg::gl::Vertex), 10000 * sizeof(unsigned short), diff --git a/map/tiling_render_policy_mt.cpp b/map/tiling_render_policy_mt.cpp index 408a562b72..6376b3f58d 100644 --- a/map/tiling_render_policy_mt.cpp +++ b/map/tiling_render_policy_mt.cpp @@ -22,6 +22,8 @@ TilingRenderPolicyMT::TilingRenderPolicyMT(VideoTimer * videoTimer, { yg::ResourceManager::Params rmp = rmParams; + rmp.selectTexRTFormat(); + rmp.m_primaryTexturesParams = yg::ResourceManager::TexturePoolParams(512, 256, 10, diff --git a/map/tiling_render_policy_st.cpp b/map/tiling_render_policy_st.cpp index ceef058786..3c62bed578 100644 --- a/map/tiling_render_policy_st.cpp +++ b/map/tiling_render_policy_st.cpp @@ -41,6 +41,8 @@ TilingRenderPolicyST::TilingRenderPolicyST(VideoTimer * videoTimer, { yg::ResourceManager::Params rmp = rmParams; + rmp.selectTexRTFormat(); + rmp.m_primaryTexturesParams = yg::ResourceManager::TexturePoolParams(512, 256, 1, diff --git a/yg/renderer.cpp b/yg/renderer.cpp index 0b9add7e5e..3ec181097b 100644 --- a/yg/renderer.cpp +++ b/yg/renderer.cpp @@ -178,8 +178,8 @@ namespace yg OGLCHECK(glFinish()); } - Renderer::ReadPixels::ReadPixels(m2::RectU const & r, void * data) - : m_rect(r), m_data(data) + Renderer::ReadPixels::ReadPixels(m2::RectU const & r, void * data, yg::DataFormat rtFormat) + : m_rect(r), m_data(data), m_rtFormat(rtFormat) {} void Renderer::ReadPixels::perform() @@ -187,19 +187,38 @@ namespace yg if (isDebugging()) LOG(LINFO, ("performing ReadPixels command")); + int pixelDataType = 0; + int pixelFormatType = 0; + + switch (m_rtFormat) + { + case yg::Data4Bpp: + pixelDataType = GL_UNSIGNED_SHORT_4_4_4_4; + pixelFormatType = GL_RGBA; + break; + case yg::Data565Bpp: + pixelDataType = GL_UNSIGNED_SHORT_5_6_5; + pixelFormatType = GL_RGB; + break; + case yg::Data8Bpp: + pixelDataType = GL_UNSIGNED_BYTE; + pixelFormatType = GL_RGBA; + break; + } + OGLCHECK(glReadPixels(m_rect.minX(), m_rect.minY(), m_rect.SizeX(), m_rect.SizeY(), - RT_TRAITS::gl_pixel_format_type, - RT_TRAITS::gl_pixel_data_type, + pixelDataType, + pixelFormatType, m_data )); } void Renderer::readPixels(m2::RectU const & r, void * data, bool doForce) { - processCommand(make_shared_ptr(new ReadPixels(r, data)), Packet::ECommand, doForce); + processCommand(make_shared_ptr(new ReadPixels(r, data, m_resourceManager->params().m_texRtFormat)), Packet::ECommand, doForce); } void Renderer::finish(bool doForce) diff --git a/yg/renderer.hpp b/yg/renderer.hpp index 6758735008..048e64e8da 100644 --- a/yg/renderer.hpp +++ b/yg/renderer.hpp @@ -2,6 +2,7 @@ #include "color.hpp" #include "packets_queue.hpp" +#include "resource_manager.hpp" #include "../base/threaded_list.hpp" #include "../std/function.hpp" @@ -42,8 +43,9 @@ namespace yg { m2::RectU m_rect; void * m_data; + yg::DataFormat m_rtFormat; - ReadPixels(m2::RectU const & r, void * data); + ReadPixels(m2::RectU const & r, void * data, yg::DataFormat rtFormat); void perform(); }; diff --git a/yg/resource_manager.cpp b/yg/resource_manager.cpp index 559ff8e2ac..40b1e563e9 100644 --- a/yg/resource_manager.cpp +++ b/yg/resource_manager.cpp @@ -355,7 +355,9 @@ namespace yg } ResourceManager::Params::Params() - : m_rtFormat(yg::Data8Bpp), + : m_vendorName(reinterpret_cast(glGetString(GL_VENDOR))), + m_rendererName(reinterpret_cast(glGetString(GL_RENDERER))), + m_rtFormat(yg::Data8Bpp), m_texFormat(yg::Data4Bpp), m_texRtFormat(yg::Data4Bpp), m_useSingleThreadedOGL(false), @@ -371,7 +373,29 @@ namespace yg m_renderTargetTexturesParams("renderTargetTexture"), m_styleCacheTexturesParams("styleCacheTexture"), m_guiThreadTexturesParams("guiThreadTexture") - {} + { + } + + bool ResourceManager::Params::isGPU(char const * vendorName, char const * rendererName) const + { + return (m_vendorName.find(vendorName) != string::npos) + && (m_rendererName.find(rendererName) != string::npos); + } + + void ResourceManager::Params::selectTexRTFormat() + { + /// general case + m_texRtFormat = yg::Data4Bpp; + + if (isGPU("Broadcom", "VideoCore IV HW")) + m_texRtFormat = yg::Data8Bpp; + + if (isGPU("Imagination Technologies", "PowerVR MBX")) + { + m_rtFormat = yg::Data8Bpp; + m_texRtFormat = yg::Data8Bpp; + } + } void ResourceManager::Params::fitIntoLimits() { diff --git a/yg/resource_manager.hpp b/yg/resource_manager.hpp index a6b54b1851..917c45765d 100644 --- a/yg/resource_manager.hpp +++ b/yg/resource_manager.hpp @@ -207,6 +207,16 @@ namespace yg struct Params { + private: + + string m_vendorName; + string m_rendererName; + + /// check non-strict matching upon vendorName and rendererName + bool isGPU(char const * vendorName, char const * rendererName) const; + + public: + DataFormat m_rtFormat; DataFormat m_texFormat; DataFormat m_texRtFormat; @@ -238,6 +248,7 @@ namespace yg Params(); void distributeFreeMemory(int freeVideoMemory); + void selectTexRTFormat(); void fitIntoLimits(); int memoryUsage() const; int fixedMemoryUsage() const; @@ -273,6 +284,7 @@ namespace yg ResourceManager(Params const & p); void initGlyphCaches(GlyphCacheParams const & p); + void selectTexRTFormat(); void initStoragePool(StoragePoolParams const & p, scoped_ptr & pool);