From 9350472797081a3fcbe447160eea030b8a5d5e67 Mon Sep 17 00:00:00 2001 From: rachytski Date: Thu, 8 Sep 2011 12:49:39 +0300 Subject: [PATCH] added tiny storage for low-overhead rendering on GUI thread. --- iphone/Maps/Classes/EAGLView.mm | 17 +++++++++++++++-- yg/geometry_batcher.cpp | 26 +++++++++++++++++++------- yg/geometry_batcher.hpp | 4 ++++ yg/resource_manager.cpp | 19 +++++++++++++++++++ yg/resource_manager.hpp | 6 ++++++ 5 files changed, 63 insertions(+), 9 deletions(-) diff --git a/iphone/Maps/Classes/EAGLView.mm b/iphone/Maps/Classes/EAGLView.mm index 131662386c..0134ca918c 100644 --- a/iphone/Maps/Classes/EAGLView.mm +++ b/iphone/Maps/Classes/EAGLView.mm @@ -90,16 +90,27 @@ int multiBlitVBSize = pow(2, ceil(log2(300 * sizeof(yg::gl::AuxVertex)))); int multiBlitIBSize = pow(2, ceil(log2(300 * sizeof(unsigned short)))); + int tinyVBSize = pow(2, ceil(log2(300 * sizeof(yg::gl::AuxVertex)))); + int tinyIBSize = pow(2, ceil(log2(300 * sizeof(unsigned short)))); + NSLog(@"Vendor: %s, Renderer: %s", glGetString(GL_VENDOR), glGetString(GL_RENDERER)); Platform & pl = GetPlatform(); + size_t dynTexWidth = 512; + size_t dynTexHeight = 256; + size_t dynTexCount = 10; + + size_t fontTexWidth = 512; + size_t fontTexHeight = 256; + size_t fontTexCount = 10; + resourceManager = shared_ptr(new yg::ResourceManager( bigVBSize, bigIBSize, 6 * GetPlatform().CpuCores(), smallVBSize, smallIBSize, 15 * GetPlatform().CpuCores(), blitVBSize, blitIBSize, 15 * GetPlatform().CpuCores(), - 512, 256, 10 * GetPlatform().CpuCores(), - 512, 256, 10 * GetPlatform().CpuCores(), + dynTexWidth, dynTexHeight, dynTexCount * GetPlatform().CpuCores(), + fontTexWidth, fontTexHeight, fontTexCount * GetPlatform().CpuCores(), "unicode_blocks.txt", "fonts_whitelist.txt", "fonts_blacklist.txt", @@ -109,6 +120,7 @@ !yg::gl::g_isBufferObjectsSupported)); resourceManager->initMultiBlitStorage(multiBlitVBSize, multiBlitIBSize, 10); + resourceManager->initTinyStorage(tinyVBSize, tinyIBSize, 10); Platform::FilesList fonts; pl.GetFontNames(fonts); @@ -121,6 +133,7 @@ p.m_skinName = pl.SkinName(); p.m_visualScale = pl.VisualScale(); p.m_isSynchronized = false; + p.m_useTinyStorage = true; //< use tiny buffers to minimize CPU->GPU data transfer overhead. drawer = shared_ptr(new DrawerYG(p)); diff --git a/yg/geometry_batcher.cpp b/yg/geometry_batcher.cpp index 5fad904a9f..ddaf7eb667 100644 --- a/yg/geometry_batcher.cpp +++ b/yg/geometry_batcher.cpp @@ -22,11 +22,16 @@ namespace yg { namespace gl { - GeometryBatcher::Params::Params() : m_isSynchronized(true) + GeometryBatcher::Params::Params() + : m_isSynchronized(true), + m_useTinyStorage(false) {} GeometryBatcher::GeometryBatcher(Params const & params) - : base_t(params), m_isAntiAliased(true), m_isSynchronized(params.m_isSynchronized) + : base_t(params), + m_isAntiAliased(true), + m_isSynchronized(params.m_isSynchronized), + m_useTinyStorage(params.m_useTinyStorage) { reset(-1); applyStates(); @@ -77,8 +82,11 @@ namespace yg { if (!m_hasStorage) { - m_storage = usage != SkinPage::EStaticUsage ? resourceManager->storages()->Reserve() - : resourceManager->smallStorages()->Reserve(); + if (m_useTinyStorage) + m_storage = resourceManager->tinyStorages()->Reserve(); + else + m_storage = usage != SkinPage::EStaticUsage ? resourceManager->storages()->Reserve() + : resourceManager->smallStorages()->Reserve(); m_maxVertices = m_storage.m_vertices->size() / sizeof(Vertex); m_maxIndices = m_storage.m_indices->size() / sizeof(unsigned short); @@ -103,6 +111,7 @@ namespace yg for (size_t i = 0; i < m_pipelines.size(); ++i) { + m_pipelines[i].m_useTinyStorage = m_useTinyStorage; m_pipelines[i].m_currentVertex = 0; m_pipelines[i].m_currentIndex = 0; @@ -223,10 +232,13 @@ namespace yg renderedData = true; - if (skinPage->usage() != SkinPage::EStaticUsage) - resourceManager()->storages()->Free(pipeline.m_storage); + if (m_useTinyStorage) + resourceManager()->tinyStorages()->Free(pipeline.m_storage); else - resourceManager()->smallStorages()->Free(pipeline.m_storage); + if (skinPage->usage() != SkinPage::EStaticUsage) + resourceManager()->storages()->Free(pipeline.m_storage); + else + resourceManager()->smallStorages()->Free(pipeline.m_storage); pipeline.m_hasStorage = false; pipeline.m_storage = Storage(); diff --git a/yg/geometry_batcher.hpp b/yg/geometry_batcher.hpp index 4dc48c88b5..2505e1447a 100644 --- a/yg/geometry_batcher.hpp +++ b/yg/geometry_batcher.hpp @@ -62,6 +62,8 @@ namespace yg mutable unsigned short * m_indices; /// @} + bool m_useTinyStorage; + size_t verticesLeft(); size_t indicesLeft(); @@ -79,6 +81,7 @@ namespace yg bool m_isAntiAliased; bool m_isSynchronized; + bool m_useTinyStorage; int m_aaShift; @@ -94,6 +97,7 @@ namespace yg struct Params : public base_t::Params { bool m_isSynchronized; + bool m_useTinyStorage; Params(); }; diff --git a/yg/resource_manager.cpp b/yg/resource_manager.cpp index 869aa5a441..cae025acad 100644 --- a/yg/resource_manager.cpp +++ b/yg/resource_manager.cpp @@ -79,6 +79,14 @@ namespace yg m_multiBlitStorages.reset(new TStoragePool(TStoragePoolTraits(TStorageFactory(multiBlitVBSize, multiBlitIBSize, m_useVA, "multiBlitStorage"), multiBlitStoragesCount))); } + void ResourceManager::initTinyStorage(size_t tinyVBSize, size_t tinyIBSize, size_t tinyStoragesCount) + { + m_tinyVBSize = tinyVBSize; + m_tinyIBSize = tinyIBSize; + + m_tinyStorages.reset(new TStoragePool(TStoragePoolTraits(TStorageFactory(tinyVBSize, tinyIBSize, m_useVA, "tinyStorage"), tinyStoragesCount))); + } + void ResourceManager::initRenderTargets(size_t renderTargetWidth, size_t renderTargetHeight, size_t renderTargetsCount) { m_renderTargetWidth = renderTargetWidth; @@ -185,6 +193,9 @@ namespace yg if (m_multiBlitStorages.get()) m_multiBlitStorages->EnterBackground(); + if (m_tinyStorages.get()) + m_tinyStorages->EnterBackground(); + if (m_dynamicTextures.get()) m_dynamicTextures->EnterBackground(); @@ -211,6 +222,9 @@ namespace yg if (m_multiBlitStorages.get()) m_multiBlitStorages->EnterForeground(); + if (m_tinyStorages.get()) + m_tinyStorages->EnterForeground(); + if (m_dynamicTextures.get()) m_dynamicTextures->EnterForeground(); @@ -264,6 +278,11 @@ namespace yg return m_multiBlitStorages.get(); } + ResourceManager::TStoragePool * ResourceManager::tinyStorages() + { + return m_tinyStorages.get(); + } + ResourceManager::TTexturePool * ResourceManager::dynamicTextures() { return m_dynamicTextures.get(); diff --git a/yg/resource_manager.hpp b/yg/resource_manager.hpp index 05e720ce48..ef37855ce4 100644 --- a/yg/resource_manager.hpp +++ b/yg/resource_manager.hpp @@ -92,10 +92,14 @@ namespace yg size_t m_multiBlitVBSize; size_t m_multiBlitIBSize; + size_t m_tinyVBSize; + size_t m_tinyIBSize; + auto_ptr m_storages; auto_ptr m_smallStorages; auto_ptr m_blitStorages; auto_ptr m_multiBlitStorages; + auto_ptr m_tinyStorages; vector m_glyphCaches; @@ -118,6 +122,7 @@ namespace yg void initMultiBlitStorage(size_t multiBlitVBSize, size_t multiBlitIBSize, size_t multiBlitStoragesCount); void initRenderTargets(size_t renderTargetWidth, size_t renderTargetHeight, size_t renderTargetCount); + void initTinyStorage(size_t tinyVBSize, size_t tinyIBSize, size_t tinyStoragesCount); shared_ptr const & getTexture(string const & fileName); @@ -125,6 +130,7 @@ namespace yg TStoragePool * smallStorages(); TStoragePool * blitStorages(); TStoragePool * multiBlitStorages(); + TStoragePool * tinyStorages(); TTexturePool * dynamicTextures(); TTexturePool * fontTextures();