From d83bd7c462ef834d86a04e0c383cdad59c6390c4 Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Wed, 28 Jun 2017 01:58:28 +0300 Subject: [PATCH] User marks optimization. Calculation of a user mark depth in the shader. --- drape_frontend/backend_renderer.cpp | 6 ++-- drape_frontend/backend_renderer.hpp | 2 +- drape_frontend/drape_engine.cpp | 6 ++-- drape_frontend/frontend_renderer.cpp | 4 ++- drape_frontend/message_subclasses.hpp | 7 ++-- drape_frontend/shaders/shader_index.txt | 4 +-- drape_frontend/shaders/user_mark.vsh.glsl | 2 ++ .../shaders/user_mark_billboard.vsh.glsl | 5 +-- drape_frontend/user_mark_generator.cpp | 36 +++++++++++++------ drape_frontend/user_mark_generator.hpp | 2 +- drape_frontend/user_mark_shapes.cpp | 31 ++-------------- drape_frontend/user_mark_shapes.hpp | 7 ++-- map/bookmark_manager.cpp | 2 +- 13 files changed, 54 insertions(+), 60 deletions(-) diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index 50a6c775b9..3a4427b3a5 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -32,7 +32,7 @@ BackendRenderer::BackendRenderer(Params && params) , m_readManager(make_unique_dp(params.m_commutator, m_model, params.m_allow3dBuildings, params.m_trafficEnabled)) , m_trafficGenerator(make_unique_dp(bind(&BackendRenderer::FlushTrafficRenderData, this, _1))) - , m_userMarkGenerator(make_unique_dp(bind(&BackendRenderer::FlushUserMarksRenderData, this, _1, _2))) + , m_userMarkGenerator(make_unique_dp(bind(&BackendRenderer::FlushUserMarksRenderData, this, _1))) , m_requestedTiles(params.m_requestedTiles) , m_updateCurrentCountryFn(params.m_updateCurrentCountryFn) , m_metalineManager(make_unique_dp(params.m_commutator, m_model)) @@ -593,10 +593,10 @@ void BackendRenderer::FlushTrafficRenderData(TrafficRenderData && renderData) MessagePriority::Normal); } -void BackendRenderer::FlushUserMarksRenderData(GroupID groupId, TUserMarksRenderData && renderData) +void BackendRenderer::FlushUserMarksRenderData(TUserMarksRenderData && renderData) { m_commutator->PostMessage(ThreadsCommutator::RenderThread, - make_unique_dp(groupId, std::move(renderData)), + make_unique_dp(std::move(renderData)), MessagePriority::Normal); } diff --git a/drape_frontend/backend_renderer.hpp b/drape_frontend/backend_renderer.hpp index 1fdca5e181..4d07e3383b 100644 --- a/drape_frontend/backend_renderer.hpp +++ b/drape_frontend/backend_renderer.hpp @@ -96,7 +96,7 @@ private: void FlushGeometry(TileKey const & key, dp::GLState const & state, drape_ptr && buffer); void FlushTrafficRenderData(TrafficRenderData && renderData); - void FlushUserMarksRenderData(GroupID groupId, TUserMarksRenderData && renderData); + void FlushUserMarksRenderData(TUserMarksRenderData && renderData); void CleanupOverlays(TileKey const & tileKey); diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index 6b5ef4ce58..1bfb53e694 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -235,9 +235,9 @@ void DrapeEngine::UpdateUserMarksLayer(size_t layerId, UserMarksProvider * provi renderInfo.m_layers.reserve(mark->GetLayerCount()); for (size_t layerIndex = 0, sz = mark->GetLayerCount(); layerIndex < sz; ++layerIndex) { - renderInfo.m_layers.emplace_back(LineLayer(mark->GetColor(layerIndex), - mark->GetWidth(layerIndex), - mark->GetLayerDepth(layerIndex))); + renderInfo.m_layers.emplace_back(mark->GetColor(layerIndex), + mark->GetWidth(layerIndex), + mark->GetLayerDepth(layerIndex)); } linesRenderCollection->emplace_back(std::move(renderInfo)); } diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 37fe55b2cf..963263f772 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -1147,7 +1147,6 @@ void FrontendRenderer::RenderScene(ScreenBase const & modelView) RenderTrafficAndRouteLayer(modelView); } - // After this line we do not use (almost) depth buffer. GLFunctions::glDisable(gl_const::GLDepthTest); GLFunctions::glClear(gl_const::GLDepthBit); @@ -1272,9 +1271,12 @@ void FrontendRenderer::RenderTrafficAndRouteLayer(ScreenBase const & modelView) void FrontendRenderer::RenderUserMarksLayer(ScreenBase const & modelView) { + GLFunctions::glEnable(gl_const::GLDepthTest); + GLFunctions::glClear(gl_const::GLDepthBit); RenderLayer & userMarks = m_layers[RenderLayer::UserMarkID]; for (drape_ptr & group : userMarks.m_renderGroups) RenderSingleGroup(modelView, make_ref(group)); + GLFunctions::glDisable(gl_const::GLDepthTest); } void FrontendRenderer::BuildOverlayTree(ScreenBase const & modelView) diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index ca949d7dff..6e0d3a1252 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -254,12 +254,11 @@ private: drape_ptr m_linesRenderParams; }; -class FlushUserMarksMessage : public BaseUserMarkLayerMessage +class FlushUserMarksMessage : public Message { public: - FlushUserMarksMessage(size_t layerId, TUserMarksRenderData && renderData) - : BaseUserMarkLayerMessage(layerId) - , m_renderData(std::move(renderData)) + FlushUserMarksMessage(TUserMarksRenderData && renderData) + : m_renderData(std::move(renderData)) {} Type GetType() const override { return Message::FlushUserMarks; } diff --git a/drape_frontend/shaders/shader_index.txt b/drape_frontend/shaders/shader_index.txt index 66558f9808..6abdd75e91 100644 --- a/drape_frontend/shaders/shader_index.txt +++ b/drape_frontend/shaders/shader_index.txt @@ -18,7 +18,7 @@ TEXTURING_GUI_PROGRAM texturing_gui.vsh.glsl texturing.fsh.glsl RULER_PROGRAM ruler.vsh.glsl texturing.fsh.glsl ACCURACY_PROGRAM position_accuracy3d.vsh.glsl texturing.fsh.glsl MY_POSITION_PROGRAM my_position.vsh.glsl texturing.fsh.glsl -BOOKMARK_PROGRAM user_mark.vsh.glsl texturing.fsh.glsl +BOOKMARK_PROGRAM user_mark.vsh.glsl discarded_texturing.fsh.glsl ROUTE_PROGRAM route.vsh.glsl route.fsh.glsl ROUTE_DASH_PROGRAM route.vsh.glsl route_dash.fsh.glsl ROUTE_ARROW_PROGRAM route_arrow.vsh.glsl discarded_texturing.fsh.glsl @@ -34,7 +34,7 @@ MASKED_TEXTURING_BILLBOARD_PROGRAM masked_texturing_billboard.vsh.glsl masked_te TEXT_OUTLINED_BILLBOARD_PROGRAM text_outlined_billboard.vsh.glsl text.fsh.glsl TEXT_BILLBOARD_PROGRAM text_billboard.vsh.glsl text.fsh.glsl TEXT_FIXED_BILLBOARD_PROGRAM text_billboard.vsh.glsl text_fixed.fsh.glsl -BOOKMARK_BILLBOARD_PROGRAM user_mark_billboard.vsh.glsl texturing.fsh.glsl +BOOKMARK_BILLBOARD_PROGRAM user_mark_billboard.vsh.glsl discarded_texturing.fsh.glsl TRAFFIC_PROGRAM traffic.vsh.glsl traffic.fsh.glsl TRAFFIC_LINE_PROGRAM traffic_line.vsh.glsl traffic_line.fsh.glsl SMAA_EDGES_PROGRAM smaa_edges.vsh.glsl smaa_edges.fsh.glsl diff --git a/drape_frontend/shaders/user_mark.vsh.glsl b/drape_frontend/shaders/user_mark.vsh.glsl index 1ee417a8f2..5cbe0da862 100644 --- a/drape_frontend/shaders/user_mark.vsh.glsl +++ b/drape_frontend/shaders/user_mark.vsh.glsl @@ -18,6 +18,8 @@ void main() vec4 p = vec4(a_position, 1) * modelView; vec4 pos = vec4(normal, 0, 0) + p; + vec4 projectedPivot = p * projection; gl_Position = applyPivotTransform(pos * projection, pivotTransform, 0.0); + gl_Position.z = smoothstep(0.1, 0.9, projectedPivot.y / projectedPivot.w * 0.5 + 0.5); v_colorTexCoords = a_colorTexCoords; } diff --git a/drape_frontend/shaders/user_mark_billboard.vsh.glsl b/drape_frontend/shaders/user_mark_billboard.vsh.glsl index fc353fe4ee..8e7bdb8342 100644 --- a/drape_frontend/shaders/user_mark_billboard.vsh.glsl +++ b/drape_frontend/shaders/user_mark_billboard.vsh.glsl @@ -18,7 +18,8 @@ void main() vec4 pivot = vec4(a_position.xyz, 1.0) * modelView; vec4 offset = vec4(normal, 0.0, 0.0) * projection; - gl_Position = applyBillboardPivotTransform(pivot * projection, pivotTransform, 0.0, offset.xy); - + vec4 projectedPivot = pivot * projection; + gl_Position = applyBillboardPivotTransform(projectedPivot, pivotTransform, 0.0, offset.xy); + gl_Position.z = smoothstep(0.1, 0.9, projectedPivot.y / projectedPivot.w * 0.5 + 0.5); v_colorTexCoords = a_colorTexCoords; } diff --git a/drape_frontend/user_mark_generator.cpp b/drape_frontend/user_mark_generator.cpp index e1f817a517..a62b364966 100644 --- a/drape_frontend/user_mark_generator.cpp +++ b/drape_frontend/user_mark_generator.cpp @@ -1,10 +1,14 @@ #include "drape_frontend/user_mark_generator.hpp" #include "drape_frontend/tile_utils.hpp" +#include "drape/batcher.hpp" + #include "geometry/rect_intersect.hpp" #include "indexer/scales.hpp" +#include + namespace df { UserMarkGenerator::UserMarkGenerator(TFlushFn const & flushFn) @@ -158,22 +162,34 @@ void UserMarkGenerator::SetGroupVisibility(GroupID groupId, bool isVisible) void UserMarkGenerator::GenerateUserMarksGeometry(TileKey const & tileKey, ref_ptr textures) { - MarksIndex::const_iterator itTile = m_marksIndex.find(tileKey); + MarksIndex::const_iterator itTile = m_marksIndex.find(TileKey(tileKey.m_x, + tileKey.m_y, + min(tileKey.m_zoomLevel, scales::GetUpperScale()))); if (itTile == m_marksIndex.end()) return; - MarkIndexesGroups & indexesGroups = *itTile->second; - for (auto & groupPair : indexesGroups) + TUserMarksRenderData renderData; { - GroupID groupId = groupPair.first; + uint32_t const kMaxSize = 65000; + dp::Batcher batcher(kMaxSize, kMaxSize); + dp::SessionGuard guard(batcher, [&tileKey, &renderData](dp::GLState const & state, + drape_ptr && b) + { + renderData.emplace_back(state, std::move(b), tileKey); + }); - if (m_groupsVisibility.find(groupId) == m_groupsVisibility.end()) - continue; + MarkIndexesGroups & indexesGroups = *itTile->second; + for (auto & groupPair : indexesGroups) + { + GroupID groupId = groupPair.first; - TUserMarksRenderData renderData; - CacheUserMarks(tileKey, textures, *m_marks[groupId], groupPair.second->m_markIndexes, renderData); - CacheUserLines(tileKey, textures, *m_lines[groupId], groupPair.second->m_lineIndexes, renderData); - m_flushFn(groupId, std::move(renderData)); + if (m_groupsVisibility.find(groupId) == m_groupsVisibility.end()) + continue; + + CacheUserMarks(tileKey, textures, *m_marks[groupId], groupPair.second->m_markIndexes, batcher); + CacheUserLines(tileKey, textures, *m_lines[groupId], groupPair.second->m_lineIndexes, batcher); + } } + m_flushFn(std::move(renderData)); } } // namespace df diff --git a/drape_frontend/user_mark_generator.hpp b/drape_frontend/user_mark_generator.hpp index 8295e01f51..053f8437b3 100644 --- a/drape_frontend/user_mark_generator.hpp +++ b/drape_frontend/user_mark_generator.hpp @@ -28,7 +28,7 @@ using MarksIndex = std::map>; class UserMarkGenerator { public: - using TFlushFn = function; + using TFlushFn = function; UserMarkGenerator(TFlushFn const & flushFn); diff --git a/drape_frontend/user_mark_shapes.cpp b/drape_frontend/user_mark_shapes.cpp index 1be5eabf95..4bed0fa666 100644 --- a/drape_frontend/user_mark_shapes.cpp +++ b/drape_frontend/user_mark_shapes.cpp @@ -81,24 +81,15 @@ struct UserPointVertex : gpu::BaseVertex void CacheUserMarks(TileKey const & tileKey, ref_ptr textures, UserMarksRenderCollection const & renderParams, MarkIndexesCollection const & indexes, - TUserMarksRenderData & renderData) + dp::Batcher & batcher) { using UPV = UserPointVertex; - uint32_t const vertexCount = static_cast(indexes.size()) * dp::Batcher::VertexPerQuad; - uint32_t const indicesCount = static_cast(indexes.size()) * dp::Batcher::IndexPerQuad; buffer_vector buffer; buffer.reserve(vertexCount); - // TODO: Sort once on render params receiving. - MarkIndexesCollection sortedIndexes = indexes; - sort(sortedIndexes.begin(), sortedIndexes.end(), [&renderParams](uint32_t ind1, uint32_t ind2) - { - return renderParams[ind1].m_pivot.y > renderParams[ind2].m_pivot.y; - }); - dp::TextureManager::SymbolRegion region; - for (auto const markIndex : sortedIndexes) + for (auto const markIndex : indexes) { UserMarkRenderParams const & renderInfo = renderParams[markIndex]; if (!renderInfo.m_isVisible) @@ -129,14 +120,6 @@ void CacheUserMarks(TileKey const & tileKey, ref_ptr texture state.SetColorTexture(region.GetTexture()); state.SetTextureFilter(gl_const::GLNearest); - uint32_t const kMaxSize = 65000; - dp::Batcher batcher(min(indicesCount, kMaxSize), min(vertexCount, kMaxSize)); - dp::SessionGuard guard(batcher, [&tileKey, &renderData](dp::GLState const & state, - drape_ptr && b) - { - renderData.emplace_back(UserMarkRenderData(state, move(b), tileKey)); - }); - dp::AttributeProvider attribProvider(1, static_cast(buffer.size())); attribProvider.InitStream(0, UPV::GetBinding(), make_ref(buffer.data())); @@ -145,20 +128,12 @@ void CacheUserMarks(TileKey const & tileKey, ref_ptr texture void CacheUserLines(TileKey const & tileKey, ref_ptr textures, UserLinesRenderCollection const & renderParams, LineIndexesCollection const & indexes, - TUserMarksRenderData & renderData) + dp::Batcher & batcher) { - uint32_t const kBatchSize = 5000; for (auto lineIndex : indexes) { UserLineRenderParams const & renderInfo = renderParams[lineIndex]; - dp::Batcher batcher(kBatchSize, kBatchSize); - dp::SessionGuard guard(batcher, [&tileKey, &renderData](dp::GLState const & state, - drape_ptr && b) - { - renderData.emplace_back(UserMarkRenderData(state, move(b), tileKey)); - }); - std::vector const splines = m2::ClipSplineByRect(tileKey.GetGlobalRect(), renderInfo.m_spline); for (auto const & spline : splines) { diff --git a/drape_frontend/user_mark_shapes.hpp b/drape_frontend/user_mark_shapes.hpp index a315647918..cc317de6ed 100644 --- a/drape_frontend/user_mark_shapes.hpp +++ b/drape_frontend/user_mark_shapes.hpp @@ -2,8 +2,7 @@ #include "tile_key.hpp" -#include "drape/glstate.hpp" -#include "drape/render_bucket.hpp" +#include "drape/batcher.hpp" #include "drape/texture_manager.hpp" #include "geometry/spline.hpp" @@ -69,10 +68,10 @@ using TUserMarksRenderData = std::vector; void CacheUserMarks(TileKey const & tileKey, ref_ptr textures, UserMarksRenderCollection const & renderParams, MarkIndexesCollection const & indexes, - TUserMarksRenderData & renderData); + dp::Batcher & batcher); void CacheUserLines(TileKey const & tileKey, ref_ptr textures, UserLinesRenderCollection const & renderParams, LineIndexesCollection const & indexes, - TUserMarksRenderData & renderData); + dp::Batcher & batcher); } // namespace df diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index 852969eba0..0395f372bf 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -20,7 +20,7 @@ BookmarkManager::BookmarkManager(Framework & f) : m_framework(f) { - m_userMarkLayers.reserve(3); + m_userMarkLayers.reserve(4); m_userMarkLayers.push_back(new SearchUserMarkContainer(0.0 /* activePinDepth */, m_framework)); m_userMarkLayers.push_back(new ApiUserMarkContainer(0.0 /* activePinDepth */, m_framework)); m_userMarkLayers.push_back(new DebugUserMarkContainer(0.0 /* debugDepth */, m_framework));