commit 6b99e01da03e067f580092dc0ff75a00df35a6bb
parent 8a5dbfdb6a8f70910e78a2f57984379010ff58be
Author: Brian Swetland <swetland@frotz.net>
Date: Mon, 17 Jun 2013 01:10:01 -0700
geometry shader glue
Diffstat:
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) {