diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2015-02-13 14:51:01 -0800 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2015-03-06 15:42:34 +0100 |
commit | 025654a101eada83c23178ae39e48a0fe495a6f5 (patch) | |
tree | 2bee398a37ecc1db7f33b77feee019f7806859d4 /src/mbgl/shader/shader.cpp | |
parent | e8389d82cdd84d470deb072d82ee9a613cd15df8 (diff) | |
download | qtlocation-mapboxgl-025654a101eada83c23178ae39e48a0fe495a6f5.tar.gz |
throw exception when shader compilation fails
Diffstat (limited to 'src/mbgl/shader/shader.cpp')
-rw-r--r-- | src/mbgl/shader/shader.cpp | 16 |
1 files changed, 7 insertions, 9 deletions
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; } } |