summaryrefslogtreecommitdiff
path: root/src/mbgl/programs
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/programs')
-rw-r--r--src/mbgl/programs/program.hpp35
-rw-r--r--src/mbgl/programs/program_parameters.cpp30
-rw-r--r--src/mbgl/programs/program_parameters.hpp14
-rw-r--r--src/mbgl/programs/programs.hpp26
-rw-r--r--src/mbgl/programs/symbol_program.hpp3
5 files changed, 81 insertions, 27 deletions
diff --git a/src/mbgl/programs/program.hpp b/src/mbgl/programs/program.hpp
index 420d2e1397..bbe4885745 100644
--- a/src/mbgl/programs/program.hpp
+++ b/src/mbgl/programs/program.hpp
@@ -9,18 +9,21 @@
#include <mbgl/shaders/shaders.hpp>
#include <mbgl/util/io.hpp>
+#include <unordered_map>
+
namespace mbgl {
template <class Shaders,
class Primitive,
class LayoutAttrs,
class Uniforms,
- class PaintProperties>
+ class PaintProps>
class Program {
public:
using LayoutAttributes = LayoutAttrs;
using LayoutVertex = typename LayoutAttributes::Vertex;
+ using PaintProperties = PaintProps;
using PaintPropertyBinders = typename PaintProperties::Binders;
using PaintAttributes = typename PaintPropertyBinders::Attributes;
using Attributes = gl::ConcatenateAttributes<LayoutAttributes, PaintAttributes>;
@@ -71,4 +74,34 @@ public:
}
};
+template <class Program>
+class ProgramMap {
+public:
+ using PaintProperties = typename Program::PaintProperties;
+ using PaintPropertyBinders = typename Program::PaintPropertyBinders;
+ using Bitset = typename PaintPropertyBinders::Bitset;
+
+ ProgramMap(gl::Context& context_, ProgramParameters parameters_)
+ : context(context_),
+ parameters(std::move(parameters_)) {
+ }
+
+ Program& get(const typename PaintProperties::Evaluated& currentProperties) {
+ Bitset bits = PaintPropertyBinders::constants(currentProperties);
+ auto it = programs.find(bits);
+ if (it != programs.end()) {
+ return it->second;
+ }
+ return programs.emplace(std::piecewise_construct,
+ std::forward_as_tuple(bits),
+ std::forward_as_tuple(context,
+ parameters.withAdditionalDefines(PaintPropertyBinders::defines(currentProperties)))).first->second;
+ }
+
+private:
+ gl::Context& context;
+ ProgramParameters parameters;
+ std::unordered_map<Bitset, Program> programs;
+};
+
} // namespace mbgl
diff --git a/src/mbgl/programs/program_parameters.cpp b/src/mbgl/programs/program_parameters.cpp
index f9f680ac1e..e76ec4be71 100644
--- a/src/mbgl/programs/program_parameters.cpp
+++ b/src/mbgl/programs/program_parameters.cpp
@@ -7,7 +7,7 @@ namespace mbgl {
ProgramParameters::ProgramParameters(const float pixelRatio,
const bool overdraw,
- std::string cacheDir_)
+ optional<std::string> cacheDir_)
: defines([&] {
std::ostringstream ss;
ss.imbue(std::locale("C"));
@@ -18,15 +18,31 @@ ProgramParameters::ProgramParameters(const float pixelRatio,
}
return ss.str();
}()),
- hash(std::hash<std::string>()(defines)),
cacheDir(std::move(cacheDir_)) {
}
-std::string ProgramParameters::cachePath(const char* name) const {
- std::ostringstream ss;
- ss << cacheDir << "/com.mapbox.gl.shader." << name << "." << std::setfill('0')
- << std::setw(sizeof(size_t) * 2) << std::hex << hash << ".pbf";
- return ss.str();
+const std::string& ProgramParameters::getDefines() const {
+ return defines;
+}
+
+optional<std::string> ProgramParameters::cachePath(const char* name) const {
+ if (!cacheDir) {
+ return {};
+ } else {
+ std::ostringstream ss;
+ ss << *cacheDir << "/com.mapbox.gl.shader." << name << "." << std::setfill('0')
+ << std::setw(sizeof(size_t) * 2) << std::hex << std::hash<std::string>()(defines) << ".pbf";
+ return ss.str();
+ }
+}
+
+ProgramParameters ProgramParameters::withAdditionalDefines(const std::vector<std::string>& additionalDefines) const {
+ ProgramParameters result(*this);
+ for (const auto& define : additionalDefines) {
+ result.defines += define;
+ result.defines += "\n";
+ }
+ return result;
}
} // namespace mbgl
diff --git a/src/mbgl/programs/program_parameters.hpp b/src/mbgl/programs/program_parameters.hpp
index 420658d089..e94e61c217 100644
--- a/src/mbgl/programs/program_parameters.hpp
+++ b/src/mbgl/programs/program_parameters.hpp
@@ -1,20 +1,24 @@
#pragma once
+#include <mbgl/util/optional.hpp>
+
#include <string>
+#include <vector>
namespace mbgl {
class ProgramParameters {
public:
- ProgramParameters(float pixelRatio, bool overdraw, std::string cacheDir);
+ ProgramParameters(float pixelRatio, bool overdraw, optional<std::string> cacheDir);
- const std::string defines;
+ const std::string& getDefines() const;
+ optional<std::string> cachePath(const char* name) const;
- std::string cachePath(const char* name) const;
+ ProgramParameters withAdditionalDefines(const std::vector<std::string>& defines) const;
private:
- const std::size_t hash;
- const std::string cacheDir;
+ std::string defines;
+ optional<std::string> cacheDir;
};
} // namespace mbgl
diff --git a/src/mbgl/programs/programs.hpp b/src/mbgl/programs/programs.hpp
index b58d2e3bee..37ced32745 100644
--- a/src/mbgl/programs/programs.hpp
+++ b/src/mbgl/programs/programs.hpp
@@ -35,21 +35,21 @@ public:
collisionBox(context, programParameters) {
}
- CircleProgram circle;
+ ProgramMap<CircleProgram> circle;
ExtrusionTextureProgram extrusionTexture;
- FillProgram fill;
- FillExtrusionProgram fillExtrusion;
- FillExtrusionPatternProgram fillExtrusionPattern;
- FillPatternProgram fillPattern;
- FillOutlineProgram fillOutline;
- FillOutlinePatternProgram fillOutlinePattern;
- LineProgram line;
- LineSDFProgram lineSDF;
- LinePatternProgram linePattern;
+ ProgramMap<FillProgram> fill;
+ ProgramMap<FillExtrusionProgram> fillExtrusion;
+ ProgramMap<FillExtrusionPatternProgram> fillExtrusionPattern;
+ ProgramMap<FillPatternProgram> fillPattern;
+ ProgramMap<FillOutlineProgram> fillOutline;
+ ProgramMap<FillOutlinePatternProgram> fillOutlinePattern;
+ ProgramMap<LineProgram> line;
+ ProgramMap<LineSDFProgram> lineSDF;
+ ProgramMap<LinePatternProgram> linePattern;
RasterProgram raster;
- SymbolIconProgram symbolIcon;
- SymbolSDFIconProgram symbolIconSDF;
- SymbolSDFTextProgram symbolGlyph;
+ ProgramMap<SymbolIconProgram> symbolIcon;
+ ProgramMap<SymbolSDFIconProgram> symbolIconSDF;
+ ProgramMap<SymbolSDFTextProgram> symbolGlyph;
DebugProgram debug;
CollisionBoxProgram collisionBox;
diff --git a/src/mbgl/programs/symbol_program.hpp b/src/mbgl/programs/symbol_program.hpp
index 1b7232c9e4..01e95f456d 100644
--- a/src/mbgl/programs/symbol_program.hpp
+++ b/src/mbgl/programs/symbol_program.hpp
@@ -324,7 +324,7 @@ template <class Shaders,
class Primitive,
class LayoutAttrs,
class Uniforms,
- class PaintProperties>
+ class PaintProps>
class SymbolProgram {
public:
using LayoutAttributes = LayoutAttrs;
@@ -332,6 +332,7 @@ public:
using LayoutAndSizeAttributes = gl::ConcatenateAttributes<LayoutAttributes, SymbolSizeAttributes>;
+ using PaintProperties = PaintProps;
using PaintPropertyBinders = typename PaintProperties::Binders;
using PaintAttributes = typename PaintPropertyBinders::Attributes;
using Attributes = gl::ConcatenateAttributes<LayoutAndSizeAttributes, PaintAttributes>;