summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mbgl/util/exception.hpp27
-rw-r--r--src/mbgl/shader/dot_shader.cpp5
-rw-r--r--src/mbgl/shader/gaussian_shader.cpp7
-rw-r--r--src/mbgl/shader/icon_shader.cpp5
-rw-r--r--src/mbgl/shader/line_shader.cpp5
-rw-r--r--src/mbgl/shader/linejoin_shader.cpp5
-rw-r--r--src/mbgl/shader/linepattern_shader.cpp5
-rw-r--r--src/mbgl/shader/linesdf_shader.cpp5
-rw-r--r--src/mbgl/shader/outline_shader.cpp5
-rw-r--r--src/mbgl/shader/pattern_shader.cpp5
-rw-r--r--src/mbgl/shader/plain_shader.cpp5
-rw-r--r--src/mbgl/shader/raster_shader.cpp7
-rw-r--r--src/mbgl/shader/sdf_shader.cpp5
-rw-r--r--src/mbgl/shader/shader.cpp16
-rw-r--r--src/mbgl/shader/shader.hpp1
15 files changed, 34 insertions, 74 deletions
diff --git a/include/mbgl/util/exception.hpp b/include/mbgl/util/exception.hpp
new file mode 100644
index 0000000000..0b4403270c
--- /dev/null
+++ b/include/mbgl/util/exception.hpp
@@ -0,0 +1,27 @@
+#ifndef MBGL_UTIL_EXCEPTION
+#define MBGL_UTIL_EXCEPTION
+
+#include <stdexcept>
+
+namespace mbgl {
+namespace util {
+
+struct Exception : std::runtime_error {
+ inline Exception(const char *msg) : std::runtime_error(msg) {}
+ inline Exception(const std::string &msg) : std::runtime_error(msg) {}
+};
+
+struct MisuseException : Exception {
+ inline MisuseException(const char *msg) : Exception(msg) {}
+ inline MisuseException(const std::string &msg) : Exception(msg) {}
+};
+
+struct ShaderException : Exception {
+ inline ShaderException(const char *msg) : Exception(msg) {}
+ inline ShaderException(const std::string &msg) : Exception(msg) {}
+};
+
+}
+}
+
+#endif
diff --git a/src/mbgl/shader/dot_shader.cpp b/src/mbgl/shader/dot_shader.cpp
index 08b55a566b..57a60cc519 100644
--- a/src/mbgl/shader/dot_shader.cpp
+++ b/src/mbgl/shader/dot_shader.cpp
@@ -12,11 +12,6 @@ DotShader::DotShader()
shaders[DOT_SHADER].vertex,
shaders[DOT_SHADER].fragment
) {
- if (!valid) {
- fprintf(stderr, "invalid dot shader\n");
- return;
- }
-
a_pos = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_pos"));
}
diff --git a/src/mbgl/shader/gaussian_shader.cpp b/src/mbgl/shader/gaussian_shader.cpp
index 483de4867e..b7d593f2e4 100644
--- a/src/mbgl/shader/gaussian_shader.cpp
+++ b/src/mbgl/shader/gaussian_shader.cpp
@@ -12,13 +12,6 @@ GaussianShader::GaussianShader()
shaders[GAUSSIAN_SHADER].vertex,
shaders[GAUSSIAN_SHADER].fragment
) {
- if (!valid) {
-#if defined(DEBUG)
- fprintf(stderr, "invalid raster shader\n");
-#endif
- return;
- }
-
a_pos = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_pos"));
}
diff --git a/src/mbgl/shader/icon_shader.cpp b/src/mbgl/shader/icon_shader.cpp
index 0dfd67e25b..0f626ec9e7 100644
--- a/src/mbgl/shader/icon_shader.cpp
+++ b/src/mbgl/shader/icon_shader.cpp
@@ -12,11 +12,6 @@ IconShader::IconShader()
shaders[ICON_SHADER].vertex,
shaders[ICON_SHADER].fragment
) {
- if (!valid) {
- fprintf(stderr, "invalid icon shader\n");
- return;
- }
-
a_pos = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_pos"));
a_offset = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_offset"));
a_data1 = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_data1"));
diff --git a/src/mbgl/shader/line_shader.cpp b/src/mbgl/shader/line_shader.cpp
index 432a64f695..c2364c9bea 100644
--- a/src/mbgl/shader/line_shader.cpp
+++ b/src/mbgl/shader/line_shader.cpp
@@ -12,11 +12,6 @@ LineShader::LineShader()
shaders[LINE_SHADER].vertex,
shaders[LINE_SHADER].fragment
) {
- if (!valid) {
- fprintf(stderr, "invalid line shader\n");
- return;
- }
-
a_pos = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_pos"));
a_data = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_data"));
}
diff --git a/src/mbgl/shader/linejoin_shader.cpp b/src/mbgl/shader/linejoin_shader.cpp
index 5b9e7ba20a..b3c5638b5d 100644
--- a/src/mbgl/shader/linejoin_shader.cpp
+++ b/src/mbgl/shader/linejoin_shader.cpp
@@ -12,11 +12,6 @@ LinejoinShader::LinejoinShader()
shaders[LINEJOIN_SHADER].vertex,
shaders[LINEJOIN_SHADER].fragment
) {
- if (!valid) {
- fprintf(stderr, "invalid line shader\n");
- return;
- }
-
a_pos = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_pos"));
}
diff --git a/src/mbgl/shader/linepattern_shader.cpp b/src/mbgl/shader/linepattern_shader.cpp
index c45378378d..7bfd1412db 100644
--- a/src/mbgl/shader/linepattern_shader.cpp
+++ b/src/mbgl/shader/linepattern_shader.cpp
@@ -12,11 +12,6 @@ LinepatternShader::LinepatternShader()
shaders[LINEPATTERN_SHADER].vertex,
shaders[LINEPATTERN_SHADER].fragment
) {
- if (!valid) {
- fprintf(stderr, "invalid line pattern shader\n");
- return;
- }
-
a_pos = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_pos"));
a_data = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_data"));
}
diff --git a/src/mbgl/shader/linesdf_shader.cpp b/src/mbgl/shader/linesdf_shader.cpp
index 9802afb532..bd2137de30 100644
--- a/src/mbgl/shader/linesdf_shader.cpp
+++ b/src/mbgl/shader/linesdf_shader.cpp
@@ -12,11 +12,6 @@ LineSDFShader::LineSDFShader()
shaders[LINESDF_SHADER].vertex,
shaders[LINESDF_SHADER].fragment
) {
- if (!valid) {
- fprintf(stderr, "invalid line shader\n");
- return;
- }
-
a_pos = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_pos"));
a_data = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_data"));
}
diff --git a/src/mbgl/shader/outline_shader.cpp b/src/mbgl/shader/outline_shader.cpp
index 98d208297c..ee2a6bcd40 100644
--- a/src/mbgl/shader/outline_shader.cpp
+++ b/src/mbgl/shader/outline_shader.cpp
@@ -12,11 +12,6 @@ OutlineShader::OutlineShader()
shaders[OUTLINE_SHADER].vertex,
shaders[OUTLINE_SHADER].fragment
) {
- if (!valid) {
- fprintf(stderr, "invalid outline shader\n");
- return;
- }
-
a_pos = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_pos"));
}
diff --git a/src/mbgl/shader/pattern_shader.cpp b/src/mbgl/shader/pattern_shader.cpp
index 0a6013b17d..66369d528a 100644
--- a/src/mbgl/shader/pattern_shader.cpp
+++ b/src/mbgl/shader/pattern_shader.cpp
@@ -12,11 +12,6 @@ PatternShader::PatternShader()
shaders[PATTERN_SHADER].vertex,
shaders[PATTERN_SHADER].fragment
) {
- if (!valid) {
- fprintf(stderr, "invalid pattern shader\n");
- return;
- }
-
a_pos = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_pos"));
}
diff --git a/src/mbgl/shader/plain_shader.cpp b/src/mbgl/shader/plain_shader.cpp
index ce7ddae918..93dbb42a57 100644
--- a/src/mbgl/shader/plain_shader.cpp
+++ b/src/mbgl/shader/plain_shader.cpp
@@ -12,11 +12,6 @@ PlainShader::PlainShader()
shaders[PLAIN_SHADER].vertex,
shaders[PLAIN_SHADER].fragment
) {
- if (!valid) {
- fprintf(stderr, "invalid plain shader\n");
- return;
- }
-
a_pos = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_pos"));
}
diff --git a/src/mbgl/shader/raster_shader.cpp b/src/mbgl/shader/raster_shader.cpp
index 14c6ddc7c4..2d69549209 100644
--- a/src/mbgl/shader/raster_shader.cpp
+++ b/src/mbgl/shader/raster_shader.cpp
@@ -12,13 +12,6 @@ RasterShader::RasterShader()
shaders[RASTER_SHADER].vertex,
shaders[RASTER_SHADER].fragment
) {
- if (!valid) {
-#if defined(DEBUG)
- fprintf(stderr, "invalid raster shader\n");
-#endif
- return;
- }
-
a_pos = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_pos"));
}
diff --git a/src/mbgl/shader/sdf_shader.cpp b/src/mbgl/shader/sdf_shader.cpp
index 757884f39c..ca1dab58dd 100644
--- a/src/mbgl/shader/sdf_shader.cpp
+++ b/src/mbgl/shader/sdf_shader.cpp
@@ -12,11 +12,6 @@ SDFShader::SDFShader()
shaders[SDF_SHADER].vertex,
shaders[SDF_SHADER].fragment
) {
- if (!valid) {
- fprintf(stderr, "invalid sdf shader\n");
- return;
- }
-
a_pos = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_pos"));
a_offset = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_offset"));
a_data1 = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_data1"));
diff --git a/src/mbgl/shader/shader.cpp b/src/mbgl/shader/shader.cpp
index 550c159665..00b928b445 100644
--- a/src/mbgl/shader/shader.cpp
+++ b/src/mbgl/shader/shader.cpp
@@ -1,6 +1,7 @@
#include <mbgl/shader/shader.hpp>
#include <mbgl/platform/gl.hpp>
#include <mbgl/util/stopwatch.hpp>
+#include <mbgl/util/exception.hpp>
#include <mbgl/platform/log.hpp>
#include <mbgl/platform/platform.hpp>
@@ -14,7 +15,6 @@ using namespace mbgl;
Shader::Shader(const char *name_, const GLchar *vertSource, const GLchar *fragSource)
: name(name_),
- valid(false),
program(0) {
util::stopwatch stopwatch("shader compilation", Event::Shader);
@@ -26,7 +26,7 @@ Shader::Shader(const char *name_, const GLchar *vertSource, const GLchar *fragSo
Log::Error(Event::Shader, "Vertex shader %s failed to compile: %s", name, vertSource);
MBGL_CHECK_ERROR(glDeleteProgram(program));
program = 0;
- return;
+ throw util::ShaderException(std::string { "Vertex shader " } + name + " failed to compile");
}
if (!compileShader(&fragShader, GL_FRAGMENT_SHADER, fragSource)) {
@@ -35,7 +35,7 @@ Shader::Shader(const char *name_, const GLchar *vertSource, const GLchar *fragSo
vertShader = 0;
MBGL_CHECK_ERROR(glDeleteProgram(program));
program = 0;
- return;
+ throw util::ShaderException(std::string { "Fragment shader " } + name + " failed to compile");
}
// Attach shaders
@@ -51,8 +51,8 @@ Shader::Shader(const char *name_, const GLchar *vertSource, const GLchar *fragSo
if (status == 0) {
GLint logLength;
MBGL_CHECK_ERROR(glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength));
+ std::unique_ptr<GLchar[]> log = mbgl::util::make_unique<GLchar[]>(logLength);
if (logLength > 0) {
- std::unique_ptr<GLchar[]> log = mbgl::util::make_unique<GLchar[]>(logLength);
MBGL_CHECK_ERROR(glGetProgramInfoLog(program, logLength, &logLength, log.get()));
Log::Error(Event::Shader, "Program failed to link: %s", log.get());
}
@@ -63,7 +63,7 @@ Shader::Shader(const char *name_, const GLchar *vertSource, const GLchar *fragSo
fragShader = 0;
MBGL_CHECK_ERROR(glDeleteProgram(program));
program = 0;
- return;
+ throw util::ShaderException(std::string { "Program " } + name + " failed to link: " + log.get());
}
}
@@ -76,8 +76,8 @@ Shader::Shader(const char *name_, const GLchar *vertSource, const GLchar *fragSo
if (status == 0) {
GLint logLength;
MBGL_CHECK_ERROR(glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength));
+ std::unique_ptr<GLchar[]> log = mbgl::util::make_unique<GLchar[]>(logLength);
if (logLength > 0) {
- std::unique_ptr<GLchar[]> log = mbgl::util::make_unique<GLchar[]>(logLength);
MBGL_CHECK_ERROR(glGetProgramInfoLog(program, logLength, &logLength, log.get()));
Log::Error(Event::Shader, "Program failed to validate: %s", log.get());
}
@@ -88,6 +88,7 @@ Shader::Shader(const char *name_, const GLchar *vertSource, const GLchar *fragSo
fragShader = 0;
MBGL_CHECK_ERROR(glDeleteProgram(program));
program = 0;
+ throw util::ShaderException(std::string { "Program " } + name + " failed to link: " + log.get());
}
}
@@ -96,8 +97,6 @@ Shader::Shader(const char *name_, const GLchar *vertSource, const GLchar *fragSo
MBGL_CHECK_ERROR(glDeleteShader(vertShader));
MBGL_CHECK_ERROR(glDetachShader(program, fragShader));
MBGL_CHECK_ERROR(glDeleteShader(fragShader));
-
- valid = true;
}
@@ -141,6 +140,5 @@ Shader::~Shader() {
if (program) {
MBGL_CHECK_ERROR(glDeleteProgram(program));
program = 0;
- valid = false;
}
}
diff --git a/src/mbgl/shader/shader.hpp b/src/mbgl/shader/shader.hpp
index 965180ff96..b3d9b4e46c 100644
--- a/src/mbgl/shader/shader.hpp
+++ b/src/mbgl/shader/shader.hpp
@@ -13,7 +13,6 @@ public:
Shader(const char *name, const char *vertex, const char *fragment);
~Shader();
const char *name;
- bool valid;
uint32_t program;
inline uint32_t getID() const {