From 219c3f9e32f7c95725852329649b485290f421ec Mon Sep 17 00:00:00 2001 From: David Allemang Date: Mon, 9 Mar 2020 00:32:12 -0400 Subject: [PATCH] mode template for shader, shaderprogram, type aliases --- vis/include/cgl/render.hpp | 96 +++++++++++++++++--------------------- vis/src/main.cpp | 28 +++++------ 2 files changed, 58 insertions(+), 66 deletions(-) diff --git a/vis/include/cgl/render.hpp b/vis/include/cgl/render.hpp index 375d194..fc3cd56 100644 --- a/vis/include/cgl/render.hpp +++ b/vis/include/cgl/render.hpp @@ -48,17 +48,17 @@ namespace cgl { } }; + template class shader { protected: GLuint id{}; - GLenum mode; public: - shader(GLenum mode) : mode(mode) { + shader() { id = glCreateShader(mode); } - shader(GLenum mode, const std::string &src) : shader(mode) { + shader(const std::string &src) : shader() { set_source(src); if (!compile()) @@ -68,7 +68,6 @@ namespace cgl { shader(shader &) = delete; shader(shader &&o) noexcept { - mode = o.mode; id = std::exchange(o.id, 0); }; @@ -80,10 +79,6 @@ namespace cgl { return id; } - [[nodiscard]] GLenum get_mode() const { - return mode; - } - [[nodiscard]] int get(GLenum pname) const { GLint res; glGetShaderiv(id, pname, &res); @@ -144,11 +139,13 @@ namespace cgl { return std::string(buffer); } - void attach(const shader &sh) { + template + void attach(const shader &sh) { glAttachShader(id, sh); } - void detach(const shader &sh) { + template + void detach(const shader &sh) { glDetachShader(id, sh); } @@ -158,17 +155,15 @@ namespace cgl { } }; + template class shaderprogram : public program { - protected: - GLenum mode; - public: - shaderprogram(GLenum mode) : program(), mode(mode) { + shaderprogram() : program() { glProgramParameteri(id, GL_PROGRAM_SEPARABLE, GL_TRUE); } - shaderprogram(GLenum mode, const std::string &src) : shaderprogram(mode) { - shader sh(mode, src); + shaderprogram(const std::string &src) : shaderprogram() { + shader sh(src); attach(sh); @@ -177,14 +172,6 @@ namespace cgl { detach(sh); } - - shaderprogram(shaderprogram &&o) noexcept : program(std::move(o)) { - mode = o.mode; - } - - [[nodiscard]] GLenum get_mode() const { - return mode; - } }; class pipeline { @@ -211,29 +198,28 @@ namespace cgl { return id; } - void use_stages(const shaderprogram &pgm) { - GLbitfield bits; - switch (pgm.get_mode()) { - case GL_VERTEX_SHADER: - bits = GL_VERTEX_SHADER_BIT; - break; - case GL_TESS_CONTROL_SHADER: - bits = GL_TESS_CONTROL_SHADER_BIT; - break; - case GL_TESS_EVALUATION_SHADER: - bits = GL_TESS_EVALUATION_SHADER_BIT; - break; - case GL_GEOMETRY_SHADER: - bits = GL_GEOMETRY_SHADER_BIT; - break; - case GL_FRAGMENT_SHADER: - bits = GL_FRAGMENT_SHADER_BIT; - break; - default: - throw std::domain_error("invalid shaderprogram mode"); - } + void use_stages(const shaderprogram &pgm) { + glUseProgramStages(id, GL_VERTEX_SHADER_BIT, pgm); + } - glUseProgramStages(id, bits, pgm); + void use_stages(const shaderprogram &pgm) { + glUseProgramStages(id, GL_TESS_CONTROL_SHADER_BIT, pgm); + } + + void use_stages(const shaderprogram &pgm) { + glUseProgramStages(id, GL_TESS_EVALUATION_SHADER_BIT, pgm); + } + + void use_stages(const shaderprogram &pgm) { + glUseProgramStages(id, GL_GEOMETRY_SHADER_BIT, pgm); + } + + void use_stages(const shaderprogram &pgm) { + glUseProgramStages(id, GL_FRAGMENT_SHADER_BIT, pgm); + } + + void use_stages(const shaderprogram &pgm) { + glUseProgramStages(id, GL_COMPUTE_SHADER_BIT, pgm); } [[nodiscard]] int get(GLenum pname) const { @@ -250,11 +236,17 @@ namespace cgl { } }; - shader compile_shader(GLenum mode, const std::string &file) { - return shader(mode, utilReadFile(file)); - } + using vert_shader = shader; + using tctl_shader = shader; + using tevl_shader = shader; + using geom_shader = shader; + using frag_shader = shader; + using comp_shader = shader; - shaderprogram compile_shaderprogram(GLenum mode, const std::string &file) { - return shaderprogram(mode, utilReadFile(file)); - } + using vert_program = shaderprogram; + using tctl_program = shaderprogram; + using tevl_program = shaderprogram; + using geom_program = shaderprogram; + using frag_program = shaderprogram; + using comp_program = shaderprogram; } diff --git a/vis/src/main.cpp b/vis/src/main.cpp index 9e6970f..386cf8b 100644 --- a/vis/src/main.cpp +++ b/vis/src/main.cpp @@ -81,22 +81,22 @@ void run(GLFWwindow *window) { // glEnable(GL_CULL_FACE); glCullFace(GL_BACK); - auto defer = cgl::compile_shaderprogram( - GL_VERTEX_SHADER, "shaders/slice/deferred.vs.glsl"); - auto direct_ortho = cgl::compile_shaderprogram( - GL_VERTEX_SHADER, "shaders/direct-ortho.vs.glsl"); - auto direct_stereo = cgl::compile_shaderprogram( - GL_VERTEX_SHADER, "shaders/direct-stereo.vs.glsl"); + auto defer = cgl::vert_program( + utilReadFile("shaders/slice/deferred.vs.glsl")); + auto direct_ortho = cgl::vert_program( + utilReadFile("shaders/direct-ortho.vs.glsl")); + auto direct_stereo = cgl::vert_program( + utilReadFile("shaders/direct-stereo.vs.glsl")); - auto slice = cgl::compile_shaderprogram( - GL_GEOMETRY_SHADER, "shaders/slice/slice.gm.glsl"); - auto curve_stereo = cgl::compile_shaderprogram( - GL_GEOMETRY_SHADER, "shaders/curve-stereo.gm.glsl"); - auto curve_ortho = cgl::compile_shaderprogram( - GL_GEOMETRY_SHADER, "shaders/curve-ortho.gm.glsl"); + auto slice = cgl::geom_program( + utilReadFile("shaders/slice/slice.gm.glsl")); + auto curve_stereo = cgl::geom_program( + utilReadFile("shaders/curve-stereo.gm.glsl")); + auto curve_ortho = cgl::geom_program( + utilReadFile("shaders/curve-ortho.gm.glsl")); - auto solid = cgl::compile_shaderprogram( - GL_FRAGMENT_SHADER, "shaders/solid.fs.glsl"); + auto solid = cgl::frag_program( + utilReadFile("shaders/solid.fs.glsl")); cgl::pipeline proj_pipe; proj_pipe.use_stages(direct_stereo);