graphics

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 6b99e01da03e067f580092dc0ff75a00df35a6bb
parent 8a5dbfdb6a8f70910e78a2f57984379010ff58be
Author: Brian Swetland <swetland@frotz.net>
Date:   Mon, 17 Jun 2013 01:10:01 -0700

geometry shader glue

Diffstat:
Mcommon/app.h | 15++++++++++++---
Mcommon/glapp.cc | 27+++++++++++++++++++++++++--
2 files changed, 37 insertions(+), 5 deletions(-)

diff --git a/common/app.h b/common/app.h @@ -58,6 +58,13 @@ struct VertexAttrDesc { unsigned unused; }; +struct VertexShader { + unsigned id; + VertexShader() : id(0) {}; + ~VertexShader() { if (id) { glDeleteShader(id); } }; + int load(const char *fn); +}; + struct PixelShader { unsigned id; PixelShader() : id(0) {}; @@ -65,10 +72,10 @@ struct PixelShader { int load(const char *fn); }; -struct VertexShader { +struct GeometryShader { unsigned id; - VertexShader() : id(0) {}; - ~VertexShader() { if (id) { glDeleteShader(id); } }; + GeometryShader() : id(0) {}; + ~GeometryShader() { if (id) glDeleteShader(id); }; int load(const char *fn); }; @@ -78,7 +85,9 @@ struct Program { ~Program() { if (id) { glDeleteProgram(id); } }; void use(void) { glUseProgram(id); } int link(VertexShader *vs, PixelShader *ps); + int link(VertexShader *vs, GeometryShader *gs, PixelShader *ps); int load(const char *vsfn, const char *psfn); + int load(const char *vsfn, const char *gsfn, const char *psfn); }; struct Texture2D { diff --git a/common/glapp.cc b/common/glapp.cc @@ -299,10 +299,16 @@ static void dump_link_error(unsigned id) { } int Program::link(VertexShader *vs, PixelShader *ps) { + return link(vs, NULL, ps); +} + +int Program::link(VertexShader *vs, GeometryShader *gs, PixelShader *ps) { unsigned n; int r; n = glCreateProgram(); glAttachShader(n, vs->id); + if (gs) + glAttachShader(n, gs->id); glAttachShader(n, ps->id); glLinkProgram(n); glGetProgramiv(n, GL_LINK_STATUS, &r); @@ -317,6 +323,19 @@ int Program::link(VertexShader *vs, PixelShader *ps) { return 0; } +int Program::load(const char *vsfn, const char *gsfn, const char *psfn) { + VertexShader vs; + GeometryShader gs; + PixelShader ps; + if (vs.load(vsfn)) + return -1; + if (gs.load(gsfn)) + return -1; + if (ps.load(psfn)) + return -1; + return link(&vs, &ps); +} + int Program::load(const char *vsfn, const char *psfn) { VertexShader vs; PixelShader ps; @@ -349,12 +368,16 @@ static int _load_shader(unsigned *out, const char *fn, unsigned type) { return 0; } +int VertexShader::load(const char *fn) { + return _load_shader(&id, fn, GL_VERTEX_SHADER); +} + int PixelShader::load(const char *fn) { return _load_shader(&id, fn, GL_FRAGMENT_SHADER); } -int VertexShader::load(const char *fn) { - return _load_shader(&id, fn, GL_VERTEX_SHADER); +int GeometryShader::load(const char *fn) { + return _load_shader(&id, fn, GL_GEOMETRY_SHADER); } int Texture2D::load(const char *fn, int genmips) {