]> git.tdb.fi Git - libs/gl.git/blob - source/shader.cpp
Fix the keyword of the uniform scaling statement in Transform loader
[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         compiled = false;
31
32         if(t==GL_FRAGMENT_SHADER)
33                 static Require _req(ARB_fragment_shader);
34         else if(t==GL_VERTEX_SHADER)
35                 static Require _req(ARB_vertex_shader);
36         else if(t==GL_GEOMETRY_SHADER)
37                 static Require _req(ARB_geometry_shader4);
38
39         id = glCreateShader(t);
40 }
41
42 Shader::~Shader()
43 {
44         glDeleteShader(id);
45 }
46
47 void Shader::source(unsigned count, const char **str, const int *len)
48 {
49         glShaderSource(id, count, str, len);
50 }
51
52 void Shader::source(const string &str)
53 {
54         source(str.data(), str.size());
55 }
56
57 void Shader::source(const char *str, int len)
58 {
59         source(1, &str, &len);
60 }
61
62 void Shader::compile()
63 {
64         glCompileShader(id);
65         compiled = get_shader_i(id, GL_COMPILE_STATUS);
66         if(!compiled)
67                 throw compile_error(get_info_log());
68
69 #ifdef DEBUG
70         string info_log = get_info_log();
71         if(!info_log.empty())
72                 IO::print("Shader compile info log:\n%s", info_log);
73 #endif
74 }
75
76 string Shader::get_info_log() const
77 {
78         GLsizei len = get_shader_i(id, GL_INFO_LOG_LENGTH);
79         char *buf = new char[len+1];
80         glGetShaderInfoLog(id, len+1, &len, buf);
81         string log(buf, len);
82         delete[] buf;
83         return log;
84 }
85
86
87 VertexShader::VertexShader():
88         Shader(GL_VERTEX_SHADER)
89 { }
90
91 VertexShader::VertexShader(const string &src):
92         Shader(GL_VERTEX_SHADER, src)
93 { }
94
95
96 FragmentShader::FragmentShader():
97         Shader(GL_FRAGMENT_SHADER)
98 { }
99
100 FragmentShader::FragmentShader(const string &src):
101         Shader(GL_FRAGMENT_SHADER, src)
102 { }
103
104
105 GeometryShader::GeometryShader():
106         Shader(GL_GEOMETRY_SHADER)
107 { }
108
109 GeometryShader::GeometryShader(const string &src):
110         Shader(GL_GEOMETRY_SHADER, src)
111 { }
112
113 } // namespace GL
114 } // namespace Msp