3 This file is part of libmspgl
4 Copyright © 2007 Mikko Rasa, Mikkosoft Productions
5 Distributed under the LGPL
9 #include "arb_shader_objects.h"
10 #include "arb_vertex_shader.h"
12 #include "extension.h"
27 Program::Program(const string &vert, const string &frag):
32 attach_shader(*new Shader(VERTEX_SHADER, vert));
33 attach_shader(*new Shader(FRAGMENT_SHADER, frag));
39 static RequireExtension _ext("GL_ARB_shader_objects");
42 id=glCreateProgramObjectARB();
49 for(list<Shader *>::iterator i=shaders.begin(); i!=shaders.end(); ++i)
52 glDeleteObjectARB(id);
55 void Program::attach_shader(Shader &shader)
57 if(find(shaders.begin(), shaders.end(), &shader)==shaders.end())
59 glAttachObjectARB(id, shader.get_id());
60 shaders.push_back(&shader);
64 void Program::detach_shader(Shader &shader)
66 list<Shader *>::iterator i=remove(shaders.begin(), shaders.end(), &shader);
69 shaders.erase(i, shaders.end());
70 glDetachObjectARB(id, shader.get_id());
74 void Program::set_del_shaders(bool ds)
79 void Program::bind_attribute(uint index, const string &name)
81 static RequireExtension _ext("GL_ARB_vertex_shader");
82 glBindAttribLocationARB(id, index, name.c_str());
87 for(list<Shader *>::iterator i=shaders.begin(); i!=shaders.end(); ++i)
88 if(!(*i)->get_compiled())
92 if(!(linked=get_param(GL_LINK_STATUS)))
93 throw CompileError(get_info_log());
96 int Program::get_param(GLenum param) const
99 glGetObjectParameterivARB(id, param, &value);
103 string Program::get_info_log() const
105 sizei len=get_param(GL_INFO_LOG_LENGTH);
107 glGetInfoLogARB(id, len+1, reinterpret_cast<GLsizei *>(&len), log);
108 return string(log, len);
114 throw InvalidState("Program is not linked");
116 glUseProgramObjectARB(id);
120 int Program::get_uniform_location(const string &n) const
122 return glGetUniformLocationARB(id, n.c_str());
125 void Program::unbind()
129 glUseProgramObjectARB(0);
134 void Program::maybe_bind()
140 Program *Program::cur_prog=0;
143 Program::Loader::Loader(Program &p):
146 prog.set_del_shaders(true);
148 add("vertex_shader", &Loader::vertex_shader);
149 add("fragment_shader", &Loader::fragment_shader);
150 add("attribute", &Loader::attribute);
153 void Program::Loader::vertex_shader(const string &src)
155 prog.attach_shader(*new Shader(VERTEX_SHADER, src));
158 void Program::Loader::fragment_shader(const string &src)
160 prog.attach_shader(*new Shader(FRAGMENT_SHADER, src));
163 void Program::Loader::attribute(uint i, const string &n)
165 prog.bind_attribute(i, n);
168 void Program::Loader::finish()