From 4527d18a6753c9000b444604ddd80e5736ff00f7 Mon Sep 17 00:00:00 2001 From: Tim Sylvester Date: Tue, 30 May 2023 10:17:44 -0700 Subject: [PATCH] Drawable Renderer (#1570), Refactor tile matrix handling to account for translations --- include/mbgl/gfx/drawable.hpp | 4 ---- include/mbgl/gfx/drawable_builder.hpp | 4 ---- include/mbgl/renderer/layer_tweaker.hpp | 21 +++++++++++++---- src/mbgl/gfx/drawable.cpp | 2 -- src/mbgl/gfx/drawable_builder.cpp | 1 - src/mbgl/renderer/layer_tweaker.cpp | 23 ++++++++++++++++++- .../layers/background_layer_tweaker.cpp | 7 ++---- .../layers/background_layer_tweaker.hpp | 2 +- .../renderer/layers/circle_layer_tweaker.cpp | 19 ++++++++------- .../renderer/layers/circle_layer_tweaker.hpp | 2 +- .../renderer/layers/fill_layer_tweaker.cpp | 23 ++++++++++--------- .../renderer/layers/fill_layer_tweaker.hpp | 2 +- .../layers/render_background_layer.cpp | 3 --- .../renderer/layers/render_fill_layer.cpp | 6 ----- src/mbgl/renderer/render_tile.cpp | 13 +++++++++-- src/mbgl/renderer/render_tile.hpp | 7 ++++++ src/mbgl/renderer/renderer_impl.cpp | 2 +- 17 files changed, 86 insertions(+), 55 deletions(-) diff --git a/include/mbgl/gfx/drawable.hpp b/include/mbgl/gfx/drawable.hpp index 84a269ad5..f59e71aa3 100644 --- a/include/mbgl/gfx/drawable.hpp +++ b/include/mbgl/gfx/drawable.hpp @@ -120,9 +120,6 @@ public: std::optional getTileID() const { return tileID; } void setTileID(OverscaledTileID value) { tileID = value; } - mat4 getMatrix() const { return matrix; } - void setMatrix(mat4 value) { matrix = value; } - DepthMaskType getDepthType() const { return depthType; } void setDepthType(DepthMaskType value) { depthType = value; } @@ -162,7 +159,6 @@ protected: util::SimpleIdentity uniqueID; gfx::ShaderProgramBasePtr shader; mbgl::RenderPass renderPass; - mat4 matrix; //= matrix::identity4(); std::optional tileID; DrawPriority drawPriority = 0; int32_t lineWidth = 1; diff --git a/include/mbgl/gfx/drawable_builder.hpp b/include/mbgl/gfx/drawable_builder.hpp index d13584afc..c9e265528 100644 --- a/include/mbgl/gfx/drawable_builder.hpp +++ b/include/mbgl/gfx/drawable_builder.hpp @@ -113,9 +113,6 @@ public: /// @param location A sampler location in the shader being used. void setTexture(const std::shared_ptr& texture, int32_t location); - /// Set the matrix applied to new drawables - void setMatrix(mat4 value) { matrix = value; } - /// Add a triangle void addTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2); /// Add another triangle based on the previous two points @@ -169,7 +166,6 @@ protected: int32_t subLayerIndex = 0; DepthMaskType depthType = DepthMaskType::ReadOnly; gfx::ShaderProgramBasePtr shader; - mat4 matrix; UniqueDrawable currentDrawable; std::vector drawables; ColorAttrMode colorAttrMode = ColorAttrMode::PerVertex; diff --git a/include/mbgl/renderer/layer_tweaker.hpp b/include/mbgl/renderer/layer_tweaker.hpp index c59373327..bd10c3f7c 100644 --- a/include/mbgl/renderer/layer_tweaker.hpp +++ b/include/mbgl/renderer/layer_tweaker.hpp @@ -2,16 +2,21 @@ #include +#include #include namespace mbgl { - namespace style { class LayerProperties; +enum class TranslateAnchorType : bool; } // namespace style - -class PaintParameters; +class TransformState; class LayerGroup; +class PaintParameters; +class RenderTree; +class UnwrappedTileID; + +using mat4 = std::array; /** Base class for layer tweakers, which manipulate layer group per frame @@ -24,7 +29,15 @@ public: LayerTweaker() = delete; virtual ~LayerTweaker() = default; - virtual void execute(LayerGroup&, const PaintParameters&) = 0; + virtual void execute(LayerGroup&, const RenderTree&, const PaintParameters&) = 0; + +protected: + static mat4 getTileMatrix(const UnwrappedTileID&, + const RenderTree&, + const TransformState&, + const std::array& translation, + style::TranslateAnchorType, + bool inViewportPixelUnits); protected: Immutable evaluatedProperties; diff --git a/src/mbgl/gfx/drawable.cpp b/src/mbgl/gfx/drawable.cpp index 3929fedc6..c1c8a343c 100644 --- a/src/mbgl/gfx/drawable.cpp +++ b/src/mbgl/gfx/drawable.cpp @@ -3,7 +3,6 @@ #include #include #include -#include namespace mbgl { namespace gfx { @@ -15,7 +14,6 @@ struct Drawable::Impl { Drawable::Drawable(std::string name_) : name(name_), renderPass(RenderPass::Opaque), - matrix(matrix::identity4()), depthType(DepthMaskType::ReadOnly), impl(std::make_unique()) {} diff --git a/src/mbgl/gfx/drawable_builder.cpp b/src/mbgl/gfx/drawable_builder.cpp index 0e6071c38..979502b98 100644 --- a/src/mbgl/gfx/drawable_builder.cpp +++ b/src/mbgl/gfx/drawable_builder.cpp @@ -49,7 +49,6 @@ void DrawableBuilder::flush() { draw->setDepthType(depthType); draw->setCullFaceMode(impl->cullFaceMode); draw->setShader(shader); - draw->setMatrix(matrix); draw->setTextures(textures); if (auto drawAttrs = getVertexAttributes().clone()) { diff --git a/src/mbgl/renderer/layer_tweaker.cpp b/src/mbgl/renderer/layer_tweaker.cpp index 7f03d5a42..cf50ce056 100644 --- a/src/mbgl/renderer/layer_tweaker.cpp +++ b/src/mbgl/renderer/layer_tweaker.cpp @@ -1,9 +1,30 @@ #include + +#include #include +#include +#include +#include namespace mbgl { LayerTweaker::LayerTweaker(Immutable properties) - : evaluatedProperties(std::move(properties)){}; + : evaluatedProperties(std::move(properties)){} + +mat4 LayerTweaker::getTileMatrix(const UnwrappedTileID& tileID, + const RenderTree& renderTree, + const TransformState& state, + const std::array& translation, + style::TranslateAnchorType anchor, + bool inViewportPixelUnits) { + // from RenderTile::prepare + mat4 tileMatrix; + state.matrixFor(tileMatrix, tileID); + + const auto& projMatrix = renderTree.getParameters().transformParams.projMatrix; + matrix::multiply(tileMatrix, projMatrix, tileMatrix); + + return RenderTile::translateVtxMatrix(tileID, tileMatrix, translation, anchor, state, inViewportPixelUnits); +} } diff --git a/src/mbgl/renderer/layers/background_layer_tweaker.cpp b/src/mbgl/renderer/layers/background_layer_tweaker.cpp index 71fc3f77a..75d6bfb0e 100644 --- a/src/mbgl/renderer/layers/background_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/background_layer_tweaker.cpp @@ -40,7 +40,7 @@ struct alignas(16) BackgroundPatternLayerUBO { }; static_assert(sizeof(BackgroundPatternLayerUBO) % 16 == 0); -void BackgroundLayerTweaker::execute(LayerGroup& layerGroup, const PaintParameters& parameters) { +void BackgroundLayerTweaker::execute(LayerGroup& layerGroup, const RenderTree&, const PaintParameters& parameters) { const auto& evaluated = static_cast(*evaluatedProperties).evaluated; if (!layerUniformBuffer) { @@ -56,11 +56,8 @@ void BackgroundLayerTweaker::execute(LayerGroup& layerGroup, const PaintParamete if (!drawable.getTileID()) { return; } - mat4 matrix = drawable.getMatrix(); const UnwrappedTileID tileID = drawable.getTileID()->toUnwrapped(); - const auto tileMat = parameters.matrixForTile(tileID); - matrix::multiply(matrix, drawable.getMatrix(), tileMat); - matrix = tileMat; + const auto matrix = parameters.matrixForTile(tileID); BackgroundDrawableUBO drawableUBO; drawableUBO.matrix = util::cast(matrix); diff --git a/src/mbgl/renderer/layers/background_layer_tweaker.hpp b/src/mbgl/renderer/layers/background_layer_tweaker.hpp index 8256cda9f..0016ccc7a 100644 --- a/src/mbgl/renderer/layers/background_layer_tweaker.hpp +++ b/src/mbgl/renderer/layers/background_layer_tweaker.hpp @@ -20,7 +20,7 @@ public: public: ~BackgroundLayerTweaker() override = default; - void execute(LayerGroup&, const PaintParameters&) override; + void execute(LayerGroup&, const RenderTree&, const PaintParameters&) override; protected: gfx::UniformBufferPtr layerUniformBuffer = nullptr; diff --git a/src/mbgl/renderer/layers/circle_layer_tweaker.cpp b/src/mbgl/renderer/layers/circle_layer_tweaker.cpp index f0db6c615..70dd7d9c1 100644 --- a/src/mbgl/renderer/layers/circle_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/circle_layer_tweaker.cpp @@ -1,9 +1,11 @@ #include -#include -#include -#include + #include #include +#include +#include +#include +#include #include namespace mbgl { @@ -50,7 +52,7 @@ struct alignas(16) CircleInterpolateUBO { }; static_assert(sizeof(CircleInterpolateUBO) % 16 == 0); -void CircleLayerTweaker::execute(LayerGroup& layerGroup, const PaintParameters& parameters) { +void CircleLayerTweaker::execute(LayerGroup& layerGroup, const RenderTree& renderTree, const PaintParameters& parameters) { const auto& evaluated = static_cast(*evaluatedProperties).evaluated; CirclePaintParamsUBO paintParamsUBO; @@ -93,11 +95,12 @@ void CircleLayerTweaker::execute(LayerGroup& layerGroup, const PaintParameters& if (!drawable.getTileID()) { return; } - mat4 matrix = drawable.getMatrix(); const UnwrappedTileID tileID = drawable.getTileID()->toUnwrapped(); - const auto tileMat = parameters.matrixForTile(tileID); - matrix::multiply(matrix, drawable.getMatrix(), tileMat); - matrix = tileMat; + + const auto& translation = evaluated.get(); + const auto anchor = evaluated.get(); + constexpr bool inViewportPixelUnits = false; // from RenderTile::translatedMatrix + const auto matrix = getTileMatrix(tileID, renderTree, parameters.state, translation, anchor, inViewportPixelUnits); CircleDrawableUBO drawableUBO; drawableUBO.matrix = util::cast(matrix); diff --git a/src/mbgl/renderer/layers/circle_layer_tweaker.hpp b/src/mbgl/renderer/layers/circle_layer_tweaker.hpp index 14ab04f09..9915a897d 100644 --- a/src/mbgl/renderer/layers/circle_layer_tweaker.hpp +++ b/src/mbgl/renderer/layers/circle_layer_tweaker.hpp @@ -20,7 +20,7 @@ public: public: ~CircleLayerTweaker() override = default; - void execute(LayerGroup&, const PaintParameters&) override; + void execute(LayerGroup&, const RenderTree&, const PaintParameters&) override; protected: gfx::UniformBufferPtr evaluatedPropsUniformBuffer = nullptr; diff --git a/src/mbgl/renderer/layers/fill_layer_tweaker.cpp b/src/mbgl/renderer/layers/fill_layer_tweaker.cpp index 3a98528ef..9b03e80a0 100644 --- a/src/mbgl/renderer/layers/fill_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/fill_layer_tweaker.cpp @@ -1,11 +1,14 @@ #include -#include -#include -#include + #include #include #include #include +#include +#include +#include +#include +#include #include namespace mbgl { @@ -44,9 +47,9 @@ struct alignas(16) FillDrawableUBO { }; static_assert(sizeof(FillDrawableUBO) == 208); -void FillLayerTweaker::execute(LayerGroup& layerGroup, const PaintParameters& parameters) { +void FillLayerTweaker::execute(LayerGroup& layerGroup, const RenderTree& renderTree, const PaintParameters& parameters) { const auto& props = static_cast(*evaluatedProperties); - // const auto& evaluated = props.evaluated; + const auto& evaluated = props.evaluated; const auto& crossfade = props.crossfade; layerGroup.observeDrawables([&](gfx::Drawable& drawable) { @@ -69,14 +72,12 @@ void FillLayerTweaker::execute(LayerGroup& layerGroup, const PaintParameters& pa auto uniformBuffer = context.createUniformBuffer(&drawableUBO, sizeof(drawableUBO)); drawable.mutableUniformBuffers().addOrReplace("DrawableUBO", uniformBuffer);*/ - mat4 matrix = drawable.getMatrix(); const UnwrappedTileID tileID = drawable.getTileID()->toUnwrapped(); - const auto tileMat = parameters.matrixForTile(tileID); - matrix::multiply(matrix, drawable.getMatrix(), tileMat); - matrix = tileMat; - // matrix = tile.translatedMatrix(evaluated.get(), evaluated.get(), - // parameters.state), + const auto& translation = evaluated.get(); + const auto anchor = evaluated.get(); + constexpr bool inViewportPixelUnits = false; // from RenderTile::translatedMatrix + const auto matrix = getTileMatrix(tileID, renderTree, parameters.state, translation, anchor, inViewportPixelUnits); // from FillPatternProgram::layoutUniformValues const auto renderableSize = parameters.backend.getDefaultRenderable().getSize(); diff --git a/src/mbgl/renderer/layers/fill_layer_tweaker.hpp b/src/mbgl/renderer/layers/fill_layer_tweaker.hpp index 05cff0793..92a601520 100644 --- a/src/mbgl/renderer/layers/fill_layer_tweaker.hpp +++ b/src/mbgl/renderer/layers/fill_layer_tweaker.hpp @@ -15,7 +15,7 @@ public: public: ~FillLayerTweaker() override = default; - void execute(LayerGroup&, const PaintParameters&) override; + void execute(LayerGroup&, const RenderTree&, const PaintParameters&) override; }; } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_background_layer.cpp b/src/mbgl/renderer/layers/render_background_layer.cpp index ac031230b..64a5851d0 100644 --- a/src/mbgl/renderer/layers/render_background_layer.cpp +++ b/src/mbgl/renderer/layers/render_background_layer.cpp @@ -315,9 +315,6 @@ void RenderBackgroundLayer::update(gfx::ShaderRegistry& shaders, // Tile coordinates are fixed... builder->addQuad(0, 0, util::EXTENT, util::EXTENT); - // ... they're placed with the matrix in the uniforms, which changes with the view - builder->setMatrix(/*parameters.matrixForTile(tileID.toUnwrapped())*/ matrix::identity4()); - builder->flush(); auto newDrawables = builder->clearDrawables(); diff --git a/src/mbgl/renderer/layers/render_fill_layer.cpp b/src/mbgl/renderer/layers/render_fill_layer.cpp index 8a6508bf6..a156bc8e2 100644 --- a/src/mbgl/renderer/layers/render_fill_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_layer.cpp @@ -492,9 +492,6 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders, // FillOutlineProgram::TextureBindings{}); // } - // tile.translatedMatrix(evaluated.get(), evaluated.get(), - // parameters.state) - if (fillBuilder) { fillBuilder->setRenderPass(renderPass); fillBuilder->setVertexAttributes(fillVertexAttrs); @@ -600,9 +597,6 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders, // // const auto allUniformValues = programInstance.computeAllUniformValues( // FillPatternProgram::layoutUniformValues( - // tile.translatedMatrix( - // evaluated.get(), evaluated.get(), - // parameters.state), // parameters.backend.getDefaultRenderable().getSize(), // tile.getIconAtlasTexture().size, // crossfade, diff --git a/src/mbgl/renderer/render_tile.cpp b/src/mbgl/renderer/render_tile.cpp index 36994f593..d5de5280f 100644 --- a/src/mbgl/renderer/render_tile.cpp +++ b/src/mbgl/renderer/render_tile.cpp @@ -22,11 +22,12 @@ RenderTile::RenderTile(UnwrappedTileID id_, Tile& tile_) RenderTile::~RenderTile() = default; -mat4 RenderTile::translateVtxMatrix(const mat4& tileMatrix, +mat4 RenderTile::translateVtxMatrix(const UnwrappedTileID& id, + const mat4& tileMatrix, const std::array& translation, TranslateAnchorType anchor, const TransformState& state, - const bool inViewportPixelUnits) const { + const bool inViewportPixelUnits) { if (translation[0] == 0 && translation[1] == 0) { return tileMatrix; } @@ -53,6 +54,14 @@ mat4 RenderTile::translateVtxMatrix(const mat4& tileMatrix, return vtxMatrix; } +mat4 RenderTile::translateVtxMatrix(const mat4& tileMatrix, + const std::array& translation, + TranslateAnchorType anchor, + const TransformState& state, + const bool inViewportPixelUnits) const { + return translateVtxMatrix(id, tileMatrix, translation, anchor, state, inViewportPixelUnits); +} + mat4 RenderTile::translatedMatrix(const std::array& translation, TranslateAnchorType anchor, const TransformState& state) const { diff --git a/src/mbgl/renderer/render_tile.hpp b/src/mbgl/renderer/render_tile.hpp index 9f4dc0db2..c887ad337 100644 --- a/src/mbgl/renderer/render_tile.hpp +++ b/src/mbgl/renderer/render_tile.hpp @@ -62,6 +62,13 @@ public: void prepare(const SourcePrepareParameters&); void finishRender(PaintParameters&) const; + static mat4 translateVtxMatrix(const UnwrappedTileID& id, + const mat4& tileMatrix, + const std::array& translation, + style::TranslateAnchorType anchor, + const TransformState& state, + bool inViewportPixelUnits); + mat4 translateVtxMatrix(const mat4& tileMatrix, const std::array& translation, style::TranslateAnchorType anchor, diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index aad69f756..ba9a70a47 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -120,7 +120,7 @@ void Renderer::Impl::render(const RenderTree& renderTree) { // Run layer tweakers to update any dynamic elements orchestrator.observeLayerGroups([&](LayerGroup& layerGroup) { if (layerGroup.getLayerTweaker()) { - layerGroup.getLayerTweaker()->execute(layerGroup, parameters); + layerGroup.getLayerTweaker()->execute(layerGroup, renderTree, parameters); } });