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