]> git.tdb.fi Git - libs/gl.git/blob - source/shader.cpp
Rework exceptions
[libs/gl.git] / source / shader.cpp
1 #include "arb_shader_objects.h"
2 #include "error.h"
3 #include "extension.h"
4 #include "shader.h"
5
6 using namespace std;
7
8 namespace Msp {
9 namespace GL {
10
11 Shader::Shader(ShaderType t)
12 {
13         init(t);
14 }
15
16 Shader::Shader(ShaderType t, const string &src)
17 {
18         init(t);
19
20         source(src);
21         compile();
22 }
23
24 void Shader::init(ShaderType t)
25 {
26         compiled = false;
27
28         if(t==FRAGMENT_SHADER)
29                 static RequireExtension _ext("GL_ARB_fragment_shader");
30         else if(t==VERTEX_SHADER)
31                 static RequireExtension _ext("GL_ARB_vertex_shader");
32
33         id = glCreateShaderObjectARB(t);
34 }
35
36 Shader::~Shader()
37 {
38         glDeleteObjectARB(id);
39 }
40
41 void Shader::source(unsigned count, const char **str, const int *len)
42 {
43         glShaderSourceARB(id, count, str, len);
44 }
45
46 void Shader::source(const string &str)
47 {
48         source(str.data(), str.size());
49 }
50
51 void Shader::source(const char *str, int len)
52 {
53         source(1, &str, &len);
54 }
55
56 void Shader::compile()
57 {
58         glCompileShaderARB(id);
59         int value = 0;
60         glGetObjectParameterivARB(id, GL_OBJECT_COMPILE_STATUS_ARB, &value);
61         if(!(compiled = value))
62                 throw compile_error(get_info_log());
63 }
64
65 string Shader::get_info_log() const
66 {
67         GLsizei len = 0;
68         glGetObjectParameterivARB(id, GL_OBJECT_INFO_LOG_LENGTH_ARB, &len);
69         char log[len+1];
70         glGetInfoLogARB(id, len+1, &len, log);
71         return string(log, len);
72 }
73
74 } // namespace GL
75 } // namespace Msp