convert glutil.c to gltuil.cc & add class GLShader (#19720)
* c++ glutil
* function getUniformLocation
* rebase master
old-commit-hash: cef469cbed
commatwo_master
parent
467aee786d
commit
74dc639515
7 changed files with 90 additions and 107 deletions
@ -1,69 +0,0 @@ |
||||
#include <stdlib.h> |
||||
#include <stdio.h> |
||||
|
||||
#include "glutil.h" |
||||
|
||||
GLuint load_shader(GLenum shaderType, const char *src) { |
||||
GLint status = 0, len = 0; |
||||
GLuint shader; |
||||
|
||||
if (!(shader = glCreateShader(shaderType))) |
||||
return 0; |
||||
|
||||
glShaderSource(shader, 1, &src, NULL); |
||||
glCompileShader(shader); |
||||
glGetShaderiv(shader, GL_COMPILE_STATUS, &status); |
||||
|
||||
if (status) |
||||
return shader; |
||||
|
||||
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len); |
||||
if (len) { |
||||
char *msg = (char*)malloc(len); |
||||
if (msg) { |
||||
glGetShaderInfoLog(shader, len, NULL, msg); |
||||
msg[len-1] = 0; |
||||
fprintf(stderr, "error compiling shader:\n%s\n", msg); |
||||
free(msg); |
||||
} |
||||
} |
||||
glDeleteShader(shader); |
||||
return 0; |
||||
} |
||||
|
||||
GLuint load_program(const char *vert_src, const char *frag_src) { |
||||
GLuint vert, frag, prog; |
||||
GLint status = 0, len = 0; |
||||
|
||||
if (!(vert = load_shader(GL_VERTEX_SHADER, vert_src))) |
||||
return 0; |
||||
if (!(frag = load_shader(GL_FRAGMENT_SHADER, frag_src))) |
||||
goto fail_frag; |
||||
if (!(prog = glCreateProgram())) |
||||
goto fail_prog; |
||||
|
||||
glAttachShader(prog, vert); |
||||
glAttachShader(prog, frag); |
||||
glLinkProgram(prog); |
||||
|
||||
glGetProgramiv(prog, GL_LINK_STATUS, &status); |
||||
if (status) |
||||
return prog; |
||||
|
||||
glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &len); |
||||
if (len) { |
||||
char *buf = (char*) malloc(len); |
||||
if (buf) { |
||||
glGetProgramInfoLog(prog, len, NULL, buf); |
||||
buf[len-1] = 0; |
||||
fprintf(stderr, "error linking program:\n%s\n", buf); |
||||
free(buf); |
||||
} |
||||
} |
||||
glDeleteProgram(prog); |
||||
fail_prog: |
||||
glDeleteShader(frag); |
||||
fail_frag: |
||||
glDeleteShader(vert); |
||||
return 0; |
||||
} |
@ -0,0 +1,63 @@ |
||||
#include <stdlib.h> |
||||
#include <stdio.h> |
||||
#include <assert.h> |
||||
#include <string> |
||||
|
||||
#include "glutil.h" |
||||
|
||||
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; |
||||
} |
@ -1,21 +1,20 @@ |
||||
#ifndef COMMON_GLUTIL_H |
||||
#define COMMON_GLUTIL_H |
||||
#pragma once |
||||
|
||||
#ifdef __APPLE__ |
||||
#include <OpenGL/gl3.h> |
||||
#else |
||||
#include <GLES3/gl3.h> |
||||
#endif |
||||
#include <map> |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
GLuint load_shader(GLenum shaderType, const char *src); |
||||
GLuint load_program(const char *vert_src, const char *frag_src); |
||||
class GLShader { |
||||
public: |
||||
GLShader(const char *vert_src, const char *frag_src); |
||||
~GLShader(); |
||||
GLuint getUniformLocation(const char * name); |
||||
GLuint prog = 0; |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif |
||||
private: |
||||
GLuint vert = 0, frag = 0; |
||||
std::map<const char*, GLint> uniform_loc_map; |
||||
}; |
||||
|
Loading…
Reference in new issue