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.
		
		
		
		
		
			
		
			
				
					
					
						
							64 lines
						
					
					
						
							1.6 KiB
						
					
					
				
			
		
		
	
	
							64 lines
						
					
					
						
							1.6 KiB
						
					
					
				| #include "selfdrive/common/glutil.h"
 | |
| 
 | |
| #include <assert.h>
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| 
 | |
| #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;
 | |
| }
 | |
| 
 |