diff options
Diffstat (limited to 'src/mbgl/programs/symbol_program.hpp')
-rw-r--r-- | src/mbgl/programs/symbol_program.hpp | 169 |
1 files changed, 88 insertions, 81 deletions
diff --git a/src/mbgl/programs/symbol_program.hpp b/src/mbgl/programs/symbol_program.hpp index 7b8a2c1330..383f5162d8 100644 --- a/src/mbgl/programs/symbol_program.hpp +++ b/src/mbgl/programs/symbol_program.hpp @@ -1,6 +1,5 @@ #pragma once -#include <mbgl/gl/context.hpp> #include <mbgl/gl/program.hpp> #include <mbgl/math/clamp.hpp> #include <mbgl/util/interpolate.hpp> @@ -10,8 +9,6 @@ #include <mbgl/programs/uniforms.hpp> #include <mbgl/programs/textures.hpp> #include <mbgl/programs/segment.hpp> -#include <mbgl/shaders/symbol_icon.hpp> -#include <mbgl/shaders/symbol_sdf.hpp> #include <mbgl/util/geometry.hpp> #include <mbgl/util/size.hpp> #include <mbgl/style/layers/symbol_layer_properties.hpp> @@ -240,55 +237,51 @@ public: } }; -template <class Shaders, - class Primitive, +template <class Name, + gfx::PrimitiveType Primitive, class LayoutAttributeList, - class UniformList, - class TextureList, + class LayoutUniformList, + class Textures, class PaintProps> class SymbolProgram : public SymbolProgramBase { public: - using LayoutAttributes = gl::Attributes<LayoutAttributeList>; using LayoutVertex = gfx::Vertex<LayoutAttributeList>; using LayoutAndSizeAttributeList = TypeListConcat<LayoutAttributeList, SymbolDynamicLayoutAttributes, SymbolOpacityAttributes>; using PaintProperties = PaintProps; using Binders = PaintPropertyBinders<typename PaintProperties::DataDrivenProperties>; + using PaintAttributeList = typename Binders::AttributeList; - using Attributes = gl::Attributes<TypeListConcat<LayoutAndSizeAttributeList, PaintAttributeList>>; + using AttributeList = TypeListConcat<LayoutAndSizeAttributeList, PaintAttributeList>; + using AttributeBindings = gfx::AttributeBindings<AttributeList>; - using UniformValues = gfx::UniformValues<UniformList>; + using LayoutUniformValues = gfx::UniformValues<LayoutUniformList>; using SizeUniformList = typename SymbolSizeBinder::UniformList; using PaintUniformList = typename Binders::UniformList; - using AllUniforms = gl::Uniforms<TypeListConcat<UniformList, SizeUniformList, PaintUniformList>>; + using UniformList = TypeListConcat<LayoutUniformList, SizeUniformList, PaintUniformList>; + using UniformValues = gfx::UniformValues<UniformList>; + using TextureList = Textures; using TextureBindings = gfx::TextureBindings<TextureList>; - using ProgramType = gl::Program<Primitive, Attributes, AllUniforms, TextureList>; + std::unique_ptr<gfx::Program<Name>> program; - ProgramType program; - - SymbolProgram(gl::Context& context, const ProgramParameters& programParameters) - : program(ProgramType::createProgram( - context, - programParameters, - Shaders::name, - Shaders::vertexSource, - Shaders::fragmentSource)) { + SymbolProgram(gfx::Context& context, const ProgramParameters& programParameters) + : program(context.createProgram<Name>(programParameters)) { } - static typename AllUniforms::Values computeAllUniformValues( - const UniformValues& uniformValues, + static UniformValues computeAllUniformValues( + const LayoutUniformValues& layoutUniformValues, const SymbolSizeBinder& symbolSizeBinder, const Binders& paintPropertyBinders, const typename PaintProperties::PossiblyEvaluated& currentProperties, float currentZoom) { - return uniformValues.concat(symbolSizeBinder.uniformValues(currentZoom)) + return layoutUniformValues.concat(symbolSizeBinder.uniformValues(currentZoom)) .concat(paintPropertyBinders.uniformValues(currentZoom, currentProperties)); } - static typename Attributes::Bindings computeAllAttributeBindings( + static AttributeBindings computeAllAttributeBindings( const gfx::VertexBuffer<LayoutVertex>& layoutVertexBuffer, const gfx::VertexBuffer<gfx::Vertex<SymbolDynamicLayoutAttributes>>& dynamicLayoutVertexBuffer, const gfx::VertexBuffer<gfx::Vertex<SymbolOpacityAttributes>>& opacityVertexBuffer, @@ -296,46 +289,52 @@ public: const typename PaintProperties::PossiblyEvaluated& currentProperties) { assert(layoutVertexBuffer.elements == dynamicLayoutVertexBuffer.elements && layoutVertexBuffer.elements == opacityVertexBuffer.elements); - return gl::Attributes<LayoutAttributeList>::bindings(layoutVertexBuffer) - .concat(gl::Attributes<SymbolDynamicLayoutAttributes>::bindings(dynamicLayoutVertexBuffer)) - .concat(gl::Attributes<SymbolOpacityAttributes>::bindings(opacityVertexBuffer)) + return gfx::AttributeBindings<LayoutAttributeList>(layoutVertexBuffer) + .concat(gfx::AttributeBindings<SymbolDynamicLayoutAttributes>(dynamicLayoutVertexBuffer)) + .concat(gfx::AttributeBindings<SymbolOpacityAttributes>(opacityVertexBuffer)) .concat(paintPropertyBinders.attributeBindings(currentProperties)); } - static uint32_t activeBindingCount(const typename Attributes::Bindings& allAttributeBindings) { - return Attributes::activeBindingCount(allAttributeBindings); + static uint32_t activeBindingCount(const AttributeBindings& allAttributeBindings) { + return allAttributeBindings.activeCount(); } template <class DrawMode> - void draw(gl::Context& context, - DrawMode drawMode, - gfx::DepthMode depthMode, - gfx::StencilMode stencilMode, - gfx::ColorMode colorMode, - gfx::CullFaceMode cullFaceMode, + void draw(gfx::Context& context, + const DrawMode& drawMode, + const gfx::DepthMode& depthMode, + const gfx::StencilMode& stencilMode, + const gfx::ColorMode& colorMode, + const gfx::CullFaceMode& cullFaceMode, const gfx::IndexBuffer& indexBuffer, - const SegmentVector<Attributes>& segments, - const typename AllUniforms::Values& allUniformValues, - const typename Attributes::Bindings& allAttributeBindings, + const SegmentVector<AttributeList>& segments, + const UniformValues& uniformValues, + const AttributeBindings& allAttributeBindings, const TextureBindings& textureBindings, const std::string& layerID) { + static_assert(Primitive == gfx::PrimitiveTypeOf<DrawMode>::value, "incompatible draw mode"); + + if (!program) { + return; + } + for (auto& segment : segments) { - auto vertexArrayIt = segment.vertexArrays.find(layerID); + auto drawScopeIt = segment.drawScopes.find(layerID); - if (vertexArrayIt == segment.vertexArrays.end()) { - vertexArrayIt = segment.vertexArrays.emplace(layerID, context.createVertexArray()).first; + if (drawScopeIt == segment.drawScopes.end()) { + drawScopeIt = segment.drawScopes.emplace(layerID, context.createDrawScope()).first; } - program.draw( + program->draw( context, - std::move(drawMode), - std::move(depthMode), - std::move(stencilMode), - std::move(colorMode), - std::move(cullFaceMode), - allUniformValues, - vertexArrayIt->second, - Attributes::offsetBindings(allAttributeBindings, segment.vertexOffset), + drawMode, + depthMode, + stencilMode, + colorMode, + cullFaceMode, + uniformValues, + drawScopeIt->second, + allAttributeBindings.offset(segment.vertexOffset), textureBindings, indexBuffer, segment.indexOffset, @@ -345,8 +344,8 @@ public: }; class SymbolIconProgram : public SymbolProgram< - shaders::symbol_icon, - gfx::Triangle, + SymbolIconProgram, + gfx::PrimitiveType::Triangle, SymbolLayoutAttributes, TypeList< uniforms::u_matrix, @@ -368,14 +367,14 @@ class SymbolIconProgram : public SymbolProgram< public: using SymbolProgram::SymbolProgram; - static UniformValues uniformValues(const bool isText, - const style::SymbolPropertyValues&, - const Size& texsize, - const std::array<float, 2>& pixelsToGLUnits, - const bool alongLine, - const RenderTile&, - const TransformState&, - const float symbolFadeChange); + static LayoutUniformValues layoutUniformValues(const bool isText, + const style::SymbolPropertyValues&, + const Size& texsize, + const std::array<float, 2>& pixelsToGLUnits, + const bool alongLine, + const RenderTile&, + const TransformState&, + const float symbolFadeChange); }; enum class SymbolSDFPart { @@ -383,10 +382,10 @@ enum class SymbolSDFPart { Halo = 0 }; -template <class PaintProperties> +template <class Name, class PaintProperties> class SymbolSDFProgram : public SymbolProgram< - shaders::symbol_sdf, - gfx::Triangle, + Name, + gfx::PrimitiveType::Triangle, SymbolLayoutAttributes, TypeList< uniforms::u_matrix, @@ -408,8 +407,9 @@ class SymbolSDFProgram : public SymbolProgram< PaintProperties> { public: - using BaseProgram = SymbolProgram<shaders::symbol_sdf, - gfx::Triangle, + using BaseProgram = SymbolProgram< + Name, + gfx::PrimitiveType::Triangle, SymbolLayoutAttributes, TypeList< uniforms::u_matrix, @@ -430,33 +430,40 @@ public: textures::u_texture>, PaintProperties>; - using UniformValues = typename BaseProgram::UniformValues; + using LayoutUniformValues = typename BaseProgram::LayoutUniformValues; using BaseProgram::BaseProgram; - static UniformValues uniformValues(const bool isText, - const style::SymbolPropertyValues&, - const Size& texsize, - const std::array<float, 2>& pixelsToGLUnits, - const bool alongLine, - const RenderTile&, - const TransformState&, - const float SymbolFadeChange, - const SymbolSDFPart); + static LayoutUniformValues layoutUniformValues(const bool isText, + const style::SymbolPropertyValues&, + const Size& texsize, + const std::array<float, 2>& pixelsToGLUnits, + const bool alongLine, + const RenderTile&, + const TransformState&, + const float SymbolFadeChange, + const SymbolSDFPart); +}; + +class SymbolSDFIconProgram : public SymbolSDFProgram<SymbolSDFIconProgram, style::IconPaintProperties> { +public: + using SymbolSDFProgram::SymbolSDFProgram; }; -using SymbolSDFIconProgram = SymbolSDFProgram<style::IconPaintProperties>; -using SymbolSDFTextProgram = SymbolSDFProgram<style::TextPaintProperties>; +class SymbolSDFTextProgram : public SymbolSDFProgram<SymbolSDFTextProgram, style::TextPaintProperties> { +public: + using SymbolSDFProgram::SymbolSDFProgram; +}; using SymbolLayoutVertex = gfx::Vertex<SymbolLayoutAttributes>; -using SymbolIconAttributes = SymbolIconProgram::Attributes; -using SymbolTextAttributes = SymbolSDFTextProgram::Attributes; +using SymbolIconAttributes = SymbolIconProgram::AttributeList; +using SymbolTextAttributes = SymbolSDFTextProgram::AttributeList; class SymbolLayerPrograms final : public LayerTypePrograms { public: - SymbolLayerPrograms(gl::Context& context, const ProgramParameters& programParameters) + SymbolLayerPrograms(gfx::Context& context, const ProgramParameters& programParameters) : symbolIcon(context, programParameters), symbolIconSDF(context, programParameters), symbolGlyph(context, programParameters), |