diff options
Diffstat (limited to 'src/mbgl/programs/program.hpp')
-rw-r--r-- | src/mbgl/programs/program.hpp | 104 |
1 files changed, 52 insertions, 52 deletions
diff --git a/src/mbgl/programs/program.hpp b/src/mbgl/programs/program.hpp index 379cc6b842..240da22b4f 100644 --- a/src/mbgl/programs/program.hpp +++ b/src/mbgl/programs/program.hpp @@ -1,106 +1,106 @@ #pragma once -#include <mbgl/gl/program.hpp> -#include <mbgl/gl/features.hpp> +#include <mbgl/gfx/attribute.hpp> +#include <mbgl/gfx/uniform.hpp> #include <mbgl/programs/segment.hpp> -#include <mbgl/programs/binary_program.hpp> #include <mbgl/programs/attributes.hpp> #include <mbgl/programs/program_parameters.hpp> #include <mbgl/style/paint_property.hpp> #include <mbgl/renderer/paint_property_binder.hpp> -#include <mbgl/shaders/shaders.hpp> #include <mbgl/util/io.hpp> #include <unordered_map> namespace mbgl { -template <class Shaders, - class Primitive, +template <class Name, + gfx::PrimitiveType Primitive, class LayoutAttributeList, - class UniformList, - class TextureList, + class LayoutUniformList, + class Textures, class PaintProps> class Program { public: - using LayoutAttributes = gl::Attributes<LayoutAttributeList>; using LayoutVertex = gfx::Vertex<LayoutAttributeList>; using PaintProperties = PaintProps; using Binders = PaintPropertyBinders<typename PaintProperties::DataDrivenProperties>; + using PaintAttributeList = typename Binders::AttributeList; - using Attributes = gl::Attributes<TypeListConcat<LayoutAttributeList, PaintAttributeList>>; + using AttributeList = TypeListConcat<LayoutAttributeList, PaintAttributeList>; + using AttributeBindings = gfx::AttributeBindings<AttributeList>; - using UniformValues = gfx::UniformValues<UniformList>; using PaintUniformList = typename Binders::UniformList; - using AllUniforms = gl::Uniforms<TypeListConcat<UniformList, PaintUniformList>>; + using UniformList = TypeListConcat<LayoutUniformList, PaintUniformList>; + using LayoutUniformValues = gfx::UniformValues<LayoutUniformList>; + using UniformValues = gfx::UniformValues<UniformList>; + using TextureList = Textures; using TextureBindings = gfx::TextureBindings<TextureList>; - using ProgramType = gl::Program<Primitive, Attributes, AllUniforms, TextureList>; - - ProgramType program; + std::unique_ptr<gfx::Program<Name>> program; - Program(gl::Context& context, const ProgramParameters& programParameters) - : program(ProgramType::createProgram( - context, - programParameters, - Shaders::name, - Shaders::vertexSource, - Shaders::fragmentSource)) { + Program(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 Binders& paintPropertyBinders, const typename PaintProperties::PossiblyEvaluated& currentProperties, float currentZoom) { - return uniformValues + return layoutUniformValues .concat(paintPropertyBinders.uniformValues(currentZoom, currentProperties)); } - static typename Attributes::Bindings computeAllAttributeBindings( + static AttributeBindings computeAllAttributeBindings( const gfx::VertexBuffer<LayoutVertex>& layoutVertexBuffer, const Binders& paintPropertyBinders, const typename PaintProperties::PossiblyEvaluated& currentProperties) { - return LayoutAttributes::bindings(layoutVertexBuffer) + return gfx::AttributeBindings<LayoutAttributeList>(layoutVertexBuffer) .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, @@ -116,7 +116,7 @@ public: using Binders = typename Program::Binders; using Bitset = typename Binders::Bitset; - ProgramMap(gl::Context& context_, ProgramParameters parameters_) + ProgramMap(gfx::Context& context_, ProgramParameters parameters_) : context(context_), parameters(std::move(parameters_)) { } @@ -134,7 +134,7 @@ public: } private: - gl::Context& context; + gfx::Context& context; ProgramParameters parameters; std::unordered_map<Bitset, Program> programs; }; |