diff options
Diffstat (limited to 'src/mbgl/renderer/layers')
-rw-r--r-- | src/mbgl/renderer/layers/render_background_layer.cpp | 10 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp | 15 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_fill_layer.cpp | 9 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_heatmap_layer.cpp | 12 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_hillshade_layer.cpp | 26 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_line_layer.cpp | 18 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_raster_layer.cpp | 31 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_symbol_layer.cpp | 32 |
8 files changed, 91 insertions, 62 deletions
diff --git a/src/mbgl/renderer/layers/render_background_layer.cpp b/src/mbgl/renderer/layers/render_background_layer.cpp index 61c8fa208e..ae89a08cac 100644 --- a/src/mbgl/renderer/layers/render_background_layer.cpp +++ b/src/mbgl/renderer/layers/render_background_layer.cpp @@ -50,7 +50,7 @@ void RenderBackgroundLayer::render(PaintParameters& parameters, RenderSource*) { const Properties<>::PossiblyEvaluated properties; const BackgroundProgram::Binders paintAttributeData(properties, 0); - auto draw = [&](auto& program, auto&& uniformValues, auto&& textureBindings) { + auto draw = [&](auto& program, auto&& uniformValues, const auto& textureBindings) { const auto allUniformValues = program.computeAllUniformValues( std::move(uniformValues), paintAttributeData, @@ -76,7 +76,7 @@ void RenderBackgroundLayer::render(PaintParameters& parameters, RenderSource*) { parameters.staticData.tileTriangleSegments, allUniformValues, allAttributeBindings, - std::move(textureBindings), + textureBindings, getID() ); }; @@ -88,8 +88,6 @@ void RenderBackgroundLayer::render(PaintParameters& parameters, RenderSource*) { if (!imagePosA || !imagePosB) return; - parameters.imageManager.bind(parameters.context, 0); - for (const auto& tileID : util::tileCover(parameters.state, parameters.state.getIntegerZoom())) { draw( parameters.programs.getBackgroundLayerPrograms().backgroundPattern, @@ -103,7 +101,9 @@ void RenderBackgroundLayer::render(PaintParameters& parameters, RenderSource*) { tileID, parameters.state ), - BackgroundPatternProgram::TextureBindings{} + BackgroundPatternProgram::TextureBindings{ + textures::u_image::Value{ parameters.imageManager.textureBinding(parameters.context) }, + } ); } } else { diff --git a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp index 5699bc5d4a..99bdc3a8c6 100644 --- a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp @@ -140,7 +140,6 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource* GeometryTile& geometryTile = static_cast<GeometryTile&>(tile.tile); optional<ImagePosition> patternPosA = geometryTile.getPattern(fillPatternValue.from); optional<ImagePosition> patternPosB = geometryTile.getPattern(fillPatternValue.to); - parameters.context.bindTexture(*geometryTile.iconAtlasTexture, 0, gfx::TextureFilterType::Linear); FillExtrusionBucket& bucket = *bucket_; draw( @@ -160,14 +159,14 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource* ), patternPosA, patternPosB, - FillExtrusionPatternProgram::TextureBindings{} + FillExtrusionPatternProgram::TextureBindings{ + textures::u_image::Value{ *geometryTile.iconAtlasTexture->resource, gfx::TextureFilterType::Linear }, + } ); } } } else if (parameters.pass == RenderPass::Translucent) { - parameters.context.bindTexture(renderTexture->getTexture()); - const auto& size = parameters.staticData.backendSize; mat4 viewportMat; @@ -180,8 +179,8 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource* const auto allUniformValues = programInstance.computeAllUniformValues( ExtrusionTextureProgram::UniformValues{ - uniforms::u_matrix::Value( viewportMat ), uniforms::u_world::Value( size ), - uniforms::u_image::Value( 0 ), + uniforms::u_matrix::Value( viewportMat ), + uniforms::u_world::Value( size ), uniforms::u_opacity::Value( evaluated.get<FillExtrusionOpacity>() ) }, paintAttributeData, @@ -207,7 +206,9 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource* parameters.staticData.extrusionTextureSegments, allUniformValues, allAttributeBindings, - ExtrusionTextureProgram::TextureBindings{}, + ExtrusionTextureProgram::TextureBindings{ + textures::u_image::Value{ *renderTexture->getTexture().resource }, + }, getID()); } } diff --git a/src/mbgl/renderer/layers/render_fill_layer.cpp b/src/mbgl/renderer/layers/render_fill_layer.cpp index 798749711d..3e36561ffb 100644 --- a/src/mbgl/renderer/layers/render_fill_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_layer.cpp @@ -152,7 +152,6 @@ void RenderFillLayer::render(PaintParameters& parameters, RenderSource*) { optional<ImagePosition> patternPosA = geometryTile.getPattern(fillPatternValue.from); optional<ImagePosition> patternPosB = geometryTile.getPattern(fillPatternValue.to); - parameters.context.bindTexture(*geometryTile.iconAtlasTexture, 0, gfx::TextureFilterType::Linear); auto bucket_ = tile.tile.getBucket<FillBucket>(*baseImpl); if (!bucket_) { continue; @@ -215,7 +214,9 @@ void RenderFillLayer::render(PaintParameters& parameters, RenderSource*) { parameters.depthModeForSublayer(1, gfx::DepthMaskType::ReadWrite), *bucket.triangleIndexBuffer, bucket.triangleSegments, - FillProgram::TextureBindings{}); + FillPatternProgram::TextureBindings{ + textures::u_image::Value{ *geometryTile.iconAtlasTexture->resource, gfx::TextureFilterType::Linear }, + }); if (evaluated.get<FillAntialias>() && unevaluated.get<FillOutlineColor>().isUndefined()) { draw(parameters.programs.getFillLayerPrograms().fillOutlinePattern, @@ -223,7 +224,9 @@ void RenderFillLayer::render(PaintParameters& parameters, RenderSource*) { parameters.depthModeForSublayer(2, gfx::DepthMaskType::ReadOnly), *bucket.lineIndexBuffer, bucket.lineSegments, - FillOutlineProgram::TextureBindings{}); + FillOutlinePatternProgram::TextureBindings{ + textures::u_image::Value{ *geometryTile.iconAtlasTexture->resource, gfx::TextureFilterType::Linear }, + }); } } } diff --git a/src/mbgl/renderer/layers/render_heatmap_layer.cpp b/src/mbgl/renderer/layers/render_heatmap_layer.cpp index 9dd1ee6493..74b976658e 100644 --- a/src/mbgl/renderer/layers/render_heatmap_layer.cpp +++ b/src/mbgl/renderer/layers/render_heatmap_layer.cpp @@ -77,7 +77,7 @@ void RenderHeatmapLayer::render(PaintParameters& parameters, RenderSource*) { } if (!colorRampTexture) { - colorRampTexture = parameters.context.createTexture(colorRamp, 1, gfx::TextureChannelDataType::UnsignedByte); + colorRampTexture = parameters.context.createTexture(colorRamp, gfx::TextureChannelDataType::UnsignedByte); } parameters.context.clear(Color{ 0.0f, 0.0f, 0.0f, 1.0f }, {}, {}); @@ -134,9 +134,6 @@ void RenderHeatmapLayer::render(PaintParameters& parameters, RenderSource*) { } } else if (parameters.pass == RenderPass::Translucent) { - parameters.context.bindTexture(renderTexture->getTexture(), 0, gfx::TextureFilterType::Linear); - parameters.context.bindTexture(*colorRampTexture, 1, gfx::TextureFilterType::Linear); - const auto& size = parameters.staticData.backendSize; mat4 viewportMat; @@ -150,8 +147,6 @@ void RenderHeatmapLayer::render(PaintParameters& parameters, RenderSource*) { const auto allUniformValues = programInstance.computeAllUniformValues( HeatmapTextureProgram::UniformValues{ uniforms::u_matrix::Value( viewportMat ), uniforms::u_world::Value( size ), - uniforms::u_image::Value( 0 ), - uniforms::u_color_ramp::Value( 1 ), uniforms::u_opacity::Value( evaluated.get<HeatmapOpacity>() ) }, paintAttributeData, @@ -177,7 +172,10 @@ void RenderHeatmapLayer::render(PaintParameters& parameters, RenderSource*) { parameters.staticData.extrusionTextureSegments, allUniformValues, allAttributeBindings, - HeatmapProgram::TextureBindings{}, + HeatmapTextureProgram::TextureBindings{ + textures::u_image::Value{ *renderTexture->getTexture().resource, gfx::TextureFilterType::Linear }, + textures::u_color_ramp::Value{ *colorRampTexture->resource, gfx::TextureFilterType::Linear }, + }, getID() ); } diff --git a/src/mbgl/renderer/layers/render_hillshade_layer.cpp b/src/mbgl/renderer/layers/render_hillshade_layer.cpp index 70ff2379d4..b428e357e7 100644 --- a/src/mbgl/renderer/layers/render_hillshade_layer.cpp +++ b/src/mbgl/renderer/layers/render_hillshade_layer.cpp @@ -67,7 +67,8 @@ void RenderHillshadeLayer::render(PaintParameters& parameters, RenderSource* src const auto& vertexBuffer, const auto& indexBuffer, const auto& segments, - const UnwrappedTileID& id) { + const UnwrappedTileID& id, + const auto& textureBindings) { auto& programInstance = parameters.programs.getHillshadeLayerPrograms().hillshade; const HillshadeProgram::Binders paintAttributeData{ evaluated, 0 }; @@ -75,7 +76,6 @@ void RenderHillshadeLayer::render(PaintParameters& parameters, RenderSource* src const auto allUniformValues = programInstance.computeAllUniformValues( HillshadeProgram::UniformValues { uniforms::u_matrix::Value( matrix ), - uniforms::u_image::Value( 0 ), uniforms::u_highlight::Value( evaluated.get<HillshadeHighlightColor>() ), uniforms::u_shadow::Value( evaluated.get<HillshadeShadowColor>() ), uniforms::u_accent::Value( evaluated.get<HillshadeAccentColor>() ), @@ -105,7 +105,7 @@ void RenderHillshadeLayer::render(PaintParameters& parameters, RenderSource* src segments, allUniformValues, allAttributeBindings, - HillshadeProgram::TextureBindings{}, + textureBindings, getID() ); }; @@ -126,12 +126,12 @@ void RenderHillshadeLayer::render(PaintParameters& parameters, RenderSource* src } if (!bucket.isPrepared() && parameters.pass == RenderPass::Pass3D) { + assert(bucket.dem); const uint16_t stride = bucket.getDEMData().stride; const uint16_t tilesize = bucket.getDEMData().dim; OffscreenTexture view(parameters.context, { tilesize, tilesize }); view.bind(); - - parameters.context.bindTexture(*bucket.dem, 0, gfx::TextureFilterType::Nearest, gfx::TextureMipMapType::No, gfx::TextureWrapType::Clamp, gfx::TextureWrapType::Clamp); + const Properties<>::PossiblyEvaluated properties; const HillshadePrepareProgram::Binders paintAttributeData{ properties, 0 }; @@ -143,7 +143,6 @@ void RenderHillshadeLayer::render(PaintParameters& parameters, RenderSource* src uniforms::u_dimension::Value( {{stride, stride}} ), uniforms::u_zoom::Value( float(tile.id.canonical.z) ), uniforms::u_maxzoom::Value( float(maxzoom) ), - uniforms::u_image::Value( 0 ) }, paintAttributeData, properties, @@ -168,14 +167,15 @@ void RenderHillshadeLayer::render(PaintParameters& parameters, RenderSource* src parameters.staticData.rasterSegments, allUniformValues, allAttributeBindings, - HillshadePrepareProgram::TextureBindings{}, + HillshadePrepareProgram::TextureBindings{ + textures::u_image::Value{ *bucket.dem->resource }, + }, getID() ); bucket.texture = std::move(view.getTexture()); bucket.setPrepared(true); } else if (parameters.pass == RenderPass::Translucent) { assert(bucket.texture); - parameters.context.bindTexture(*bucket.texture, 0, gfx::TextureFilterType::Linear, gfx::TextureMipMapType::No, gfx::TextureWrapType::Clamp, gfx::TextureWrapType::Clamp); if (bucket.vertexBuffer && bucket.indexBuffer && !bucket.segments.empty()) { // Draw only the parts of the tile that aren't drawn by another tile in the layer. @@ -183,14 +183,20 @@ void RenderHillshadeLayer::render(PaintParameters& parameters, RenderSource* src *bucket.vertexBuffer, *bucket.indexBuffer, bucket.segments, - tile.id); + tile.id, + HillshadeProgram::TextureBindings{ + textures::u_image::Value{ *bucket.texture->resource, gfx::TextureFilterType::Linear }, + }); } else { // Draw the full tile. draw(parameters.matrixForTile(tile.id, true), parameters.staticData.rasterVertexBuffer, parameters.staticData.quadTriangleIndexBuffer, parameters.staticData.rasterSegments, - tile.id); + tile.id, + HillshadeProgram::TextureBindings{ + textures::u_image::Value{ *bucket.texture->resource, gfx::TextureFilterType::Linear }, + }); } } diff --git a/src/mbgl/renderer/layers/render_line_layer.cpp b/src/mbgl/renderer/layers/render_line_layer.cpp index 9eb659f79f..f3947685fe 100644 --- a/src/mbgl/renderer/layers/render_line_layer.cpp +++ b/src/mbgl/renderer/layers/render_line_layer.cpp @@ -109,8 +109,6 @@ void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) { LinePatternPos posA = parameters.lineAtlas.getDashPosition(evaluated.get<LineDasharray>().from, cap); LinePatternPos posB = parameters.lineAtlas.getDashPosition(evaluated.get<LineDasharray>().to, cap); - parameters.lineAtlas.bind(parameters.context, 0); - draw(parameters.programs.getLineLayerPrograms().lineSDF, LineSDFProgram::uniformValues( evaluated, @@ -124,13 +122,14 @@ void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) { parameters.lineAtlas.getSize().width), {}, {}, - LineSDFProgram::TextureBindings{}); + LineSDFProgram::TextureBindings{ + parameters.lineAtlas.textureBinding(parameters.context), + }); } else if (!unevaluated.get<LinePattern>().isUndefined()) { const auto linePatternValue = evaluated.get<LinePattern>().constantOr(Faded<std::basic_string<char>>{ "", ""}); assert(dynamic_cast<GeometryTile*>(&tile.tile)); - GeometryTile& geometryTile = static_cast<GeometryTile&>(tile.tile); - parameters.context.bindTexture(*geometryTile.iconAtlasTexture, 0, gfx::TextureFilterType::Linear); + GeometryTile& geometryTile = static_cast<GeometryTile&>(tile.tile); const Size texsize = geometryTile.iconAtlasTexture->size; optional<ImagePosition> posA = geometryTile.getPattern(linePatternValue.from); @@ -147,12 +146,13 @@ void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) { parameters.pixelRatio), *posA, *posB, - LinePatternProgram::TextureBindings{}); + LinePatternProgram::TextureBindings{ + textures::u_image::Value{ *geometryTile.iconAtlasTexture->resource, gfx::TextureFilterType::Linear }, + }); } else if (!unevaluated.get<LineGradient>().getValue().isUndefined()) { if (!colorRampTexture) { colorRampTexture = parameters.context.createTexture(colorRamp); } - parameters.context.bindTexture(*colorRampTexture, 0, gfx::TextureFilterType::Linear); draw(parameters.programs.getLineLayerPrograms().lineGradient, LineGradientProgram::uniformValues( @@ -162,7 +162,9 @@ void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) { parameters.pixelsToGLUnits), {}, {}, - LineGradientProgram::TextureBindings{}); + LineGradientProgram::TextureBindings{ + textures::u_image::Value{ *colorRampTexture->resource, gfx::TextureFilterType::Linear }, + }); } else { draw(parameters.programs.getLineLayerPrograms().line, LineProgram::uniformValues( diff --git a/src/mbgl/renderer/layers/render_raster_layer.cpp b/src/mbgl/renderer/layers/render_raster_layer.cpp index a9fdcc0320..f68acd4061 100644 --- a/src/mbgl/renderer/layers/render_raster_layer.cpp +++ b/src/mbgl/renderer/layers/render_raster_layer.cpp @@ -77,14 +77,13 @@ void RenderRasterLayer::render(PaintParameters& parameters, RenderSource* source auto draw = [&] (const mat4& matrix, const auto& vertexBuffer, const auto& indexBuffer, - const auto& segments) { + const auto& segments, + const auto& textureBindings) { auto& programInstance = parameters.programs.getRasterLayerPrograms().raster; const auto allUniformValues = programInstance.computeAllUniformValues( RasterProgram::UniformValues { uniforms::u_matrix::Value( matrix ), - uniforms::u_image0::Value( 0 ), - uniforms::u_image1::Value( 1 ), uniforms::u_opacity::Value( evaluated.get<RasterOpacity>() ), uniforms::u_fade_t::Value( 1 ), uniforms::u_brightness_low::Value( evaluated.get<RasterBrightnessMin>() ), @@ -119,7 +118,7 @@ void RenderRasterLayer::render(PaintParameters& parameters, RenderSource* source segments, allUniformValues, allAttributeBindings, - RasterProgram::TextureBindings{}, + textureBindings, getID() ); }; @@ -129,16 +128,17 @@ void RenderRasterLayer::render(PaintParameters& parameters, RenderSource* source if (RenderImageSource* imageSource = source->as<RenderImageSource>()) { if (imageSource->isEnabled() && imageSource->isLoaded() && !imageSource->bucket->needsUpload()) { RasterBucket& bucket = *imageSource->bucket; - assert(bucket.texture); - parameters.context.bindTexture(*bucket.texture, 0, filter); - parameters.context.bindTexture(*bucket.texture, 1, filter); for (auto matrix_ : imageSource->matrices) { draw(matrix_, *bucket.vertexBuffer, *bucket.indexBuffer, - bucket.segments); + bucket.segments, + RasterProgram::TextureBindings{ + textures::u_image0::Value{ *bucket.texture->resource, filter }, + textures::u_image1::Value{ *bucket.texture->resource, filter }, + }); } } } else { @@ -153,21 +153,26 @@ void RenderRasterLayer::render(PaintParameters& parameters, RenderSource* source continue; assert(bucket.texture); - parameters.context.bindTexture(*bucket.texture, 0, filter); - parameters.context.bindTexture(*bucket.texture, 1, filter); - if (bucket.vertexBuffer && bucket.indexBuffer && !bucket.segments.empty()) { // Draw only the parts of the tile that aren't drawn by another tile in the layer. draw(parameters.matrixForTile(tile.id, true), *bucket.vertexBuffer, *bucket.indexBuffer, - bucket.segments); + bucket.segments, + RasterProgram::TextureBindings{ + textures::u_image0::Value{ *bucket.texture->resource, filter }, + textures::u_image1::Value{ *bucket.texture->resource, filter }, + }); } else { // Draw the full tile. draw(parameters.matrixForTile(tile.id, true), parameters.staticData.rasterVertexBuffer, parameters.staticData.quadTriangleIndexBuffer, - parameters.staticData.rasterSegments); + parameters.staticData.rasterSegments, + RasterProgram::TextureBindings{ + textures::u_image0::Value{ *bucket.texture->resource, filter }, + textures::u_image1::Value{ *bucket.texture->resource, filter }, + }); } } } diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp index a5ac6ceeea..e523a869b2 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.cpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp @@ -158,9 +158,12 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { const bool iconScaled = layout.get<IconSize>().constantOr(1.0) != 1.0 || bucket.iconsNeedLinear; const bool iconTransformed = values.rotationAlignment == AlignmentType::Map || parameters.state.getPitch() != 0; - parameters.context.bindTexture(*geometryTile.iconAtlasTexture, 0, - bucket.sdfIcons || parameters.state.isChanging() || iconScaled || iconTransformed - ? gfx::TextureFilterType::Linear : gfx::TextureFilterType::Nearest); + const gfx::TextureBinding textureBinding{ *geometryTile.iconAtlasTexture->resource, + bucket.sdfIcons || + parameters.state.isChanging() || + iconScaled || iconTransformed + ? gfx::TextureFilterType::Linear + : gfx::TextureFilterType::Nearest }; const Size texsize = geometryTile.iconAtlasTexture->size; @@ -173,7 +176,9 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { values, bucketPaintProperties.iconBinders, paintPropertyValues, - SymbolSDFIconProgram::TextureBindings{}); + SymbolSDFIconProgram::TextureBindings{ + textureBinding, + }); } if (values.hasFill) { @@ -184,7 +189,9 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { values, bucketPaintProperties.iconBinders, paintPropertyValues, - SymbolSDFIconProgram::TextureBindings{}); + SymbolSDFIconProgram::TextureBindings{ + textureBinding, + }); } } else { draw(parameters.programs.getSymbolLayerPrograms().symbolIcon, @@ -194,12 +201,15 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { values, bucketPaintProperties.iconBinders, paintPropertyValues, - SymbolIconProgram::TextureBindings{}); + SymbolIconProgram::TextureBindings{ + textureBinding, + }); } } if (bucket.hasTextData()) { - parameters.context.bindTexture(*geometryTile.glyphAtlasTexture, 0, gfx::TextureFilterType::Linear); + const gfx::TextureBinding textureBinding{ *geometryTile.glyphAtlasTexture->resource, + gfx::TextureFilterType::Linear }; auto values = textPropertyValues(evaluated_, layout); const auto& paintPropertyValues = textPaintProperties(evaluated_); @@ -229,7 +239,9 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { values, bucketPaintProperties.textBinders, paintPropertyValues, - SymbolSDFTextProgram::TextureBindings{}); + SymbolSDFTextProgram::TextureBindings{ + textureBinding, + }); } if (values.hasFill) { @@ -240,7 +252,9 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { values, bucketPaintProperties.textBinders, paintPropertyValues, - SymbolSDFTextProgram::TextureBindings{}); + SymbolSDFTextProgram::TextureBindings{ + textureBinding, + }); } } |