You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							63 lines
						
					
					
						
							1.6 KiB
						
					
					
				
			
		
		
	
	
							63 lines
						
					
					
						
							1.6 KiB
						
					
					
				#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;
 | 
						|
}
 | 
						|
 |