diff --git a/include/mbgl/util/exception.hpp b/include/mbgl/util/exception.hpp new file mode 100644 index 000000000..0b4403270 --- /dev/null +++ b/include/mbgl/util/exception.hpp @@ -0,0 +1,27 @@ +#ifndef MBGL_UTIL_EXCEPTION +#define MBGL_UTIL_EXCEPTION + +#include + +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 08b55a566..57a60cc51 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 483de4867..b7d593f2e 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 0dfd67e25..0f626ec9e 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 432a64f69..c2364c9be 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 5b9e7ba20..b3c5638b5 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 c45378378..7bfd1412d 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 9802afb53..bd2137de3 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 98d208297..ee2a6bcd4 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 0a6013b17..66369d528 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 ce7ddae91..93dbb42a5 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 14c6ddc7c..2d6954920 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 757884f39..ca1dab58d 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 550c15966..00b928b44 100644 --- a/src/mbgl/shader/shader.cpp +++ b/src/mbgl/shader/shader.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include @@ -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 log = mbgl::util::make_unique(logLength); if (logLength > 0) { - std::unique_ptr log = mbgl::util::make_unique(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 log = mbgl::util::make_unique(logLength); if (logLength > 0) { - std::unique_ptr log = mbgl::util::make_unique(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 965180ff9..b3d9b4e46 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 {