]> git.tdb.fi Git - libs/gl.git/blob - source/core/shader.cpp
Rearrange soucre files into subdirectories
[libs/gl.git] / source / core / 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         string log(len+1, 0);
81         glGetShaderInfoLog(id, len+1, &len, &log[0]);
82         log.erase(len);
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