From e56896db9bf6e7a4fdb190b3f151e2c79a33b585 Mon Sep 17 00:00:00 2001 From: David Allemang Date: Mon, 9 Mar 2020 00:16:30 -0400 Subject: [PATCH] tweak raii shader constructors --- vis/include/cgl/render.hpp | 54 +++++++++++++++++--------------------- vis/src/main.cpp | 14 +++++----- 2 files changed, 31 insertions(+), 37 deletions(-) diff --git a/vis/include/cgl/render.hpp b/vis/include/cgl/render.hpp index e608419..375d194 100644 --- a/vis/include/cgl/render.hpp +++ b/vis/include/cgl/render.hpp @@ -58,6 +58,13 @@ namespace cgl { id = glCreateShader(mode); } + shader(GLenum mode, const std::string &src) : shader(mode) { + set_source(src); + + if (!compile()) + throw shader_error(get_info_log()); + } + shader(shader &) = delete; shader(shader &&o) noexcept { @@ -160,6 +167,17 @@ namespace cgl { glProgramParameteri(id, GL_PROGRAM_SEPARABLE, GL_TRUE); } + shaderprogram(GLenum mode, const std::string &src) : shaderprogram(mode) { + shader sh(mode, src); + + attach(sh); + + if (!link()) + throw shader_error(get_info_log()); + + detach(sh); + } + shaderprogram(shaderprogram &&o) noexcept : program(std::move(o)) { mode = o.mode; } @@ -211,6 +229,8 @@ namespace cgl { case GL_FRAGMENT_SHADER: bits = GL_FRAGMENT_SHADER_BIT; break; + default: + throw std::domain_error("invalid shaderprogram mode"); } glUseProgramStages(id, bits, pgm); @@ -230,37 +250,11 @@ namespace cgl { } }; - shader compile_shader(GLenum mode, const std::string &src) { - shader res(mode); - - res.set_source(src); - - if (!res.compile()) - throw shader_error(res.get_info_log()); - - return res; + shader compile_shader(GLenum mode, const std::string &file) { + return shader(mode, utilReadFile(file)); } - shader compile_shader_file(GLenum mode, const std::string &file) { - return compile_shader(mode, utilReadFile(file)); - } - - shaderprogram compile_shaderprogram(GLenum mode, const std::string &src) { - shader sh = compile_shader(mode, src); - - shaderprogram res(mode); - - res.attach(sh); - - if (!res.link()) - throw shader_error(res.get_info_log()); - - res.detach(sh); - - return res; - } - - shaderprogram compile_shaderprogram_file(GLenum mode, const std::string &file) { - return compile_shaderprogram(mode, utilReadFile(file)); + shaderprogram compile_shaderprogram(GLenum mode, const std::string &file) { + return shaderprogram(mode, utilReadFile(file)); } } diff --git a/vis/src/main.cpp b/vis/src/main.cpp index a52b4a8..9e6970f 100644 --- a/vis/src/main.cpp +++ b/vis/src/main.cpp @@ -81,21 +81,21 @@ void run(GLFWwindow *window) { // glEnable(GL_CULL_FACE); glCullFace(GL_BACK); - auto defer = cgl::compile_shaderprogram_file( + auto defer = cgl::compile_shaderprogram( GL_VERTEX_SHADER, "shaders/slice/deferred.vs.glsl"); - auto direct_ortho = cgl::compile_shaderprogram_file( + auto direct_ortho = cgl::compile_shaderprogram( GL_VERTEX_SHADER, "shaders/direct-ortho.vs.glsl"); - auto direct_stereo = cgl::compile_shaderprogram_file( + auto direct_stereo = cgl::compile_shaderprogram( GL_VERTEX_SHADER, "shaders/direct-stereo.vs.glsl"); - auto slice = cgl::compile_shaderprogram_file( + auto slice = cgl::compile_shaderprogram( GL_GEOMETRY_SHADER, "shaders/slice/slice.gm.glsl"); - auto curve_stereo = cgl::compile_shaderprogram_file( + auto curve_stereo = cgl::compile_shaderprogram( GL_GEOMETRY_SHADER, "shaders/curve-stereo.gm.glsl"); - auto curve_ortho = cgl::compile_shaderprogram_file( + auto curve_ortho = cgl::compile_shaderprogram( GL_GEOMETRY_SHADER, "shaders/curve-ortho.gm.glsl"); - auto solid = cgl::compile_shaderprogram_file( + auto solid = cgl::compile_shaderprogram( GL_FRAGMENT_SHADER, "shaders/solid.fs.glsl"); cgl::pipeline proj_pipe;