From 0e5ce3fc48523b3d72fd9c40fe05a01bc71971e9 Mon Sep 17 00:00:00 2001 From: rachytski Date: Mon, 23 Apr 2012 19:22:20 +0400 Subject: [PATCH] moved uploadData from SkinPage to GeometryBatcher. --- yg/geometry_batcher.cpp | 6 +++- yg/geometry_renderer.cpp | 70 +++++++++++++++++++++++++++++++++++++ yg/geometry_renderer.hpp | 16 +++++++++ yg/resource_style_cache.cpp | 2 +- yg/skin.hpp | 2 -- yg/skin_page.cpp | 63 --------------------------------- yg/skin_page.hpp | 15 -------- 7 files changed, 92 insertions(+), 82 deletions(-) diff --git a/yg/geometry_batcher.cpp b/yg/geometry_batcher.cpp index db9ee03a65..8a5efb873c 100644 --- a/yg/geometry_batcher.cpp +++ b/yg/geometry_batcher.cpp @@ -375,7 +375,11 @@ namespace yg GeometryPipeline & pipeline = m_pipelines[pipelineID]; if (pipeline.m_currentIndex) { - skinPage->uploadData(renderQueue()); + if (skinPage->hasData()) + { + uploadTexture(skinPage->uploadQueue(), skinPage->texture()); + skinPage->clearUploadQueue(); + } unlockPipeline(pipelineID); diff --git a/yg/geometry_renderer.cpp b/yg/geometry_renderer.cpp index 9d4afbdf86..1fb097669b 100644 --- a/yg/geometry_renderer.cpp +++ b/yg/geometry_renderer.cpp @@ -24,6 +24,76 @@ namespace yg m_displayList(0) {} + GeometryRenderer::UploadData::UploadData(SkinPage::TUploadQueue const & uploadQueue, + shared_ptr const & texture) + : m_uploadQueue(uploadQueue), m_texture(texture) + {} + + GeometryRenderer::UploadData::UploadData() + {} + + void GeometryRenderer::UploadData::perform() + { + if (isDebugging()) + LOG(LINFO, ("performing UploadData command", m_texture->width(), m_texture->height())); + + if (!m_texture) + { + LOG(LDEBUG, ("no texture on upload")); + return; + } + + if (isDebugging()) + LOG(LINFO, ("uploading to", m_texture->id(), "texture")); + + static_cast(m_texture.get())->lock(); + + TDynamicTexture * dynTexture = static_cast(m_texture.get()); + + for (size_t i = 0; i < m_uploadQueue.size(); ++i) + { + shared_ptr const & style = m_uploadQueue[i]; + + TDynamicTexture::view_t v = dynTexture->view(style->m_texRect.SizeX(), + style->m_texRect.SizeY()); + + style->render(&v(0, 0)); + + dynTexture->upload(&v(0, 0), style->m_texRect); + } + + /// Should call glFlush here and rebind in all + /// renderContexts that's using it. + /// But for simplification just calling glFinish + OGLCHECK(glFinish()); + + static_cast(m_texture.get())->unlock(); + } + + void GeometryRenderer::UploadData::cancel() + { + perform(); + } + + void GeometryRenderer::UploadData::dump() + { + m2::RectU r(0, 0, 0, 0); + if (!m_uploadQueue.empty()) + r = m_uploadQueue[0]->m_texRect; + LOG(LINFO, ("UploadData: texture", m_texture->id(), ", count=", m_uploadQueue.size(), ", first=", r)); + } + + void GeometryRenderer::uploadTexture(SkinPage::TUploadQueue const & uploadQueue, + shared_ptr const & texture) + { + shared_ptr command(new UploadData(uploadQueue, texture)); + + if (m_displayList) + m_displayList->uploadData(command); + else + processCommand(command); + } + void GeometryRenderer::DrawGeometry::perform() { if (isDebugging()) diff --git a/yg/geometry_renderer.hpp b/yg/geometry_renderer.hpp index 2e94a3ad8d..48ad34d499 100644 --- a/yg/geometry_renderer.hpp +++ b/yg/geometry_renderer.hpp @@ -1,6 +1,7 @@ #pragma once #include "clipper.hpp" +#include "skin_page.hpp" #include "../base/threaded_list.hpp" @@ -28,6 +29,20 @@ namespace yg typedef Clipper base_t; + struct UploadData : public Command + { + SkinPage::TUploadQueue m_uploadQueue; + shared_ptr m_texture; + + UploadData(); + UploadData(SkinPage::TUploadQueue const & uploadQueue, + shared_ptr const & texture); + + void perform(); + void cancel(); + void dump(); + }; + struct DrawGeometry : Command { shared_ptr m_texture; @@ -98,6 +113,7 @@ namespace yg size_t indicesOffs, unsigned primType); + void uploadTexture(SkinPage::TUploadQueue const & uploadQueue, shared_ptr const & texture); void freeTexture(shared_ptr const & texture, TTexturePool * texturePool); void freeStorage(Storage const & storage, TStoragePool * storagePool); void unlockStorage(Storage const & storage); diff --git a/yg/resource_style_cache.cpp b/yg/resource_style_cache.cpp index 33c260418b..2a09f9c60b 100644 --- a/yg/resource_style_cache.cpp +++ b/yg/resource_style_cache.cpp @@ -133,7 +133,7 @@ namespace yg void ResourceStyleCache::upload() { - m_cachePage->uploadData(m_glQueue); +// m_cachePage->uploadData(m_glQueue); if (m_glQueue) m_glQueue->processPacket(yg::gl::Packet(make_shared_ptr(new yg::gl::Renderer::FinishCommand()), yg::gl::Packet::ECommand)); diff --git a/yg/skin.hpp b/yg/skin.hpp index 588b87384a..f6e82bc0e3 100644 --- a/yg/skin.hpp +++ b/yg/skin.hpp @@ -98,8 +98,6 @@ namespace yg public: - void uploadData(); - /// clean and destroy ~Skin(); /// obtain ResourceStyle from id diff --git a/yg/skin_page.cpp b/yg/skin_page.cpp index ea7b79b3a6..75baa96350 100644 --- a/yg/skin_page.cpp +++ b/yg/skin_page.cpp @@ -329,69 +329,6 @@ namespace yg it->second->m_pipelineID = pipelineID; } - SkinPage::UploadData::UploadData(SkinPage::TUploadQueue const & uploadQueue, - shared_ptr const & texture) - : m_uploadQueue(uploadQueue), m_texture(texture) - {} - - SkinPage::UploadData::UploadData() - {} - - void SkinPage::UploadData::perform() - { - if (isDebugging()) - LOG(LINFO, ("performing UploadData command", m_texture->width(), m_texture->height())); - - if (!m_texture) - { - LOG(LDEBUG, ("no texture on upload")); - return; - } - - if (isDebugging()) - LOG(LINFO, ("uploading to", m_texture->id(), "texture")); - - static_cast(m_texture.get())->lock(); - - TDynamicTexture * dynTexture = static_cast(m_texture.get()); - - for (size_t i = 0; i < m_uploadQueue.size(); ++i) - { - shared_ptr const & style = m_uploadQueue[i]; - - TDynamicTexture::view_t v = dynTexture->view(style->m_texRect.SizeX(), - style->m_texRect.SizeY()); - - style->render(&v(0, 0)); - - dynTexture->upload(&v(0, 0), style->m_texRect); - } - - static_cast(m_texture.get())->unlock(); - } - - void SkinPage::UploadData::cancel() - { - perform(); - } - - void SkinPage::uploadData(yg::gl::PacketsQueue * glQueue) - { - if (hasData()) - { - checkTexture(); - - shared_ptr cmd(new UploadData(m_uploadQueue, m_texture)); - - if (glQueue) - glQueue->processPacket(yg::gl::Packet(cmd, yg::gl::Packet::ECommand)); - else - cmd->perform(); - - m_uploadQueue.clear(); - } - } - ResourceStyle * SkinPage::fromID(uint32_t idx) const { TStyles::const_iterator it = m_styles.find(idx); diff --git a/yg/skin_page.hpp b/yg/skin_page.hpp index d8a480f696..577bef4a3c 100644 --- a/yg/skin_page.hpp +++ b/yg/skin_page.hpp @@ -97,19 +97,6 @@ namespace yg public: - struct UploadData : public yg::gl::Command - { - SkinPage::TUploadQueue m_uploadQueue; - shared_ptr m_texture; - - UploadData(); - UploadData(SkinPage::TUploadQueue const & uploadQueue, - shared_ptr const & texture); - - void perform(); - void cancel(); - }; - void clearColorHandles(); void clearPenInfoHandles(); void clearFontHandles(); @@ -123,8 +110,6 @@ namespace yg TUploadQueue const & uploadQueue() const; void clearUploadQueue(); - void uploadData(yg::gl::PacketsQueue * glQueue); - void checkTexture() const; void setPipelineID(uint8_t pipelineID);