]> git.localhorst.tv Git - blank.git/blob - src/shader.cpp
initial testing
[blank.git] / src / shader.cpp
1 #include "shader.hpp"
2
3 #include <algorithm>
4 #include <memory>
5 #include <ostream>
6 #include <stdexcept>
7 #include <string>
8
9
10 namespace {
11
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') {
17                         ++errEnd;
18                 }
19                 msg += ": ";
20                 msg.append(errBegin, errEnd);
21         }
22         throw std::runtime_error(msg);
23 }
24
25 }
26
27 namespace blank {
28
29 Shader::Shader(GLenum type)
30 : handle(glCreateShader(type)) {
31         if (handle == 0) {
32                 gl_error("glCreateShader");
33         }
34 }
35
36 Shader::~Shader() {
37         if (handle != 0) {
38                 glDeleteShader(handle);
39         }
40 }
41
42 Shader::Shader(Shader &&other)
43 : handle(other.handle) {
44         other.handle = 0;
45 }
46
47 Shader &Shader::operator =(Shader &&other) {
48         std::swap(handle, other.handle);
49         return *this;
50 }
51
52
53 void Shader::Source(const GLchar *src) {
54         const GLchar* src_arr[] = { src };
55         glShaderSource(handle, 1, src_arr, nullptr);
56 }
57
58 void Shader::Compile() {
59         glCompileShader(handle);
60 }
61
62 bool Shader::Compiled() const {
63         GLint compiled = GL_FALSE;
64         glGetShaderiv(handle, GL_COMPILE_STATUS, &compiled);
65         return compiled == GL_TRUE;
66 }
67
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);
74 }
75
76
77 void Shader::AttachToProgram(GLuint id) const {
78         glAttachShader(id, handle);
79 }
80
81
82 Program::Program()
83 : handle(glCreateProgram()) {
84         if (handle == 0) {
85                 gl_error("glCreateProgram");
86         }
87 }
88
89 Program::~Program() {
90         if (handle != 0) {
91                 glDeleteProgram(handle);
92         }
93 }
94
95
96 void Program::Attach(Shader &shader) {
97         shader.AttachToProgram(handle);
98 }
99
100 void Program::Link() {
101         glLinkProgram(handle);
102 }
103
104 bool Program::Linked() const {
105         GLint linked = GL_FALSE;
106         glGetProgramiv(handle, GL_LINK_STATUS, &linked);
107         return linked == GL_TRUE;
108 }
109
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);
116 }
117
118
119 GLint Program::UniformLocation(const GLchar *name) const {
120         return glGetUniformLocation(handle, name);
121 }
122
123 }