]> git.tdb.fi Git - libs/gl.git/blob - source/shader.cpp
Add support for detecting extensions
[libs/gl.git] / source / shader.cpp
1 /* $Id$
2
3 This file is part of libmspgl
4 Copyright © 2007 Mikko Rasa, Mikkosoft Productions
5 Distributed under the LGPL
6 */
7
8 #include "arb_shader_objects.h"
9 #include "extension.h"
10 #include "shader.h"
11
12 using namespace std;
13
14 namespace Msp {
15 namespace GL {
16
17 Shader::Shader(ShaderType t):
18         compiled(false)
19 {
20         if(t==FRAGMENT_SHADER)
21                 require_extension("GL_ARB_fragment_program");
22         else if(t==VERTEX_SHADER)
23                 require_extension("GL_ARB_vertex_program");
24
25         id=glCreateShaderObjectARB(t);
26 }
27
28 Shader::Shader(ShaderType t, const string &src):
29         compiled(false)
30 {
31         if(t==FRAGMENT_SHADER)
32                 require_extension("GL_ARB_fragment_program");
33         else if(t==VERTEX_SHADER)
34                 require_extension("GL_ARB_vertex_program");
35
36         id=glCreateShaderObjectARB(t);
37
38         source(src);
39         compile();
40 }
41
42 Shader::~Shader()
43 {
44         glDeleteObjectARB(id);
45 }
46
47 void Shader::source(sizei count, const char **str, const int *len)
48 {
49         glShaderSourceARB(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 bool Shader::compile()
63 {
64         glCompileShaderARB(id);
65         compiled=get_param(GL_COMPILE_STATUS);
66         return compiled;
67 }
68
69 int Shader::get_param(GLenum param) const
70 {
71         int value;
72         glGetObjectParameterivARB(id, param, &value);
73         return value;
74 }
75
76 string Shader::get_info_log() const
77 {
78         sizei len=get_param(GL_INFO_LOG_LENGTH);
79         char log[len+1];
80         glGetInfoLogARB(id, len+1, reinterpret_cast<GLsizei *>(&len), log);
81         return string(log, len);
82 }
83
84 } // namespace GL
85 } // namespace Msp