openpilot0/selfdrive/common/glutil.cc

64 lines
1.6 KiB
C++

#include "selfdrive/common/glutil.h"
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <string>
static GLuint load_shader(GLenum shaderType, const char *src) {
GLint status = 0, len = 0;
GLuint shader = glCreateShader(shaderType);
assert(shader != 0);
glShaderSource(shader, 1, &src, NULL);
glCompileShader(shader);
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
if (!status) {
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);
if (len) {
std::string msg(len, '\0');
glGetShaderInfoLog(shader, len, NULL, msg.data());
fprintf(stderr, "error compiling shader:\n%s\n", msg.c_str());
}
assert(0);
}
return shader;
}
GLShader::GLShader(const char *vert_src, const char *frag_src) {
GLint status = 0, len = 0;
prog = glCreateProgram();
assert(prog != 0);
vert = load_shader(GL_VERTEX_SHADER, vert_src);
frag = load_shader(GL_FRAGMENT_SHADER, frag_src);
glAttachShader(prog, vert);
glAttachShader(prog, frag);
glLinkProgram(prog);
glGetProgramiv(prog, GL_LINK_STATUS, &status);
if (!status) {
glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &len);
if (len) {
std::string msg(len, '\0');
glGetProgramInfoLog(prog, len, NULL, msg.data());
fprintf(stderr, "error linking program:\n%s\n", msg.c_str());
}
assert(0);
}
}
GLShader::~GLShader() {
glDeleteProgram(prog);
glDeleteShader(frag);
glDeleteShader(vert);
}
GLuint GLShader::getUniformLocation(const char *name) {
auto it = uniform_loc_map.find(name);
if (it == uniform_loc_map.end()) {
it = uniform_loc_map.insert(it, {name, glGetUniformLocation(prog, name)});
}
return it->second;
}