12 void gl_error(std::string msg) {
13 const GLubyte *errBegin = gluErrorString(glGetError());
14 if (errBegin && *errBegin != '\0') {
15 const GLubyte *errEnd = errBegin;
16 while (*errEnd != '\0') {
20 msg.append(errBegin, errEnd);
22 throw std::runtime_error(msg);
29 Shader::Shader(GLenum type)
30 : handle(glCreateShader(type)) {
32 gl_error("glCreateShader");
38 glDeleteShader(handle);
42 Shader::Shader(Shader &&other)
43 : handle(other.handle) {
47 Shader &Shader::operator =(Shader &&other) {
48 std::swap(handle, other.handle);
53 void Shader::Source(const GLchar *src) {
54 const GLchar* src_arr[] = { src };
55 glShaderSource(handle, 1, src_arr, nullptr);
58 void Shader::Compile() {
59 glCompileShader(handle);
62 bool Shader::Compiled() const {
63 GLint compiled = GL_FALSE;
64 glGetShaderiv(handle, GL_COMPILE_STATUS, &compiled);
65 return compiled == GL_TRUE;
68 void Shader::Log(std::ostream &out) const {
69 int log_len = 0, max_len = 0;
70 glGetShaderiv(handle, GL_INFO_LOG_LENGTH, &max_len);
71 std::unique_ptr<char[]> log(new char[max_len]);
72 glGetShaderInfoLog(handle, max_len, &log_len, log.get());
73 out.write(log.get(), log_len);
77 void Shader::AttachToProgram(GLuint id) const {
78 glAttachShader(id, handle);
83 : handle(glCreateProgram()) {
85 gl_error("glCreateProgram");
91 glDeleteProgram(handle);
96 void Program::Attach(Shader &shader) {
97 shader.AttachToProgram(handle);
100 void Program::Link() {
101 glLinkProgram(handle);
104 bool Program::Linked() const {
105 GLint linked = GL_FALSE;
106 glGetProgramiv(handle, GL_LINK_STATUS, &linked);
107 return linked == GL_TRUE;
110 void Program::Log(std::ostream &out) const {
111 int log_len = 0, max_len = 0;
112 glGetProgramiv(handle, GL_INFO_LOG_LENGTH, &max_len);
113 std::unique_ptr<char[]> log(new char[max_len]);
114 glGetProgramInfoLog(handle, max_len, &log_len, log.get());
115 out.write(log.get(), log_len);
119 GLint Program::UniformLocation(const GLchar *name) const {
120 return glGetUniformLocation(handle, name);