summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2020-04-14 17:01:41 +0300
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2020-04-14 22:30:40 +0300
commit364ea4b3b7a61c37ffdc5f7b74b1030b7360fe86 (patch)
tree7091668d247b57ecd450f5c43d9b4fc766503ee3
parent3ba2fc6ea2e0d3ac0cd3c238bc1385ff97150b5c (diff)
downloadqtlocation-mapboxgl-364ea4b3b7a61c37ffdc5f7b74b1030b7360fe86.tar.gz
[core] RenderCircleLayer fixes
-rw-r--r--src/mbgl/renderer/layers/render_circle_layer.cpp120
1 files changed, 52 insertions, 68 deletions
diff --git a/src/mbgl/renderer/layers/render_circle_layer.cpp b/src/mbgl/renderer/layers/render_circle_layer.cpp
index a85b82b2d2..ffcc0be1b5 100644
--- a/src/mbgl/renderer/layers/render_circle_layer.cpp
+++ b/src/mbgl/renderer/layers/render_circle_layer.cpp
@@ -19,26 +19,18 @@ namespace {
struct RenderableSegment {
RenderableSegment(const Segment<CircleAttributes>& segment_,
- CircleProgram& programInstance_,
- const CircleBucket& bucket_,
- const CircleProgram::UniformValues& allUniformValues_,
- const CircleProgram::AttributeBindings& allAttributeBindings_,
+ const RenderTile& tile_,
+ const LayerRenderData* renderData_,
float sortKey_)
- : segment(segment_),
- programInstance(programInstance_),
- bucket(bucket_),
- allUniformValues(allUniformValues_),
- allAttributeBindings(allAttributeBindings_),
- sortKey(sortKey_) {}
+ : segment(segment_), tile(tile_), renderData(renderData_), sortKey(sortKey_) {}
const Segment<CircleAttributes>& segment;
- CircleProgram& programInstance;
- const CircleBucket& bucket;
- const CircleProgram::UniformValues& allUniformValues;
- const CircleProgram::AttributeBindings& allAttributeBindings;
+ const RenderTile& tile;
+ const LayerRenderData* renderData;
const float sortKey;
friend bool operator<(const RenderableSegment& lhs, const RenderableSegment& rhs) {
+ if (lhs.sortKey == rhs.sortKey) return lhs.tile.id < rhs.tile.id;
return lhs.sortKey < rhs.sortKey;
}
};
@@ -88,27 +80,20 @@ void RenderCircleLayer::render(PaintParameters& parameters) {
if (parameters.pass == RenderPass::Opaque) {
return;
}
-
- const bool sortFeaturesByKey = !impl_cast(baseImpl).layout.get<CircleSortKey>().isUndefined();
- std::multiset<RenderableSegment> renderableSegments{};
-
- for (const RenderTile& tile : *renderTiles) {
- const LayerRenderData* renderData = getRenderDataForPass(tile, parameters.pass);
- if (!renderData) {
- continue;
- }
- auto& bucket = static_cast<CircleBucket&>(*renderData->bucket);
- const auto& evaluated = getEvaluated<CircleLayerProperties>(renderData->layerProperties);
- const bool scaleWithMap = evaluated.get<CirclePitchScale>() == CirclePitchScaleType::Map;
- const bool pitchWithMap = evaluated.get<CirclePitchAlignment>() == AlignmentType::Map;
- const auto& paintPropertyBinders = bucket.paintPropertyBinders.at(getID());
+ const auto drawTile = [&](const RenderTile& tile, const LayerRenderData* data, const auto& segments) {
+ auto& circleBucket = static_cast<CircleBucket&>(*data->bucket);
+ const auto& evaluated = getEvaluated<CircleLayerProperties>(data->layerProperties);
+ const bool scaleWithMap = evaluated.template get<CirclePitchScale>() == CirclePitchScaleType::Map;
+ const bool pitchWithMap = evaluated.template get<CirclePitchAlignment>() == AlignmentType::Map;
+ const auto& paintPropertyBinders = circleBucket.paintPropertyBinders.at(getID());
auto& programInstance = parameters.programs.getCircleLayerPrograms().circle;
-
- const auto allUniformValues = CircleProgram::computeAllUniformValues(
- CircleProgram::LayoutUniformValues{
- uniforms::matrix::Value(tile.translatedMatrix(
- evaluated.get<CircleTranslate>(), evaluated.get<CircleTranslateAnchor>(), parameters.state)),
+ using LayoutUniformValues = CircleProgram::LayoutUniformValues;
+ const auto& allUniformValues = CircleProgram::computeAllUniformValues(
+ LayoutUniformValues(
+ uniforms::matrix::Value(tile.translatedMatrix(evaluated.template get<CircleTranslate>(),
+ evaluated.template get<CircleTranslateAnchor>(),
+ parameters.state)),
uniforms::scale_with_map::Value(scaleWithMap),
uniforms::extrude_scale::Value(
pitchWithMap ? std::array<float, 2>{{tile.id.pixelsToTileUnits(1, parameters.state.getZoom()),
@@ -116,52 +101,51 @@ void RenderCircleLayer::render(PaintParameters& parameters) {
: parameters.pixelsToGLUnits),
uniforms::device_pixel_ratio::Value(parameters.pixelRatio),
uniforms::camera_to_center_distance::Value(parameters.state.getCameraToCenterDistance()),
- uniforms::pitch_with_map::Value(pitchWithMap)},
+ uniforms::pitch_with_map::Value(pitchWithMap)),
paintPropertyBinders,
evaluated,
parameters.state.getZoom());
- const auto allAttributeBindings =
- CircleProgram::computeAllAttributeBindings(*bucket.vertexBuffer, paintPropertyBinders, evaluated);
+ const auto& allAttributeBindings =
+ CircleProgram::computeAllAttributeBindings(*circleBucket.vertexBuffer, paintPropertyBinders, evaluated);
checkRenderability(parameters, CircleProgram::activeBindingCount(allAttributeBindings));
- if (sortFeaturesByKey) {
- for (auto& segment : bucket.segments) {
- renderableSegments.emplace(
- segment, programInstance, bucket, allUniformValues, allAttributeBindings, segment.sortKey);
- }
- } else {
- programInstance.draw(parameters.context,
- *parameters.renderPass,
- gfx::Triangles(),
- parameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly),
- gfx::StencilMode::disabled(),
- parameters.colorModeForRenderPass(),
- gfx::CullFaceMode::disabled(),
- *bucket.indexBuffer,
- bucket.segments,
- allUniformValues,
- allAttributeBindings,
- CircleProgram::TextureBindings{},
- getID());
+ programInstance.draw(parameters.context,
+ *parameters.renderPass,
+ gfx::Triangles(),
+ parameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly),
+ gfx::StencilMode::disabled(),
+ parameters.colorModeForRenderPass(),
+ gfx::CullFaceMode::disabled(),
+ *circleBucket.indexBuffer,
+ segments,
+ allUniformValues,
+ allAttributeBindings,
+ CircleProgram::TextureBindings{},
+ getID());
+ };
+
+ const bool sortFeaturesByKey = !impl_cast(baseImpl).layout.get<CircleSortKey>().isUndefined();
+ std::multiset<RenderableSegment> renderableSegments;
+
+ for (const RenderTile& renderTile : *renderTiles) {
+ const LayerRenderData* renderData = getRenderDataForPass(renderTile, parameters.pass);
+ if (!renderData) {
+ continue;
+ }
+ auto& bucket = static_cast<CircleBucket&>(*renderData->bucket);
+ if (!sortFeaturesByKey) {
+ drawTile(renderTile, renderData, bucket.segments);
+ continue;
+ }
+ for (auto& segment : bucket.segments) {
+ renderableSegments.emplace(segment, renderTile, renderData, segment.sortKey);
}
}
if (sortFeaturesByKey) {
for (const auto& renderable : renderableSegments) {
- renderable.programInstance.draw(parameters.context,
- *parameters.renderPass,
- gfx::Triangles(),
- parameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly),
- gfx::StencilMode::disabled(),
- parameters.colorModeForRenderPass(),
- gfx::CullFaceMode::disabled(),
- *renderable.bucket.indexBuffer,
- renderable.segment,
- renderable.allUniformValues,
- renderable.allAttributeBindings,
- CircleProgram::TextureBindings{},
- getID());
+ drawTile(renderable.tile, renderable.renderData, renderable.segment);
}
}
}