From 2389ba21cfb8ab5053bdc67ce049e2beb88a164e Mon Sep 17 00:00:00 2001 From: ExMix Date: Wed, 18 Mar 2015 10:54:22 +0300 Subject: [PATCH] review fixes --- drape/batcher.cpp | 13 +++++++++ drape/batcher.hpp | 17 +++++++++++- drape_gui/compass.cpp | 11 ++++---- drape_gui/compass.hpp | 2 +- drape_gui/layer_render.cpp | 4 +-- drape_gui/ruler.cpp | 55 +++++++++++++++++++------------------- drape_gui/ruler.hpp | 6 ++--- drape_gui/shape.cpp | 45 +++++++++++++++++-------------- drape_gui/shape.hpp | 20 ++++++-------- 9 files changed, 101 insertions(+), 72 deletions(-) diff --git a/drape/batcher.cpp b/drape/batcher.cpp index 4e7d8dd9f2..69f4d74fd2 100644 --- a/drape/batcher.cpp +++ b/drape/batcher.cpp @@ -81,6 +81,8 @@ private: }; //////////////////////////////////////////////////////////////// +uint32_t Batcher::IndexCountPerQuad = 6; +uint32_t Batcher::VertexCountPerQuad = 4; Batcher::Batcher(uint32_t indexBufferSize, uint32_t vertexBufferSize) : m_indexBufferSize(indexBufferSize) @@ -228,4 +230,15 @@ void Batcher::InsertTriangles(GLState const & state, bucket->AddOverlayHandle(handle.Move()); } +SessionGuard::SessionGuard(Batcher & batcher, const Batcher::TFlushFn & flusher) + : m_batcher(batcher) +{ + m_batcher.StartSession(flusher); +} + +SessionGuard::~SessionGuard() +{ + m_batcher.EndSession(); +} + } // namespace dp diff --git a/drape/batcher.hpp b/drape/batcher.hpp index ede182b9ba..730623fd0c 100644 --- a/drape/batcher.hpp +++ b/drape/batcher.hpp @@ -6,6 +6,8 @@ #include "drape/attribute_provider.hpp" #include "drape/overlay_handle.hpp" +#include "base/macros.hpp" + #include "std/map.hpp" #include "std/function.hpp" @@ -19,6 +21,9 @@ class OverlayHandle; class Batcher { public: + static uint32_t const IndexCountPerQuad; + static uint32_t const VertexCountPerQuad; + Batcher(uint32_t indexBufferSize = 9000, uint32_t vertexBufferSize = 10000); ~Batcher(); @@ -43,7 +48,6 @@ public: void InsertListOfStrip(GLState const & state, RefPointer params, TransferPointer handle, uint8_t vertexStride); - typedef function )> TFlushFn; void StartSession(TFlushFn const & flusher); void EndSession(); @@ -80,4 +84,15 @@ public: Batcher * GetNew() const { return new Batcher(); } }; +class SessionGuard +{ +public: + SessionGuard(Batcher & batcher, Batcher::TFlushFn const & flusher); + ~SessionGuard(); + + DISALLOW_COPY_AND_MOVE(SessionGuard) +private: + Batcher & m_batcher; +}; + } // namespace dp diff --git a/drape_gui/compass.cpp b/drape_gui/compass.cpp index eb36bc4b21..5ec7545e49 100644 --- a/drape_gui/compass.cpp +++ b/drape_gui/compass.cpp @@ -6,6 +6,8 @@ #include "../drape/utils/vertex_decl.hpp" +#include "../std/bind.hpp" + namespace gui { @@ -84,14 +86,13 @@ dp::TransferPointer Compass::Draw(dp::RefPointer(&vertexes)); - ShapeRenderer * renderer = new ShapeRenderer(); - dp::Batcher batcher(6, 4); - batcher.StartSession(renderer->GetFlushRoutine()); + dp::MasterPointer renderer(new ShapeRenderer()); + dp::Batcher batcher(dp::Batcher::IndexCountPerQuad, dp::Batcher::VertexCountPerQuad); + dp::SessionGuard guard(batcher, bind(&ShapeRenderer::AddShape, renderer.GetRaw(), _1, _2)); batcher.InsertTriangleStrip(state, dp::MakeStackRefPointer(&provider), dp::MovePointer(new CompassHandle(m_position.m_pixelPivot))); - batcher.EndSession(); - return dp::MovePointer(renderer); + return renderer.Move(); } } diff --git a/drape_gui/compass.hpp b/drape_gui/compass.hpp index 4716c5716f..3dbc2fdea0 100644 --- a/drape_gui/compass.hpp +++ b/drape_gui/compass.hpp @@ -8,7 +8,7 @@ namespace gui class Compass : public Shape { public: - virtual dp::TransferPointer Draw(dp::RefPointer tex) const override; + dp::TransferPointer Draw(dp::RefPointer tex) const override; }; } diff --git a/drape_gui/layer_render.cpp b/drape_gui/layer_render.cpp index 9e282ef4b3..a764cd4092 100644 --- a/drape_gui/layer_render.cpp +++ b/drape_gui/layer_render.cpp @@ -23,12 +23,12 @@ void LayerCacher::Resize(int w, int h) dp::TransferPointer LayerCacher::Recache(dp::RefPointer textures) { - LayerRenderer * renderer = new LayerRenderer(); + dp::MasterPointer renderer(new LayerRenderer()); renderer->AddShapeRenderer(CacheShape(textures, Compass(), Skin::ElementName::Compass)); renderer->AddShapeRenderer(CacheShape(textures, Ruler(), Skin::ElementName::Ruler)); - return dp::MovePointer(renderer); + return renderer.Move(); } dp::TransferPointer LayerCacher::CacheShape(dp::RefPointer mng, Shape && shape, Skin::ElementName element) diff --git a/drape_gui/ruler.cpp b/drape_gui/ruler.cpp index ef32752cfd..7575609d48 100644 --- a/drape_gui/ruler.cpp +++ b/drape_gui/ruler.cpp @@ -1,12 +1,14 @@ +#include "drape_gui.hpp" +#include "gui_text.hpp" #include "ruler.hpp" #include "ruler_helper.hpp" -#include "gui_text.hpp" -#include "drape_gui.hpp" #include "../drape/glsl_func.hpp" #include "../drape/glsl_types.hpp" #include "../drape/shader_def.hpp" +#include "../std/bind.hpp" + namespace gui { @@ -67,7 +69,7 @@ public: SetIsVisible(true); } - virtual void Update(ScreenBase const & screen) override + void Update(ScreenBase const & screen) override { RulerHelper & helper = RulerHelper::Instance(); SetIsVisible(helper.IsVisible(screen)); @@ -75,14 +77,14 @@ public: m_uniforms.SetFloatValue("u_length", helper.GetRulerPixelLength()); } - virtual bool IndexesRequired() const override { return false; } + bool IndexesRequired() const override { return false; } - virtual m2::RectD GetPixelRect(ScreenBase const & screen) const override + m2::RectD GetPixelRect(ScreenBase const & screen) const override { return m2::RectD(); } - virtual void GetPixelShape(ScreenBase const & screen, Rects & rects) const override + void GetPixelShape(ScreenBase const & screen, Rects & rects) const override { UNUSED_VALUE(screen); UNUSED_VALUE(rects); @@ -104,10 +106,8 @@ public: m_textView.Destroy(); } - virtual void Update(ScreenBase const & screen) override + void Update(ScreenBase const & screen) override { - UNUSED_VALUE(screen); - SetIsVisible(RulerHelper::Instance().IsVisible(screen)); if (!IsVisible()) @@ -117,7 +117,7 @@ public: m_uniforms.SetMatrix4x4Value("modelView", glsl::value_ptr(m)); } - virtual void GetAttributeMutation(dp::RefPointer mutator, ScreenBase const & screen) const override + void GetAttributeMutation(dp::RefPointer mutator, ScreenBase const & screen) const override { UNUSED_VALUE(screen); @@ -153,14 +153,15 @@ private: dp::TransferPointer Ruler::Draw(dp::RefPointer tex) const { - ShapeRenderer * renderer = new ShapeRenderer; - DrawRuler(renderer, tex); - DrawText(renderer, tex); + dp::MasterPointer renderer(new ShapeRenderer); + dp::RefPointer refRenderer = renderer.GetRefPointer(); + DrawRuler(refRenderer, tex); + DrawText(refRenderer, tex); - return dp::MovePointer(renderer); + return renderer.Move(); } -void Ruler::DrawRuler(ShapeRenderer * renderer, dp::RefPointer tex) const +void Ruler::DrawRuler(dp::RefPointer renderer, dp::RefPointer tex) const { buffer_vector data; @@ -194,21 +195,20 @@ void Ruler::DrawRuler(ShapeRenderer * renderer, dp::RefPointer(data.data())); - dp::Batcher batcher(6, 4); - batcher.StartSession(renderer->GetFlushRoutine()); + dp::Batcher batcher(dp::Batcher::IndexCountPerQuad, dp::Batcher::VertexCountPerQuad); + dp::SessionGuard guard(batcher, bind(&ShapeRenderer::AddShape, renderer.GetRaw(), _1, _2)); batcher.InsertTriangleStrip(state, dp::MakeStackRefPointer(&provider), dp::MovePointer(new RulerHandle(m_position.m_anchor))); - batcher.EndSession(); } -void Ruler::DrawText(ShapeRenderer * renderer, dp::RefPointer tex) const +void Ruler::DrawText(dp::RefPointer renderer, dp::RefPointer tex) const { string alphabet; size_t maxTextLength; RulerHelper::Instance().GetTextInitInfo(alphabet, maxTextLength); - uint32_t vertexCount = 4 * maxTextLength; - uint32_t indexCount = 6 * maxTextLength; + uint32_t vertexCount = dp::Batcher::VertexCountPerQuad * maxTextLength; + uint32_t indexCount = dp::Batcher::IndexCountPerQuad * maxTextLength; m2::PointF rulerTextPivot = m_position.m_pixelPivot + m2::PointF(0.0, RulerHelper::Instance().GetVerticalTextOffset()); dp::Anchor anchor = static_cast((m_position.m_anchor & (dp::Right | dp::Left)) | dp::Bottom); @@ -218,24 +218,23 @@ void Ruler::DrawText(ShapeRenderer * renderer, dp::RefPointerSetMaxLength(maxTextLength); buffer_vector statData; - buffer_vector dynData; dp::RefPointer colorTexture = textView->Precache(statData, dp::FontDecl(FontColor, FontSize * DrapeGui::Instance().GetScaleFactor()), tex); ASSERT_EQUAL(vertexCount, statData.size(), ()); + buffer_vector dynData; dynData.resize(statData.size()); - dp::AttributeProvider provider(2, statData.size()); - provider.InitStream(0, MutableLabel::StaticVertex::GetBindingInfo(), dp::MakeStackRefPointer(statData.data())); - provider.InitStream(1, MutableLabel::DynamicVertex::GetBindingInfo(), dp::MakeStackRefPointer(dynData.data())); + dp::AttributeProvider provider(2 /*stream count*/, statData.size()); + provider.InitStream(0 /*stream index*/, MutableLabel::StaticVertex::GetBindingInfo(), dp::MakeStackRefPointer(statData.data())); + provider.InitStream(1 /*stream index*/, MutableLabel::DynamicVertex::GetBindingInfo(), dp::MakeStackRefPointer(dynData.data())); dp::GLState state(gpu::TEXT_PROGRAM, dp::GLState::UserMarkLayer); state.SetColorTexture(colorTexture); state.SetMaskTexture(maskTexture); dp::Batcher batcher(indexCount, vertexCount); - batcher.StartSession(renderer->GetFlushRoutine()); - batcher.InsertListOfStrip(state, dp::MakeStackRefPointer(&provider), dp::MovePointer(handle), 4); - batcher.EndSession(); + dp::SessionGuard guard(batcher, bind(&ShapeRenderer::AddShape, renderer.GetRaw(), _1, _2)); + batcher.InsertListOfStrip(state, dp::MakeStackRefPointer(&provider), dp::MovePointer(handle), dp::Batcher::VertexCountPerQuad); } } diff --git a/drape_gui/ruler.hpp b/drape_gui/ruler.hpp index 4b9df6a0ac..b0ed5afd66 100644 --- a/drape_gui/ruler.hpp +++ b/drape_gui/ruler.hpp @@ -8,11 +8,11 @@ namespace gui class Ruler : public Shape { public: - virtual dp::TransferPointer Draw(dp::RefPointer tex) const override; + dp::TransferPointer Draw(dp::RefPointer tex) const override; private: - void DrawRuler(ShapeRenderer * renderer, dp::RefPointer tex) const; - void DrawText(ShapeRenderer * renderer, dp::RefPointer tex) const; + void DrawRuler(dp::RefPointer renderer, dp::RefPointer tex) const; + void DrawText(dp::RefPointer renderer, dp::RefPointer tex) const; }; } diff --git a/drape_gui/shape.cpp b/drape_gui/shape.cpp index 2ebc419485..51cdfc372e 100644 --- a/drape_gui/shape.cpp +++ b/drape_gui/shape.cpp @@ -29,26 +29,7 @@ void Handle::GetPixelShape(const ScreenBase & screen, dp::OverlayHandle::Rects & ShapeRenderer::~ShapeRenderer() { for (ShapeInfo & shape : m_shapes) - { - shape.m_handle.Destroy(); - shape.m_buffer.Destroy(); - } -} - -dp::Batcher::TFlushFn ShapeRenderer::GetFlushRoutine() -{ - dp::Batcher::TFlushFn flushFn = [this](dp::GLState const & state, dp::TransferPointer bucket) - { - dp::MasterPointer b(bucket); - ASSERT(b->GetOverlayHandlesCount() == 1, ()); - dp::TransferPointer buffer = b->MoveBuffer(); - dp::TransferPointer transferH = b->PopOverlayHandle(); - b.Destroy(); - - m_shapes.emplace_back(state, buffer, transferH); - }; - - return flushFn; + shape.Destroy(); } void ShapeRenderer::Build(dp::RefPointer mng) @@ -91,4 +72,28 @@ void ShapeRenderer::Render(ScreenBase const & screen, dp::RefPointer bucket) +{ + dp::MasterPointer b(bucket); + ASSERT(b->GetOverlayHandlesCount() == 1, ()); + dp::TransferPointer buffer = b->MoveBuffer(); + dp::TransferPointer transferH = b->PopOverlayHandle(); + b.Destroy(); + + m_shapes.emplace_back(state, buffer, transferH); +} + +ShapeRenderer::ShapeInfo::ShapeInfo(const dp::GLState & state, dp::TransferPointer buffer, dp::TransferPointer handle) + : m_state(state) + , m_buffer(buffer) + , m_handle(handle) +{ +} + +void ShapeRenderer::ShapeInfo::Destroy() +{ + m_handle.Destroy(); + m_buffer.Destroy(); +} + } diff --git a/drape_gui/shape.hpp b/drape_gui/shape.hpp index afc573c6d8..050ea01d56 100644 --- a/drape_gui/shape.hpp +++ b/drape_gui/shape.hpp @@ -2,13 +2,13 @@ #include "skin.hpp" -#include "../drape/glsl_types.hpp" #include "../drape/batcher.hpp" -#include "../drape/texture_manager.hpp" -#include "../drape/overlay_handle.hpp" +#include "../drape/glsl_types.hpp" #include "../drape/glstate.hpp" -#include "../drape/vertex_array_buffer.hpp" #include "../drape/gpu_program_manager.hpp" +#include "../drape/overlay_handle.hpp" +#include "../drape/texture_manager.hpp" +#include "../drape/vertex_array_buffer.hpp" namespace gui { @@ -38,21 +38,17 @@ class ShapeRenderer final public: ~ShapeRenderer(); - dp::Batcher::TFlushFn GetFlushRoutine(); - void Build(dp::RefPointer mng); void Render(ScreenBase const & screen, dp::RefPointer mng); + void AddShape(dp::GLState const & state, dp::TransferPointer bucket); private: struct ShapeInfo { ShapeInfo(dp::GLState const & state, dp::TransferPointer buffer, - dp::TransferPointer handle) - : m_state(state) - , m_buffer(buffer) - , m_handle(handle) - { - } + dp::TransferPointer handle); + + void Destroy(); dp::GLState m_state; dp::MasterPointer m_buffer;