From aebb7d3bded020f21582a8df2f16110e2949107b Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Sun, 19 May 2019 11:41:22 +0300 Subject: [core] Prepare render sources before render layers are initialized --- src/mbgl/annotation/render_annotation_source.cpp | 2 +- src/mbgl/annotation/render_annotation_source.hpp | 2 +- src/mbgl/renderer/paint_parameters.cpp | 31 +++++++++++++--------- src/mbgl/renderer/paint_parameters.hpp | 16 ++++++++--- src/mbgl/renderer/render_source.cpp | 2 ++ src/mbgl/renderer/render_source.hpp | 11 +++++++- src/mbgl/renderer/render_tile.cpp | 13 +++++---- src/mbgl/renderer/render_tile.hpp | 4 ++- src/mbgl/renderer/renderer_impl.cpp | 26 ++++++++---------- .../sources/render_custom_geometry_source.cpp | 2 +- .../sources/render_custom_geometry_source.hpp | 2 +- .../renderer/sources/render_geojson_source.cpp | 2 +- .../renderer/sources/render_geojson_source.hpp | 2 +- src/mbgl/renderer/sources/render_image_source.cpp | 8 +++--- src/mbgl/renderer/sources/render_image_source.hpp | 2 +- .../renderer/sources/render_raster_dem_source.cpp | 2 +- .../renderer/sources/render_raster_dem_source.hpp | 2 +- src/mbgl/renderer/sources/render_raster_source.cpp | 2 +- src/mbgl/renderer/sources/render_raster_source.hpp | 2 +- src/mbgl/renderer/sources/render_vector_source.cpp | 2 +- src/mbgl/renderer/sources/render_vector_source.hpp | 2 +- src/mbgl/renderer/tile_pyramid.cpp | 2 +- src/mbgl/renderer/tile_pyramid.hpp | 3 ++- 23 files changed, 84 insertions(+), 58 deletions(-) diff --git a/src/mbgl/annotation/render_annotation_source.cpp b/src/mbgl/annotation/render_annotation_source.cpp index fcf9a8d8a7..c90b73dad9 100644 --- a/src/mbgl/annotation/render_annotation_source.cpp +++ b/src/mbgl/annotation/render_annotation_source.cpp @@ -51,7 +51,7 @@ void RenderAnnotationSource::upload(gfx::UploadPass& uploadPass) { tilePyramid.upload(uploadPass); } -void RenderAnnotationSource::prepare(PaintParameters& parameters) { +void RenderAnnotationSource::prepare(const SourcePrepareParameters& parameters) { tilePyramid.prepare(parameters); } diff --git a/src/mbgl/annotation/render_annotation_source.hpp b/src/mbgl/annotation/render_annotation_source.hpp index 46fd9ed06f..8267fea39e 100644 --- a/src/mbgl/annotation/render_annotation_source.hpp +++ b/src/mbgl/annotation/render_annotation_source.hpp @@ -19,7 +19,7 @@ public: const TileParameters&) final; void upload(gfx::UploadPass&) final; - void prepare(PaintParameters&) final; + void prepare(const SourcePrepareParameters&) final; void finishRender(PaintParameters&) final; std::vector> getRenderTiles() final; diff --git a/src/mbgl/renderer/paint_parameters.cpp b/src/mbgl/renderer/paint_parameters.cpp index 38cdb11f9f..d8d9cb55dc 100644 --- a/src/mbgl/renderer/paint_parameters.cpp +++ b/src/mbgl/renderer/paint_parameters.cpp @@ -10,11 +10,27 @@ namespace mbgl { +TransformParameters::TransformParameters(const TransformState& state_) + : state(state_) { + // Update the default matrices to the current viewport dimensions. + state.getProjMatrix(projMatrix); + + // Also compute a projection matrix that aligns with the current pixel grid, taking into account + // odd viewport sizes. + state.getProjMatrix(alignedProjMatrix, 1, true); + + // Calculate a second projection matrix with the near plane clipped to 100 so as + // not to waste lots of depth buffer precision on very close empty space, for layer + // types (fill-extrusion) that use the depth buffer to emulate real-world space. + state.getProjMatrix(nearClippedProjMatrix, 100); +} + PaintParameters::PaintParameters(gfx::Context& context_, float pixelRatio_, gfx::RendererBackend& backend_, const UpdateParameters& updateParameters, const EvaluatedLight& evaluatedLight_, + const TransformParameters& transformParams_, RenderStaticData& staticData_, ImageManager& imageManager_, LineAtlas& lineAtlas_) @@ -23,6 +39,7 @@ PaintParameters::PaintParameters(gfx::Context& context_, encoder(context.createCommandEncoder()), state(updateParameters.transformState), evaluatedLight(evaluatedLight_), + transformParams(transformParams_), staticData(staticData_), imageManager(imageManager_), lineAtlas(lineAtlas_), @@ -36,18 +53,6 @@ PaintParameters::PaintParameters(gfx::Context& context_, programs(staticData_.programs) #endif { - // Update the default matrices to the current viewport dimensions. - state.getProjMatrix(projMatrix); - - // Also compute a projection matrix that aligns with the current pixel grid, taking into account - // odd viewport sizes. - state.getProjMatrix(alignedProjMatrix, 1, true); - - // Calculate a second projection matrix with the near plane clipped to 100 so as - // not to waste lots of depth buffer precision on very close empty space, for layer - // types (fill-extrusion) that use the depth buffer to emulate real-world space. - state.getProjMatrix(nearClippedProjMatrix, 100); - pixelsToGLUnits = {{ 2.0f / state.getSize().width, -2.0f / state.getSize().height }}; if (state.getViewportMode() == ViewportMode::FlippedY) { @@ -60,7 +65,7 @@ PaintParameters::~PaintParameters() = default; mat4 PaintParameters::matrixForTile(const UnwrappedTileID& tileID, bool aligned) const { mat4 matrix; state.matrixFor(matrix, tileID); - matrix::multiply(matrix, aligned ? alignedProjMatrix : projMatrix, matrix); + matrix::multiply(matrix, aligned ? transformParams.alignedProjMatrix : transformParams.projMatrix, matrix); return matrix; } diff --git a/src/mbgl/renderer/paint_parameters.hpp b/src/mbgl/renderer/paint_parameters.hpp index 245f6704d2..84106bcd50 100644 --- a/src/mbgl/renderer/paint_parameters.hpp +++ b/src/mbgl/renderer/paint_parameters.hpp @@ -31,6 +31,16 @@ class CommandEncoder; class RenderPass; } // namespace gfx + +class TransformParameters { +public: + TransformParameters(const TransformState&); + mat4 projMatrix; + mat4 alignedProjMatrix; + mat4 nearClippedProjMatrix; + const TransformState& state; +}; + class PaintParameters { public: PaintParameters(gfx::Context&, @@ -38,6 +48,7 @@ public: gfx::RendererBackend&, const UpdateParameters&, const EvaluatedLight&, + const TransformParameters&, RenderStaticData&, ImageManager&, LineAtlas&); @@ -50,6 +61,7 @@ public: const TransformState& state; const EvaluatedLight& evaluatedLight; + const TransformParameters& transformParams; RenderStaticData& staticData; ImageManager& imageManager; @@ -71,10 +83,6 @@ public: mat4 matrixForTile(const UnwrappedTileID&, bool aligned = false) const; - mat4 projMatrix; - mat4 alignedProjMatrix; - mat4 nearClippedProjMatrix; - // Stencil handling public: void renderTileClippingMasks(const std::vector>&); diff --git a/src/mbgl/renderer/render_source.cpp b/src/mbgl/renderer/render_source.cpp index 81638605f0..d0f5689a9e 100644 --- a/src/mbgl/renderer/render_source.cpp +++ b/src/mbgl/renderer/render_source.cpp @@ -55,6 +55,8 @@ RenderSource::RenderSource(Immutable impl) observer(&nullObserver) { } +RenderSource::~RenderSource() = default; + void RenderSource::setObserver(RenderSourceObserver* observer_) { observer = observer_; } diff --git a/src/mbgl/renderer/render_source.hpp b/src/mbgl/renderer/render_source.hpp index 2e433c01f9..cea45cfaca 100644 --- a/src/mbgl/renderer/render_source.hpp +++ b/src/mbgl/renderer/render_source.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -26,14 +27,22 @@ class Tile; class RenderSourceObserver; class TileParameters; class CollisionIndex; +class TransformParameters; namespace gfx { class UploadPass; } // namespace gfx +class SourcePrepareParameters { +public: + const TransformParameters& transform; + const MapDebugOptions& debugOptions; +}; + class RenderSource : protected TileObserver { public: static std::unique_ptr create(Immutable); + virtual ~RenderSource(); // Check whether this source is of the given subtype. template @@ -60,7 +69,7 @@ public: const TileParameters&) = 0; virtual void upload(gfx::UploadPass&) = 0; - virtual void prepare(PaintParameters&) = 0; + virtual void prepare(const SourcePrepareParameters&) = 0; virtual void finishRender(PaintParameters&) = 0; // Returns a list of RenderTiles, sorted by tile id. diff --git a/src/mbgl/renderer/render_tile.cpp b/src/mbgl/renderer/render_tile.cpp index 828163bd6e..3a2c2de5e3 100644 --- a/src/mbgl/renderer/render_tile.cpp +++ b/src/mbgl/renderer/render_tile.cpp @@ -1,6 +1,8 @@ #include + #include #include +#include #include #include #include @@ -70,7 +72,7 @@ void RenderTile::upload(gfx::UploadPass& uploadPass) { } } -void RenderTile::prepare(PaintParameters& parameters) { +void RenderTile::prepare(const SourcePrepareParameters& parameters) { if (parameters.debugOptions != MapDebugOptions::NoDebug && (!debugBucket || debugBucket->renderable != tile.isRenderable() || debugBucket->complete != tile.isComplete() || @@ -86,10 +88,11 @@ void RenderTile::prepare(PaintParameters& parameters) { // Calculate two matrices for this tile: matrix is the standard tile matrix; nearClippedMatrix // clips the near plane to 100 to save depth buffer precision - parameters.state.matrixFor(matrix, id); - parameters.state.matrixFor(nearClippedMatrix, id); - matrix::multiply(matrix, parameters.projMatrix, matrix); - matrix::multiply(nearClippedMatrix, parameters.nearClippedProjMatrix, nearClippedMatrix); + const auto& transform = parameters.transform; + transform.state.matrixFor(matrix, id); + transform.state.matrixFor(nearClippedMatrix, id); + matrix::multiply(matrix, transform.projMatrix, matrix); + matrix::multiply(nearClippedMatrix, transform.nearClippedProjMatrix, nearClippedMatrix); } void RenderTile::finishRender(PaintParameters& parameters) { diff --git a/src/mbgl/renderer/render_tile.hpp b/src/mbgl/renderer/render_tile.hpp index 559f37a090..552a093ab7 100644 --- a/src/mbgl/renderer/render_tile.hpp +++ b/src/mbgl/renderer/render_tile.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -18,6 +19,7 @@ class Tile; class TransformState; class PaintParameters; class DebugBucket; +class SourcePrepareParameters; class RenderTile final { public: @@ -46,7 +48,7 @@ public: void setMask(TileMask&&); void upload(gfx::UploadPass&); - void prepare(PaintParameters&); + void prepare(const SourcePrepareParameters&); void finishRender(PaintParameters&); mat4 translateVtxMatrix(const mat4& tileMatrix, diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index 76c45aef76..640ae9bd5f 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -291,6 +291,15 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { observer->onWillStartRenderingFrame(); + TransformParameters transformParams(updateParameters.transformState); + + // Update all matrices and generate data that we should upload to the GPU. + for (const auto& entry : renderSources) { + if (entry.second->isEnabled()) { + entry.second->prepare({transformParams, updateParameters.debugOptions}); + } + } + // Set render tiles to the render items. for (auto& renderItem : renderItems) { if (!renderItem.source) { @@ -312,13 +321,11 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { bool symbolBucketsChanged = false; const bool placementChanged = !placement->stillRecent(updateParameters.timePoint); std::set usedSymbolLayers; - mat4 projMatrix; if (placementChanged) { placement = std::make_unique( updateParameters.transformState, updateParameters.mode, updateParameters.transitionOptions, updateParameters.crossSourceCollisions, std::move(placement)); - updateParameters.transformState.getProjMatrix(projMatrix); } for (auto it = layersNeedPlacement.rbegin(); it != layersNeedPlacement.rend(); ++it) { @@ -327,7 +334,7 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { if (placementChanged) { usedSymbolLayers.insert(layer.getID()); - placement->placeLayer(layer, projMatrix, updateParameters.debugOptions & MapDebugOptions::Collision); + placement->placeLayer(layer, transformParams.projMatrix, updateParameters.debugOptions & MapDebugOptions::Collision); } } @@ -357,6 +364,7 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { backend, updateParameters, renderLight.getEvaluated(), + transformParams, *staticData, *imageManager, *lineAtlas, @@ -364,18 +372,6 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { parameters.symbolFadeChange = placement->symbolFadeChange(updateParameters.timePoint); - // TODO: move this pass to before the PaintParameters initialization - // - PREPARE PASS ------------------------------------------------------------------------------- - // Runs an initialization pass for all sources. - { - // Update all matrices and generate data that we should upload to the GPU. - for (const auto& entry : renderSources) { - if (entry.second->isEnabled()) { - entry.second->prepare(parameters); - } - } - } - // - UPLOAD PASS ------------------------------------------------------------------------------- // Uploads all required buffers and images before we do any actual rendering. { diff --git a/src/mbgl/renderer/sources/render_custom_geometry_source.cpp b/src/mbgl/renderer/sources/render_custom_geometry_source.cpp index 45d49ffa5b..9746d84599 100644 --- a/src/mbgl/renderer/sources/render_custom_geometry_source.cpp +++ b/src/mbgl/renderer/sources/render_custom_geometry_source.cpp @@ -51,7 +51,7 @@ void RenderCustomGeometrySource::upload(gfx::UploadPass& uploadPass) { tilePyramid.upload(uploadPass); } -void RenderCustomGeometrySource::prepare(PaintParameters& parameters) { +void RenderCustomGeometrySource::prepare(const SourcePrepareParameters& parameters) { tilePyramid.prepare(parameters); } diff --git a/src/mbgl/renderer/sources/render_custom_geometry_source.hpp b/src/mbgl/renderer/sources/render_custom_geometry_source.hpp index 485979bee9..aac6fe221b 100644 --- a/src/mbgl/renderer/sources/render_custom_geometry_source.hpp +++ b/src/mbgl/renderer/sources/render_custom_geometry_source.hpp @@ -19,7 +19,7 @@ public: const TileParameters&) final; void upload(gfx::UploadPass&) final; - void prepare(PaintParameters&) final; + void prepare(const SourcePrepareParameters&) final; void finishRender(PaintParameters&) final; std::vector> getRenderTiles() final; diff --git a/src/mbgl/renderer/sources/render_geojson_source.cpp b/src/mbgl/renderer/sources/render_geojson_source.cpp index 7ff371620a..c43b44934e 100644 --- a/src/mbgl/renderer/sources/render_geojson_source.cpp +++ b/src/mbgl/renderer/sources/render_geojson_source.cpp @@ -127,7 +127,7 @@ void RenderGeoJSONSource::upload(gfx::UploadPass& parameters) { tilePyramid.upload(parameters); } -void RenderGeoJSONSource::prepare(PaintParameters& parameters) { +void RenderGeoJSONSource::prepare(const SourcePrepareParameters& parameters) { tilePyramid.prepare(parameters); } diff --git a/src/mbgl/renderer/sources/render_geojson_source.hpp b/src/mbgl/renderer/sources/render_geojson_source.hpp index 1a2ff55427..f2b0014ac4 100644 --- a/src/mbgl/renderer/sources/render_geojson_source.hpp +++ b/src/mbgl/renderer/sources/render_geojson_source.hpp @@ -24,7 +24,7 @@ public: const TileParameters&) final; void upload(gfx::UploadPass&) final; - void prepare(PaintParameters&) final; + void prepare(const SourcePrepareParameters&) final; void finishRender(PaintParameters&) final; std::vector> getRenderTiles() final; diff --git a/src/mbgl/renderer/sources/render_image_source.cpp b/src/mbgl/renderer/sources/render_image_source.cpp index e63c9ad15c..2c6538221f 100644 --- a/src/mbgl/renderer/sources/render_image_source.cpp +++ b/src/mbgl/renderer/sources/render_image_source.cpp @@ -37,18 +37,18 @@ void RenderImageSource::upload(gfx::UploadPass& uploadPass) { } } -void RenderImageSource::prepare(PaintParameters& parameters) { +void RenderImageSource::prepare(const SourcePrepareParameters& parameters) { if (!isLoaded()) { return; } matrices.clear(); - + const auto& transformParams = parameters.transform; for (auto& tileId : tileIds) { mat4 matrix; matrix::identity(matrix); - parameters.state.matrixFor(matrix, tileId); - matrix::multiply(matrix, parameters.alignedProjMatrix, matrix); + transformParams.state.matrixFor(matrix, tileId); + matrix::multiply(matrix, transformParams.alignedProjMatrix, matrix); matrices.push_back(matrix); } } diff --git a/src/mbgl/renderer/sources/render_image_source.hpp b/src/mbgl/renderer/sources/render_image_source.hpp index c07fd467cb..cdc866ea5c 100644 --- a/src/mbgl/renderer/sources/render_image_source.hpp +++ b/src/mbgl/renderer/sources/render_image_source.hpp @@ -16,7 +16,7 @@ public: bool isLoaded() const final; void upload(gfx::UploadPass&) final; - void prepare(PaintParameters&) final; + void prepare(const SourcePrepareParameters&) final; void finishRender(PaintParameters&) final; void update(Immutable, diff --git a/src/mbgl/renderer/sources/render_raster_dem_source.cpp b/src/mbgl/renderer/sources/render_raster_dem_source.cpp index c9f17f38c4..9962e26337 100644 --- a/src/mbgl/renderer/sources/render_raster_dem_source.cpp +++ b/src/mbgl/renderer/sources/render_raster_dem_source.cpp @@ -130,7 +130,7 @@ void RenderRasterDEMSource::upload(gfx::UploadPass& parameters) { tilePyramid.upload(parameters); } -void RenderRasterDEMSource::prepare(PaintParameters& parameters) { +void RenderRasterDEMSource::prepare(const SourcePrepareParameters& parameters) { algorithm::updateTileMasks(tilePyramid.getRenderTiles()); tilePyramid.prepare(parameters); } diff --git a/src/mbgl/renderer/sources/render_raster_dem_source.hpp b/src/mbgl/renderer/sources/render_raster_dem_source.hpp index 57180bb4e2..712f4fefaa 100644 --- a/src/mbgl/renderer/sources/render_raster_dem_source.hpp +++ b/src/mbgl/renderer/sources/render_raster_dem_source.hpp @@ -19,7 +19,7 @@ public: const TileParameters&) final; void upload(gfx::UploadPass&) final; - void prepare(PaintParameters&) final; + void prepare(const SourcePrepareParameters&) final; void finishRender(PaintParameters&) final; std::vector> getRenderTiles() final; diff --git a/src/mbgl/renderer/sources/render_raster_source.cpp b/src/mbgl/renderer/sources/render_raster_source.cpp index 39cccd47e6..d7dec8ff17 100644 --- a/src/mbgl/renderer/sources/render_raster_source.cpp +++ b/src/mbgl/renderer/sources/render_raster_source.cpp @@ -61,7 +61,7 @@ void RenderRasterSource::upload(gfx::UploadPass& parameters) { tilePyramid.upload(parameters); } -void RenderRasterSource::prepare(PaintParameters& parameters) { +void RenderRasterSource::prepare(const SourcePrepareParameters& parameters) { algorithm::updateTileMasks(tilePyramid.getRenderTiles()); tilePyramid.prepare(parameters); } diff --git a/src/mbgl/renderer/sources/render_raster_source.hpp b/src/mbgl/renderer/sources/render_raster_source.hpp index e399893cb9..74f81a1397 100644 --- a/src/mbgl/renderer/sources/render_raster_source.hpp +++ b/src/mbgl/renderer/sources/render_raster_source.hpp @@ -19,7 +19,7 @@ public: const TileParameters&) final; void upload(gfx::UploadPass&) final; - void prepare(PaintParameters&) final; + void prepare(const SourcePrepareParameters&) final; void finishRender(PaintParameters&) final; std::vector> getRenderTiles() final; diff --git a/src/mbgl/renderer/sources/render_vector_source.cpp b/src/mbgl/renderer/sources/render_vector_source.cpp index 21b728e266..36fc69d988 100644 --- a/src/mbgl/renderer/sources/render_vector_source.cpp +++ b/src/mbgl/renderer/sources/render_vector_source.cpp @@ -61,7 +61,7 @@ void RenderVectorSource::upload(gfx::UploadPass& parameters) { tilePyramid.upload(parameters); } -void RenderVectorSource::prepare(PaintParameters& parameters) { +void RenderVectorSource::prepare(const SourcePrepareParameters& parameters) { tilePyramid.prepare(parameters); } diff --git a/src/mbgl/renderer/sources/render_vector_source.hpp b/src/mbgl/renderer/sources/render_vector_source.hpp index bea9bad20e..fd37e1e4fd 100644 --- a/src/mbgl/renderer/sources/render_vector_source.hpp +++ b/src/mbgl/renderer/sources/render_vector_source.hpp @@ -19,7 +19,7 @@ public: const TileParameters&) final; void upload(gfx::UploadPass&) final; - void prepare(PaintParameters&) final; + void prepare(const SourcePrepareParameters&) final; void finishRender(PaintParameters&) final; std::vector> getRenderTiles() final; diff --git a/src/mbgl/renderer/tile_pyramid.cpp b/src/mbgl/renderer/tile_pyramid.cpp index 36ac0162e6..51999c0aac 100644 --- a/src/mbgl/renderer/tile_pyramid.cpp +++ b/src/mbgl/renderer/tile_pyramid.cpp @@ -46,7 +46,7 @@ void TilePyramid::upload(gfx::UploadPass& parameters) { } } -void TilePyramid::prepare(PaintParameters& parameters) { +void TilePyramid::prepare(const SourcePrepareParameters& parameters) { for (auto& tile : renderTiles) { tile.prepare(parameters); } diff --git a/src/mbgl/renderer/tile_pyramid.hpp b/src/mbgl/renderer/tile_pyramid.hpp index c912a669ff..5dbdae5d38 100644 --- a/src/mbgl/renderer/tile_pyramid.hpp +++ b/src/mbgl/renderer/tile_pyramid.hpp @@ -25,6 +25,7 @@ class RenderLayer; class RenderedQueryOptions; class SourceQueryOptions; class TileParameters; +class SourcePrepareParameters; class TilePyramid { public: @@ -44,7 +45,7 @@ public: std::function (const OverscaledTileID&)> createTile); void upload(gfx::UploadPass&); - void prepare(PaintParameters&); + void prepare(const SourcePrepareParameters&); void finishRender(PaintParameters&); std::vector> getRenderTiles(); -- cgit v1.2.1