throw exception when shader compilation fails
This commit is contained in:
committed by
Konstantin Käfer
parent
e8389d82cd
commit
025654a101
27
include/mbgl/util/exception.hpp
Normal file
27
include/mbgl/util/exception.hpp
Normal 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
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
|
||||
@@ -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"));
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
|
||||
@@ -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"));
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user