diff --git a/yg/geometry_batcher.cpp b/yg/geometry_batcher.cpp index d04ae4dff7..f83e39a32d 100644 --- a/yg/geometry_batcher.cpp +++ b/yg/geometry_batcher.cpp @@ -240,7 +240,7 @@ namespace yg void GeometryBatcher::switchTextures(int pageID) { m_skin->pages()[pageID]->freeTexture(); - m_skin->pages()[pageID]->reserveTexture(); +// m_skin->pages()[pageID]->reserveTexture(); } void GeometryBatcher::drawTexturedPolygon( diff --git a/yg/resource_manager.cpp b/yg/resource_manager.cpp index 0a259fbe99..1c309e68c4 100644 --- a/yg/resource_manager.cpp +++ b/yg/resource_manager.cpp @@ -21,7 +21,11 @@ namespace yg size_t blitVBSize, size_t blitIBSize, size_t blitStoragesCount, size_t texWidth, size_t texHeight, size_t texCount, char const * blocksFile, char const * whiteListFile, char const * blackListFile, size_t maxGlyphCacheSize) - : m_glyphCache(GlyphCache::Params(blocksFile, whiteListFile, blackListFile, maxGlyphCacheSize)) + : m_vbSize(vbSize), m_ibSize(ibSize), + m_smallVBSize(smallVBSize), m_smallIBSize(smallIBSize), + m_blitVBSize(blitVBSize), m_blitIBSize(blitIBSize), + m_textureWidth(texWidth), m_textureHeight(texHeight), + m_glyphCache(GlyphCache::Params(blocksFile, whiteListFile, blackListFile, maxGlyphCacheSize)) { for (size_t i = 0; i < storagesCount; ++i) m_storages.push_back(gl::Storage(vbSize, ibSize)); @@ -147,6 +151,16 @@ namespace yg return res; } + size_t ResourceManager::textureWidth() const + { + return m_textureWidth; + } + + size_t ResourceManager::textureHeight() const + { + return m_textureHeight; + } + void ResourceManager::freeTexture(shared_ptr const & texture, bool doSignal) { threads::MutexGuard guard(m_mutex); diff --git a/yg/resource_manager.hpp b/yg/resource_manager.hpp index e8ec3499fa..f82b247993 100644 --- a/yg/resource_manager.hpp +++ b/yg/resource_manager.hpp @@ -34,6 +34,18 @@ namespace yg list > m_dynamicTextures; + size_t m_vbSize; + size_t m_ibSize; + + size_t m_smallVBSize; + size_t m_smallIBSize; + + size_t m_blitVBSize; + size_t m_blitIBSize; + + size_t m_textureWidth; + size_t m_textureHeight; + list m_storages; list m_smallStorages; list m_blitStorages; @@ -65,6 +77,9 @@ namespace yg shared_ptr const reserveTexture(bool doWait = false); void freeTexture(shared_ptr const & texture, bool doSignal = false); + size_t textureWidth() const; + size_t textureHeight() const; + shared_ptr const getGlyph(GlyphKey const & key); GlyphMetrics const getGlyphMetrics(GlyphKey const & key); diff --git a/yg/skin_page.cpp b/yg/skin_page.cpp index f662e95af0..ca99bb56e3 100644 --- a/yg/skin_page.cpp +++ b/yg/skin_page.cpp @@ -110,12 +110,13 @@ namespace yg SkinPage::SkinPage(shared_ptr const & resourceManager, uint8_t pageID) - : m_texture(resourceManager->reserveTexture()), - m_resourceManager(resourceManager), + : m_resourceManager(resourceManager), m_isDynamic(true), m_pageID(pageID) { - m_packer = m2::Packer(m_texture->width(), m_texture->height(), 0x00FFFFFF - 1), + m_packer = m2::Packer(m_resourceManager->textureWidth(), + m_resourceManager->textureHeight(), + 0x00FFFFFF - 1); /// clear handles will be called only upon handles overflow, /// as the texture overflow is processed separately m_packer.addOverflowFn(bind(&SkinPage::clearHandles, this), 0); @@ -736,10 +737,25 @@ namespace yg m_colorUploadCommands.clear(); } + bool SkinPage::hasData() + { + return ((!m_colorUploadCommands.empty()) + || (!m_penUploadCommands.empty()) + || (!m_glyphUploadCommands.empty()) + || (!m_circleUploadCommands.empty())); + } + + void SkinPage::checkTexture() const + { + if ((m_isDynamic) && (m_texture == 0)) + reserveTexture(); + } + void SkinPage::uploadData() { - if (m_isDynamic) + if ((m_isDynamic) && (hasData())) { + checkTexture(); static_cast(m_texture.get())->lock(); uploadColors(); uploadPenInfo(); @@ -766,15 +782,18 @@ namespace yg shared_ptr const & SkinPage::texture() const { + checkTexture(); return m_texture; } void SkinPage::freeTexture() { - m_resourceManager->freeTexture(m_texture); + if (m_texture) + m_resourceManager->freeTexture(m_texture); + m_texture.reset(); } - void SkinPage::reserveTexture() + void SkinPage::reserveTexture() const { m_texture = m_resourceManager->reserveTexture(); } diff --git a/yg/skin_page.hpp b/yg/skin_page.hpp index 4378e4d88c..fb9f196e7e 100644 --- a/yg/skin_page.hpp +++ b/yg/skin_page.hpp @@ -95,8 +95,11 @@ namespace yg TGlyphMap m_glyphMap; m2::Packer m_packer; - shared_ptr m_texture; - shared_ptr m_resourceManager; + /// made mutable to implement lazy reservation of texture + /// @{ + mutable shared_ptr m_texture; + mutable shared_ptr m_resourceManager; + /// @} vector m_colorUploadCommands; vector m_penUploadCommands; @@ -129,8 +132,11 @@ namespace yg void clearHandles(); + bool hasData(); void uploadData(); + void checkTexture() const; + SkinPage(); /// creation of a static page @@ -142,7 +148,7 @@ namespace yg SkinPage(shared_ptr const & resourceManager, uint8_t pageID); - void reserveTexture(); + void reserveTexture() const; void freeTexture(); uint32_t findColor(Color const & c) const;