From 600fc992e62a3d4f262d9fa4d016518d091e16e2 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 1 Jun 2017 18:42:04 -0700 Subject: [PATCH] Prototype approach to subsetting symbol attribute binding --- src/mbgl/programs/attributes.hpp | 10 -- src/mbgl/programs/programs.hpp | 12 +- src/mbgl/programs/symbol_program.cpp | 9 +- src/mbgl/programs/symbol_program.hpp | 133 ++++++++++-------- src/mbgl/renderer/buckets/symbol_bucket.hpp | 8 +- src/mbgl/renderer/paint_property_binder.hpp | 24 +++- src/mbgl/renderer/painters/painter_symbol.cpp | 16 +-- .../style/layers/symbol_layer_properties.hpp | 8 +- 8 files changed, 119 insertions(+), 101 deletions(-) diff --git a/src/mbgl/programs/attributes.hpp b/src/mbgl/programs/attributes.hpp index cfd6a629de1..dcabbe2a295 100644 --- a/src/mbgl/programs/attributes.hpp +++ b/src/mbgl/programs/attributes.hpp @@ -51,16 +51,6 @@ struct a_color { using Type = gl::Attribute; }; -struct a_fill_color { - static auto name() { return "a_fill_color"; } - using Type = gl::Attribute; -}; - -struct a_halo_color { - static auto name() { return "a_halo_color"; } - using Type = gl::Attribute; -}; - struct a_stroke_color { static auto name() { return "a_stroke_color"; } using Type = gl::Attribute; diff --git a/src/mbgl/programs/programs.hpp b/src/mbgl/programs/programs.hpp index ff6b1cd505d..6a4a35cf24f 100644 --- a/src/mbgl/programs/programs.hpp +++ b/src/mbgl/programs/programs.hpp @@ -29,8 +29,10 @@ class Programs { linePattern(context, programParameters), raster(context, programParameters), symbolIcon(context, programParameters), - symbolIconSDF(context, programParameters), - symbolGlyph(context, programParameters), + symbolSDFIconFill(context, programParameters), + symbolSDFIconHalo(context, programParameters), + symbolSDFTextFill(context, programParameters), + symbolSDFTextHalo(context, programParameters), debug(context, ProgramParameters(programParameters.pixelRatio, false, programParameters.cacheDir)), collisionBox(context, ProgramParameters(programParameters.pixelRatio, false, programParameters.cacheDir)) { } @@ -48,8 +50,10 @@ class Programs { LinePatternProgram linePattern; RasterProgram raster; SymbolIconProgram symbolIcon; - SymbolSDFIconProgram symbolIconSDF; - SymbolSDFTextProgram symbolGlyph; + SymbolSDFIconFillProgram symbolSDFIconFill; + SymbolSDFIconHaloProgram symbolSDFIconHalo; + SymbolSDFTextFillProgram symbolSDFTextFill; + SymbolSDFTextHaloProgram symbolSDFTextHalo; DebugProgram debug; CollisionBoxProgram collisionBox; diff --git a/src/mbgl/programs/symbol_program.cpp b/src/mbgl/programs/symbol_program.cpp index cdbd6b9713a..b6b0f5b00a7 100644 --- a/src/mbgl/programs/symbol_program.cpp +++ b/src/mbgl/programs/symbol_program.cpp @@ -79,8 +79,8 @@ SymbolIconProgram::uniformValues(const bool isText, ); } -template -typename SymbolSDFProgram::UniformValues SymbolSDFProgram::uniformValues( +SymbolSDFUniforms::Values +symbolSDFUniformValues( const bool isText, const style::SymbolPropertyValues& values, const Size& texsize, @@ -93,7 +93,7 @@ typename SymbolSDFProgram::UniformValues SymbolSDFProgram::UniformValues>( + return makeValues( isText, values, texsize, @@ -109,7 +109,4 @@ typename SymbolSDFProgram::UniformValues SymbolSDFProgram; -template class SymbolSDFProgram; - } // namespace mbgl diff --git a/src/mbgl/programs/symbol_program.hpp b/src/mbgl/programs/symbol_program.hpp index 48928988e6a..1fef9ab89a1 100644 --- a/src/mbgl/programs/symbol_program.hpp +++ b/src/mbgl/programs/symbol_program.hpp @@ -399,7 +399,10 @@ class SymbolIconProgram : public SymbolProgram< uniforms::u_texture, uniforms::u_fadetexture, uniforms::u_is_text>, - style::IconPaintProperties> + style::Properties< + style::IconOpacity, + style::IconTranslate, + style::IconTranslateAnchor>> { public: using SymbolProgram::SymbolProgram; @@ -417,69 +420,81 @@ enum class SymbolSDFPart { Halo = 0 }; -template -class SymbolSDFProgram : public SymbolProgram< +using SymbolSDFUniforms = gl::Uniforms< + uniforms::u_matrix, + uniforms::u_extrude_scale, + uniforms::u_texsize, + uniforms::u_zoom, + uniforms::u_rotate_with_map, + uniforms::u_texture, + uniforms::u_fadetexture, + uniforms::u_is_text, + uniforms::u_gamma_scale, + uniforms::u_pitch, + uniforms::u_bearing, + uniforms::u_aspect_ratio, + uniforms::u_pitch_with_map, + uniforms::u_is_halo>; + +SymbolSDFUniforms::Values +symbolSDFUniformValues(const bool isText, + const style::SymbolPropertyValues&, + const Size& texsize, + const std::array& pixelsToGLUnits, + const RenderTile&, + const TransformState&, + const SymbolSDFPart); + +using SymbolSDFIconFillProgram = SymbolProgram< shaders::symbol_sdf, gl::Triangle, SymbolLayoutAttributes, - gl::Uniforms< - uniforms::u_matrix, - uniforms::u_extrude_scale, - uniforms::u_texsize, - uniforms::u_zoom, - uniforms::u_rotate_with_map, - uniforms::u_texture, - uniforms::u_fadetexture, - uniforms::u_is_text, - uniforms::u_gamma_scale, - uniforms::u_pitch, - uniforms::u_bearing, - uniforms::u_aspect_ratio, - uniforms::u_pitch_with_map, - uniforms::u_is_halo>, - PaintProperties> -{ -public: - using BaseProgram = SymbolProgram, - PaintProperties>; - - using UniformValues = typename BaseProgram::UniformValues; - - - - using BaseProgram::BaseProgram; - - static UniformValues uniformValues(const bool isText, - const style::SymbolPropertyValues&, - const Size& texsize, - const std::array& pixelsToGLUnits, - const RenderTile&, - const TransformState&, - const SymbolSDFPart); -}; - -using SymbolSDFIconProgram = SymbolSDFProgram; -using SymbolSDFTextProgram = SymbolSDFProgram; + SymbolSDFUniforms, + style::Properties< + style::IconOpacity, + style::IconTranslate, + style::IconTranslateAnchor, + style::IconColor>>; + +using SymbolSDFIconHaloProgram = SymbolProgram< + shaders::symbol_sdf, + gl::Triangle, + SymbolLayoutAttributes, + SymbolSDFUniforms, + style::Properties< + style::IconOpacity, + style::IconTranslate, + style::IconTranslateAnchor, + style::IconHaloColor, + style::IconHaloWidth, + style::IconHaloBlur>>; + +using SymbolSDFTextFillProgram = SymbolProgram< + shaders::symbol_sdf, + gl::Triangle, + SymbolLayoutAttributes, + SymbolSDFUniforms, + style::Properties< + style::TextOpacity, + style::TextTranslate, + style::TextTranslateAnchor, + style::TextColor>>; + +using SymbolSDFTextHaloProgram = SymbolProgram< + shaders::symbol_sdf, + gl::Triangle, + SymbolLayoutAttributes, + SymbolSDFUniforms, + style::Properties< + style::TextOpacity, + style::TextTranslate, + style::TextTranslateAnchor, + style::TextHaloColor, + style::TextHaloWidth, + style::TextHaloBlur>>; using SymbolLayoutVertex = SymbolLayoutAttributes::Vertex; using SymbolIconAttributes = SymbolIconProgram::Attributes; -using SymbolTextAttributes = SymbolSDFTextProgram::Attributes; +//using SymbolTextAttributes = SymbolSDFTextProgram::Attributes; } // namespace mbgl diff --git a/src/mbgl/renderer/buckets/symbol_bucket.hpp b/src/mbgl/renderer/buckets/symbol_bucket.hpp index 652f2ea8e37..3f6149dfc97 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.hpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.hpp @@ -18,7 +18,9 @@ namespace mbgl { class SymbolBucket : public Bucket { public: SymbolBucket(style::SymbolLayoutProperties::PossiblyEvaluated, - const std::map>&, + const std::map>&, const style::DataDrivenPropertyValue& textSize, const style::DataDrivenPropertyValue& iconSize, float zoom, @@ -37,8 +39,8 @@ class SymbolBucket : public Bucket { const bool iconsNeedLinear; std::map> paintPropertyBinders; + style::IconPaintProperties::Binders, + style::TextPaintProperties::Binders>> paintPropertyBinders; std::unique_ptr textSizeBinder; diff --git a/src/mbgl/renderer/paint_property_binder.hpp b/src/mbgl/renderer/paint_property_binder.hpp index 14934fb6bdd..a3dc2e13723 100644 --- a/src/mbgl/renderer/paint_property_binder.hpp +++ b/src/mbgl/renderer/paint_property_binder.hpp @@ -296,26 +296,36 @@ class PaintPropertyBinders> { template using Attribute = ZoomInterpolatedAttribute; - using Attributes = gl::Attributes...>; using AttributeBindings = typename Attributes::Bindings; + template + auto attributeBinding(const EvaluatedProperties& currentProperties) const { + return binders.template get

()->attributeBinding(currentProperties.template get

()); + } + template AttributeBindings attributeBindings(const EvaluatedProperties& currentProperties) const { return AttributeBindings { - binders.template get()->attributeBinding(currentProperties.template get())... + attributeBinding(currentProperties)... }; } - using Uniforms = gl::Uniforms...>; + template + using Uniform = InterpolationUniform; + using Uniforms = gl::Uniforms...>; using UniformValues = typename Uniforms::Values; + template + auto uniformValue(float currentZoom) const { + return typename Uniform

::Value { + binders.template get

()->interpolationFactor(currentZoom) + }; + } + UniformValues uniformValues(float currentZoom) const { - (void)currentZoom; // Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56958 return UniformValues { - typename InterpolationUniform::Value { - binders.template get()->interpolationFactor(currentZoom) - }... + uniformValue(currentZoom)... }; } diff --git a/src/mbgl/renderer/painters/painter_symbol.cpp b/src/mbgl/renderer/painters/painter_symbol.cpp index 563489987c2..422dec2a801 100644 --- a/src/mbgl/renderer/painters/painter_symbol.cpp +++ b/src/mbgl/renderer/painters/painter_symbol.cpp @@ -75,8 +75,8 @@ void Painter::renderSymbol(PaintParameters& parameters, if (bucket.sdfIcons) { if (values.hasHalo) { - draw(parameters.programs.symbolIconSDF, - SymbolSDFIconProgram::uniformValues(false, values, texsize, pixelsToGLUnits, tile, state, SymbolSDFPart::Halo), + draw(parameters.programs.symbolSDFIconHalo, + symbolSDFUniformValues(false, values, texsize, pixelsToGLUnits, tile, state, SymbolSDFPart::Halo), bucket.icon, bucket.iconSizeBinder, values, @@ -85,8 +85,8 @@ void Painter::renderSymbol(PaintParameters& parameters, } if (values.hasFill) { - draw(parameters.programs.symbolIconSDF, - SymbolSDFIconProgram::uniformValues(false, values, texsize, pixelsToGLUnits, tile, state, SymbolSDFPart::Fill), + draw(parameters.programs.symbolSDFIconFill, + symbolSDFUniformValues(false, values, texsize, pixelsToGLUnits, tile, state, SymbolSDFPart::Fill), bucket.icon, bucket.iconSizeBinder, values, @@ -113,8 +113,8 @@ void Painter::renderSymbol(PaintParameters& parameters, const Size texsize = glyphAtlas->getSize(); if (values.hasHalo) { - draw(parameters.programs.symbolGlyph, - SymbolSDFTextProgram::uniformValues(true, values, texsize, pixelsToGLUnits, tile, state, SymbolSDFPart::Halo), + draw(parameters.programs.symbolSDFTextHalo, + symbolSDFUniformValues(true, values, texsize, pixelsToGLUnits, tile, state, SymbolSDFPart::Halo), bucket.text, bucket.textSizeBinder, values, @@ -123,8 +123,8 @@ void Painter::renderSymbol(PaintParameters& parameters, } if (values.hasFill) { - draw(parameters.programs.symbolGlyph, - SymbolSDFTextProgram::uniformValues(true, values, texsize, pixelsToGLUnits, tile, state, SymbolSDFPart::Fill), + draw(parameters.programs.symbolSDFTextFill, + symbolSDFUniformValues(true, values, texsize, pixelsToGLUnits, tile, state, SymbolSDFPart::Fill), bucket.text, bucket.textSizeBinder, values, diff --git a/src/mbgl/style/layers/symbol_layer_properties.hpp b/src/mbgl/style/layers/symbol_layer_properties.hpp index d484d699d7c..77deb8b85cc 100644 --- a/src/mbgl/style/layers/symbol_layer_properties.hpp +++ b/src/mbgl/style/layers/symbol_layer_properties.hpp @@ -185,11 +185,11 @@ struct IconOpacity : DataDrivenPaintProperty { static float defaultValue() { return 1; } }; -struct IconColor : DataDrivenPaintProperty { +struct IconColor : DataDrivenPaintProperty { static Color defaultValue() { return Color::black(); } }; -struct IconHaloColor : DataDrivenPaintProperty { +struct IconHaloColor : DataDrivenPaintProperty { static Color defaultValue() { return {}; } }; @@ -213,11 +213,11 @@ struct TextOpacity : DataDrivenPaintProperty { static float defaultValue() { return 1; } }; -struct TextColor : DataDrivenPaintProperty { +struct TextColor : DataDrivenPaintProperty { static Color defaultValue() { return Color::black(); } }; -struct TextHaloColor : DataDrivenPaintProperty { +struct TextHaloColor : DataDrivenPaintProperty { static Color defaultValue() { return {}; } };