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