throw exception when shader compilation fails

This commit is contained in:
Konstantin Käfer
2015-02-13 14:51:01 -08:00
committed by Konstantin Käfer
parent e8389d82cd
commit 025654a101
15 changed files with 34 additions and 74 deletions

View File

@@ -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

View File

@@ -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"));
}

View File

@@ -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"));
}

View File

@@ -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"));

View File

@@ -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"));
}

View File

@@ -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"));
}

View File

@@ -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"));
}

View File

@@ -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"));
}

View File

@@ -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"));
}

View File

@@ -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"));
}

View File

@@ -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"));
}

View File

@@ -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"));
}

View File

@@ -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"));

View File

@@ -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;
}
}

View File

@@ -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 {