From 50089bf9969edb5f10ff552b90620a4882e3c474 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 20 Feb 2021 13:38:38 +0000 Subject: m4 based GLSL embedding Passes a lint check, less mangling, more automation --- Jamroot.jam | 23 ++++++++++++++--------- gfx/gl/shader-source.h | 20 ++++++++++++++++++++ gfx/gl/shader.cpp | 34 ++++++++++++++-------------------- gfx/gl/shader.h | 6 +++--- utility/embed-glsl.cpp.m4 | 10 ++++++++++ utility/embed-glsl.h.m4 | 4 ++++ 6 files changed, 65 insertions(+), 32 deletions(-) create mode 100644 gfx/gl/shader-source.h create mode 100644 utility/embed-glsl.cpp.m4 create mode 100644 utility/embed-glsl.h.m4 diff --git a/Jamroot.jam b/Jamroot.jam index 51097f7..953092a 100644 --- a/Jamroot.jam +++ b/Jamroot.jam @@ -2,6 +2,7 @@ using gcc : 11.0.0 ; using pkg-config ; import pkg-config ; import type : register ; +import type : type ; import generators : register-standard ; import testing ; import lex ; @@ -17,8 +18,6 @@ project : requirements debug:extra debug:on release:on - tidy:gfx/gl/shaders/fs-basicShader.h - tidy:gfx/gl/shaders/vs-basicShader.h tidy:gfx/models/obj.cpp tidy:boost-* tidy:bugprone-* @@ -37,17 +36,23 @@ project : requirements tidy:TIDY ; -type.register VERTEXSHADER : vs ; -type.register FRAGMENTSHADER : fs ; +type.register GL_VERTEX_SHADER : vs ; +type.register GL_FRAGMENT_SHADER : fs ; -generators.register-standard xxd.i : VERTEXSHADER : C(vs-%) H(vs-%) ; -generators.register-standard xxd.i : FRAGMENTSHADER : C(fs-%) H(fs-%) ; +generators.register-standard embed.glsl : GL_VERTEX_SHADER : CPP(vs-%) H(vs-%) ; +generators.register-standard embed.glsl : GL_FRAGMENT_SHADER : CPP(fs-%) H(fs-%) ; -actions xxd.i +actions embed.glsl { - ( cd $(2:D) ; xxd -i $(2:B)$(2:S) ) | tee $(1[1]) | cproto -veo $(1[2]) + m4 -DNAME=$(2:B) -DTYPE=$(2:S) > $(1[2]) utility/embed-glsl.h.m4 + m4 -DSOURCE=$(2) -DNAME=$(2:B) -DTYPE=$(2:S) -DGLTYPE=$(OPTIONS) > $(1[1]) utility/embed-glsl.cpp.m4 } -IMPORT $(__name__) : xxd.i : : xxd.i ; +rule embed.glsl ( targets * : sources * : properties * ) +{ + DEPENDS $(targets) : utility/embed-glsl.h.m4 utility/embed-glsl.cpp.m4 ; + OPTIONS on $(targets) = [ type.type $(sources) ] ; +} +IMPORT $(__name__) : embed.glsl : : embed.glsl ; exe iliketrains : application/main.cpp diff --git a/gfx/gl/shader-source.h b/gfx/gl/shader-source.h new file mode 100644 index 0000000..4fbbe5b --- /dev/null +++ b/gfx/gl/shader-source.h @@ -0,0 +1,20 @@ +#ifndef SHADER_SOURCE_H +#define SHADER_SOURCE_H + +#include + +struct GLsource { + const GLchar * text; + GLint len; + GLuint type; +}; + +constexpr auto +constexpr_strlen(const GLchar * const s) +{ + auto e {s}; + while (*++e) { } + return e - s; +} + +#endif diff --git a/gfx/gl/shader.cpp b/gfx/gl/shader.cpp index f80ab22..badaaef 100644 --- a/gfx/gl/shader.cpp +++ b/gfx/gl/shader.cpp @@ -10,11 +10,10 @@ #include #include -Shader::ProgramHandle::ProgramHandle(std::initializer_list srcs) : viewProjection_uniform {}, model_uniform {} +Shader::ProgramHandle::ProgramHandle(GLuint vs, GLuint fs) : viewProjection_uniform {}, model_uniform {} { - for (const auto & srcId : srcs) { - glAttachShader(m_program, srcId); - } + glAttachShader(m_program, vs); + glAttachShader(m_program, fs); glBindAttribLocation(m_program, 0, "position"); glBindAttribLocation(m_program, 1, "texCoord"); @@ -31,17 +30,17 @@ Shader::ProgramHandle::ProgramHandle(std::initializer_list srcs) : viewP } Shader::Shader() : - programs {{ProgramHandle { - Source {{basicShader_vs, basicShader_vs_len}, GL_VERTEX_SHADER}.id, - Source {{basicShader_fs, basicShader_fs_len}, GL_FRAGMENT_SHADER}.id, + programs {{{ + Source {basicShader_vs}.id, + Source {basicShader_fs}.id, }, - ProgramHandle { - Source {{waterShader_vs, waterShader_vs_len}, GL_VERTEX_SHADER}.id, - Source {{waterShader_fs, waterShader_fs_len}, GL_FRAGMENT_SHADER}.id, + { + Source {waterShader_vs}.id, + Source {waterShader_fs}.id, }, - ProgramHandle { - Source {{landmassShader_vs, landmassShader_vs_len}, GL_VERTEX_SHADER}.id, - Source {{landmassShader_fs, landmassShader_fs_len}, GL_FRAGMENT_SHADER}.id, + { + Source {landmassShader_vs}.id, + Source {landmassShader_fs}.id, }}} { } @@ -99,14 +98,9 @@ Shader::CheckShaderError(GLuint shader, GLuint flag, bool isProgram, std::string } } -Shader::Source::Source(const std::basic_string_view text, GLuint type) : - Source {(const GLchar *)(text.data()), (GLint)(text.length()), type} -{ -} - -Shader::Source::Source(const GLchar * text, GLint len, unsigned int type) : id {type} +Shader::Source::Source(const GLsource src) : id {src.type} { - glShaderSource(id, 1, &text, &len); + glShaderSource(id, 1, &src.text, &src.len); glCompileShader(id); CheckShaderError(id, GL_COMPILE_STATUS, false, "Error compiling shader!"); diff --git a/gfx/gl/shader.h b/gfx/gl/shader.h index 47a2b7d..293ce9b 100644 --- a/gfx/gl/shader.h +++ b/gfx/gl/shader.h @@ -1,6 +1,7 @@ #ifndef SHADER_INCLUDED_H #define SHADER_INCLUDED_H +#include "shader-source.h" #include #include #include @@ -22,8 +23,7 @@ private: public: using ShaderRef = glRef; - Source(const std::basic_string_view text, GLuint type); - Source(const GLchar * text, GLint len, GLuint type); + explicit Source(const GLsource src); ShaderRef id; }; @@ -32,7 +32,7 @@ private: class ProgramHandle { public: - explicit ProgramHandle(std::initializer_list); + ProgramHandle(GLuint, GLuint); using ProgramRef = glRef; ProgramRef m_program; diff --git a/utility/embed-glsl.cpp.m4 b/utility/embed-glsl.cpp.m4 new file mode 100644 index 0000000..febba68 --- /dev/null +++ b/utility/embed-glsl.cpp.m4 @@ -0,0 +1,10 @@ +changecom()dnl +// NAME +#include "substr(TYPE,1)-NAME.h" +#include + +constexpr const GLchar * src { R"GLSL-EMBED(dnl +include(SOURCE))GLSL-EMBED" }; +constexpr auto len { constexpr_strlen (src) }; + +const GLsource NAME`_'substr(TYPE,1) { src, len, GLTYPE }; diff --git a/utility/embed-glsl.h.m4 b/utility/embed-glsl.h.m4 new file mode 100644 index 0000000..918007b --- /dev/null +++ b/utility/embed-glsl.h.m4 @@ -0,0 +1,4 @@ +// NAME +#include + +extern const GLsource NAME`_'substr(TYPE,1); -- cgit v1.2.3