tweak raii shader constructors

This commit is contained in:
2020-03-09 00:16:30 -04:00
parent 0c4a6f5eff
commit e56896db9b
2 changed files with 31 additions and 37 deletions

View File

@@ -58,6 +58,13 @@ namespace cgl {
id = glCreateShader(mode); 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 &) = delete;
shader(shader &&o) noexcept { shader(shader &&o) noexcept {
@@ -160,6 +167,17 @@ namespace cgl {
glProgramParameteri(id, GL_PROGRAM_SEPARABLE, GL_TRUE); 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)) { shaderprogram(shaderprogram &&o) noexcept : program(std::move(o)) {
mode = o.mode; mode = o.mode;
} }
@@ -211,6 +229,8 @@ namespace cgl {
case GL_FRAGMENT_SHADER: case GL_FRAGMENT_SHADER:
bits = GL_FRAGMENT_SHADER_BIT; bits = GL_FRAGMENT_SHADER_BIT;
break; break;
default:
throw std::domain_error("invalid shaderprogram mode");
} }
glUseProgramStages(id, bits, pgm); glUseProgramStages(id, bits, pgm);
@@ -230,37 +250,11 @@ namespace cgl {
} }
}; };
shader compile_shader(GLenum mode, const std::string &src) { shader compile_shader(GLenum mode, const std::string &file) {
shader res(mode); return shader(mode, utilReadFile(file));
res.set_source(src);
if (!res.compile())
throw shader_error(res.get_info_log());
return res;
} }
shader compile_shader_file(GLenum mode, const std::string &file) { shaderprogram compile_shaderprogram(GLenum mode, const std::string &file) {
return compile_shader(mode, utilReadFile(file)); return shaderprogram(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));
} }
} }

View File

@@ -81,21 +81,21 @@ void run(GLFWwindow *window) {
// glEnable(GL_CULL_FACE); // glEnable(GL_CULL_FACE);
glCullFace(GL_BACK); glCullFace(GL_BACK);
auto defer = cgl::compile_shaderprogram_file( auto defer = cgl::compile_shaderprogram(
GL_VERTEX_SHADER, "shaders/slice/deferred.vs.glsl"); 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"); 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"); 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"); 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"); 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"); 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"); GL_FRAGMENT_SHADER, "shaders/solid.fs.glsl");
cgl::pipeline proj_pipe; cgl::pipeline proj_pipe;