From dcdff7828e1dc3b5cbfc10a30ee10c2ffec07987 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sun, 12 Dec 2021 15:33:09 +0000 Subject: Move GL shared source into it's own class/file --- gfx/gl/glSource.cpp | 38 ++++++++++++++++++++++++++++++++++++++ gfx/gl/glSource.h | 18 ++++++++++++++++++ gfx/gl/shader-source.h | 17 ----------------- gfx/gl/shader.cpp | 41 +++-------------------------------------- gfx/gl/shader.h | 2 -- lib/embed-glsl.cpp.m4 | 2 +- lib/embed-glsl.h.m4 | 2 +- 7 files changed, 61 insertions(+), 59 deletions(-) create mode 100644 gfx/gl/glSource.cpp create mode 100644 gfx/gl/glSource.h delete mode 100644 gfx/gl/shader-source.h diff --git a/gfx/gl/glSource.cpp b/gfx/gl/glSource.cpp new file mode 100644 index 0000000..13686ae --- /dev/null +++ b/gfx/gl/glSource.cpp @@ -0,0 +1,38 @@ +#include "glSource.h" +#include + +GLsource::ShaderRef +GLsource::compile() const +{ + ShaderRef id {type}; + glShaderSource(id, 1, &text, &len); + glCompileShader(id); + + CheckShaderError(id, GL_COMPILE_STATUS, false, "Error compiling shader!"); + return id; +} + +void +GLsource::CheckShaderError(GLuint shader, GLuint flag, bool isProgram, std::string_view errorMessage) +{ + GLint success = 0; + std::array error {}; + + if (isProgram) { + glGetProgramiv(shader, flag, &success); + } + else { + glGetShaderiv(shader, flag, &success); + } + + if (success == GL_FALSE) { + if (isProgram) { + glGetProgramInfoLog(shader, error.size(), nullptr, error.data()); + } + else { + glGetShaderInfoLog(shader, error.size(), nullptr, error.data()); + } + + throw std::runtime_error {std::string {errorMessage} + ": '" + std::string {error.data(), error.size()} + "'"}; + } +} diff --git a/gfx/gl/glSource.h b/gfx/gl/glSource.h new file mode 100644 index 0000000..53c221b --- /dev/null +++ b/gfx/gl/glSource.h @@ -0,0 +1,18 @@ +#ifndef SHADER_SOURCE_H +#define SHADER_SOURCE_H + +#include +#include + +struct GLsource { + using ShaderRef = glRef; + + const GLchar * text; + GLint len; + GLuint type; + + [[nodiscard]] ShaderRef compile() const; + static void CheckShaderError(GLuint shader, GLuint flag, bool isProgram, std::string_view errorMessage); +}; + +#endif diff --git a/gfx/gl/shader-source.h b/gfx/gl/shader-source.h deleted file mode 100644 index 524025c..0000000 --- a/gfx/gl/shader-source.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef SHADER_SOURCE_H -#define SHADER_SOURCE_H - -#include -#include - -struct GLsource { - using ShaderRef = glRef; - - const GLchar * text; - GLint len; - GLuint type; - - [[nodiscard]] ShaderRef compile() const; -}; - -#endif diff --git a/gfx/gl/shader.cpp b/gfx/gl/shader.cpp index 771db97..06edc5c 100644 --- a/gfx/gl/shader.cpp +++ b/gfx/gl/shader.cpp @@ -1,5 +1,5 @@ #include "shader.h" -#include "gfx/gl/shader-source.h" +#include "gfx/gl/glSource.h" #include #include #include @@ -26,10 +26,10 @@ Shader::ProgramHandle::ProgramHandle(GLuint vs, GLuint fs) : viewProjection_unif glBindAttribLocation(m_program, 2, "normal"); glLinkProgram(m_program); - CheckShaderError(m_program, GL_LINK_STATUS, true, "Error linking shader program"); + GLsource::CheckShaderError(m_program, GL_LINK_STATUS, true, "Error linking shader program"); glValidateProgram(m_program); - CheckShaderError(m_program, GL_VALIDATE_STATUS, true, "Invalid shader program"); + GLsource::CheckShaderError(m_program, GL_VALIDATE_STATUS, true, "Invalid shader program"); viewProjection_uniform = glGetUniformLocation(m_program, "viewProjection"); model_uniform = glGetUniformLocation(m_program, "model"); @@ -86,38 +86,3 @@ Shader::setModel(const Location & loc, Program pid) const } } -void -Shader::CheckShaderError(GLuint shader, GLuint flag, bool isProgram, std::string_view errorMessage) -{ - GLint success = 0; - std::array error {}; - - if (isProgram) { - glGetProgramiv(shader, flag, &success); - } - else { - glGetShaderiv(shader, flag, &success); - } - - if (success == GL_FALSE) { - if (isProgram) { - glGetProgramInfoLog(shader, error.size(), nullptr, error.data()); - } - else { - glGetShaderInfoLog(shader, error.size(), nullptr, error.data()); - } - - throw std::runtime_error {std::string {errorMessage} + ": '" + std::string {error.data(), error.size()} + "'"}; - } -} - -GLsource::ShaderRef -GLsource::compile() const -{ - ShaderRef id {type}; - glShaderSource(id, 1, &text, &len); - glCompileShader(id); - - Shader::CheckShaderError(id, GL_COMPILE_STATUS, false, "Error compiling shader!"); - return id; -} diff --git a/gfx/gl/shader.h b/gfx/gl/shader.h index 8b18e99..3ee9449 100644 --- a/gfx/gl/shader.h +++ b/gfx/gl/shader.h @@ -19,8 +19,6 @@ public: void setModel(const Location &, Program = Program::Basic) const; void setUniform(const GLchar *, glm::vec3 dir) const; - static void CheckShaderError(GLuint shader, GLuint flag, bool isProgram, std::string_view errorMessage); - private: class ProgramHandle { public: diff --git a/lib/embed-glsl.cpp.m4 b/lib/embed-glsl.cpp.m4 index d820756..003db65 100644 --- a/lib/embed-glsl.cpp.m4 +++ b/lib/embed-glsl.cpp.m4 @@ -2,7 +2,7 @@ changecom()dnl // NAME #include "substr(TYPE,1)-NAME.h" #include -#include "gfx/gl/shader-source.h" +#include "gfx/gl/glSource.h" #include "lib/strings.hpp" constexpr const GLchar * src { R"GLSL-EMBED(dnl diff --git a/lib/embed-glsl.h.m4 b/lib/embed-glsl.h.m4 index 918007b..f277c56 100644 --- a/lib/embed-glsl.h.m4 +++ b/lib/embed-glsl.h.m4 @@ -1,4 +1,4 @@ // NAME -#include +#include extern const GLsource NAME`_'substr(TYPE,1); -- cgit v1.2.3