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 |
#pragma once |
||||||
#define COMMON_GLUTIL_H |
|
||||||
|
|
||||||
#ifdef __APPLE__ |
#ifdef __APPLE__ |
||||||
#include <OpenGL/gl3.h> |
#include <OpenGL/gl3.h> |
||||||
#else |
#else |
||||||
#include <GLES3/gl3.h> |
#include <GLES3/gl3.h> |
||||||
#endif |
#endif |
||||||
|
#include <map> |
||||||
|
|
||||||
#ifdef __cplusplus |
class GLShader { |
||||||
extern "C" { |
public: |
||||||
#endif |
GLShader(const char *vert_src, const char *frag_src); |
||||||
|
~GLShader(); |
||||||
GLuint load_shader(GLenum shaderType, const char *src); |
GLuint getUniformLocation(const char * name); |
||||||
GLuint load_program(const char *vert_src, const char *frag_src); |
GLuint prog = 0; |
||||||
|
|
||||||
#ifdef __cplusplus |
private: |
||||||
} |
GLuint vert = 0, frag = 0; |
||||||
#endif |
std::map<const char*, GLint> uniform_loc_map; |
||||||
|
}; |
||||||
#endif |
|
||||||
|
Loading…
Reference in new issue