]> git.tdb.fi Git - libs/gl.git/blob - source/shader.cpp
Add basic support for geometry shaders
[libs/gl.git] / source / shader.cpp
1 #include <msp/gl/extensions/arb_fragment_shader.h>
2 #include <msp/gl/extensions/arb_shader_objects.h>
3 #include <msp/gl/extensions/arb_vertex_shader.h>
4 #include <msp/gl/extensions/ext_geometry_shader4.h>
5 #include "error.h"
6 #include "misc.h"
7 #include "shader.h"
8
9 using namespace std;
10
11 namespace Msp {
12 namespace GL {
13
14 Shader::Shader(GLenum t)
15 {
16         init(t);
17 }
18
19 Shader::Shader(GLenum t, const string &src)
20 {
21         init(t);
22
23         source(src);
24         compile();
25 }
26
27 void Shader::init(GLenum t)
28 {
29         compiled = false;
30
31         if(t==GL_FRAGMENT_SHADER)
32                 static Require _req(ARB_fragment_shader);
33         else if(t==GL_VERTEX_SHADER)
34                 static Require _req(ARB_vertex_shader);
35         else if(t==GL_GEOMETRY_SHADER)
36                 static Require _req(EXT_geometry_shader4);
37
38         id = glCreateShader(t);
39 }
40
41 Shader::~Shader()
42 {
43         glDeleteShader(id);
44 }
45
46 void Shader::source(unsigned count, const char **str, const int *len)
47 {
48         glShaderSource(id, count, str, len);
49 }
50
51 void Shader::source(const string &str)
52 {
53         source(str.data(), str.size());
54 }
55
56 void Shader::source(const char *str, int len)
57 {
58         source(1, &str, &len);
59 }
60
61 void Shader::compile()
62 {
63         glCompileShader(id);
64         compiled = get_shader_i(id, GL_COMPILE_STATUS);
65         if(!compiled)
66                 throw compile_error(get_info_log());
67 }
68
69 string Shader::get_info_log() const
70 {
71         GLsizei len = get_shader_i(id, GL_INFO_LOG_LENGTH);
72         char *buf = new char[len+1];
73         glGetShaderInfoLog(id, len+1, &len, buf);
74         string log(buf, len);
75         delete[] buf;
76         return log;
77 }
78
79
80 VertexShader::VertexShader():
81         Shader(GL_VERTEX_SHADER)
82 { }
83
84 VertexShader::VertexShader(const string &src):
85         Shader(GL_VERTEX_SHADER, src)
86 { }
87
88
89 FragmentShader::FragmentShader():
90         Shader(GL_FRAGMENT_SHADER)
91 { }
92
93 FragmentShader::FragmentShader(const string &src):
94         Shader(GL_FRAGMENT_SHADER, src)
95 { }
96
97
98 GeometryShader::GeometryShader():
99         Shader(GL_GEOMETRY_SHADER)
100 { }
101
102 GeometryShader::GeometryShader(const string &src):
103         Shader(GL_GEOMETRY_SHADER, src)
104 { }
105
106 } // namespace GL
107 } // namespace Msp