dont rely on explicit uniform layout extension

use ifdef instead of if for shader attributes
This commit is contained in:
Anthony Pesch 2016-12-29 11:11:39 -08:00
parent 01e1b3eebc
commit 361b98c625
3 changed files with 45 additions and 30 deletions

View File

@ -17,6 +17,11 @@ enum texture_map {
enum uniform_attr {
UNIFORM_MVP = 0,
UNIFORM_DIFFUSE = 1,
UNIFORM_NUM_UNIFORMS = 2,
};
static const char *uniform_names[] = {
"u_mvp", "u_diffuse",
};
enum shader_attr {
@ -38,6 +43,7 @@ struct shader_program {
GLuint program;
GLuint vertex_shader;
GLuint fragment_shader;
GLint uniforms[UNIFORM_NUM_UNIFORMS];
uint64_t uniform_token;
};
@ -232,6 +238,10 @@ void rb_bind_texture(struct render_backend *rb, enum texture_map map,
glBindTexture(GL_TEXTURE_2D, tex);
}
static GLint rb_get_uniform(struct render_backend *rb, enum uniform_attr attr) {
return rb->current_program->uniforms[attr];
}
static void rb_print_shader_log(GLuint shader) {
int max_length, length;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &max_length);
@ -275,7 +285,8 @@ static void rb_destroy_program(struct shader_program *program) {
glDeleteProgram(program->program);
}
static int rb_compile_program(struct shader_program *program,
static int rb_compile_program(struct render_backend *rb,
struct shader_program *program,
const char *header, const char *vertex_source,
const char *fragment_source) {
char buffer[16384] = {0};
@ -286,7 +297,6 @@ static int rb_compile_program(struct shader_program *program,
if (vertex_source) {
snprintf(buffer, sizeof(buffer) - 1,
"#version 330\n"
"#extension GL_ARB_explicit_uniform_location : require\n"
"%s%s",
header ? header : "", vertex_source);
buffer[sizeof(buffer) - 1] = 0;
@ -302,7 +312,6 @@ static int rb_compile_program(struct shader_program *program,
if (fragment_source) {
snprintf(buffer, sizeof(buffer) - 1,
"#version 330\n"
"#extension GL_ARB_explicit_uniform_location : require\n"
"%s%s",
header ? header : "", fragment_source);
buffer[sizeof(buffer) - 1] = 0;
@ -326,10 +335,15 @@ static int rb_compile_program(struct shader_program *program,
return 0;
}
for (int i = 0; i < UNIFORM_NUM_UNIFORMS; i++) {
program->uniforms[i] =
glGetUniformLocation(program->program, uniform_names[i]);
}
/* bind diffuse sampler once after compile, this currently never changes */
glUseProgram(program->program);
glUniform1i(UNIFORM_DIFFUSE, MAP_DIFFUSE);
glUseProgram(0);
rb_bind_program(rb, program);
glUniform1i(rb_get_uniform(rb, UNIFORM_DIFFUSE), MAP_DIFFUSE);
rb_bind_program(rb, NULL);
return 1;
}
@ -418,43 +432,43 @@ static void rb_create_shaders(struct render_backend *rb) {
header[0] = 0;
if ((i & ATTR_SHADE_MASK) == ATTR_SHADE_DECAL) {
strcat(header, "#define SHADE_DECAL 1\n");
strcat(header, "#define SHADE_DECAL\n");
}
if ((i & ATTR_SHADE_MASK) == ATTR_SHADE_MODULATE) {
strcat(header, "#define SHADE_MODULATE 1\n");
strcat(header, "#define SHADE_MODULATE\n");
}
if ((i & ATTR_SHADE_MASK) == ATTR_SHADE_DECAL_ALPHA) {
strcat(header, "#define SHADE_DECAL_ALPHA 1\n");
strcat(header, "#define SHADE_DECAL_ALPHA\n");
}
if ((i & ATTR_SHADE_MASK) == ATTR_SHADE_MODULATE_ALPHA) {
strcat(header, "#define SHADE_MODULATE_ALPHA 1\n");
strcat(header, "#define SHADE_MODULATE_ALPHA\n");
}
if (i & ATTR_TEXTURE) {
strcat(header, "#define TEXTURE 1\n");
strcat(header, "#define TEXTURE\n");
}
if (i & ATTR_IGNORE_ALPHA) {
strcat(header, "#define IGNORE_ALPHA 1\n");
strcat(header, "#define IGNORE_ALPHA\n");
}
if (i & ATTR_IGNORE_TEXTURE_ALPHA) {
strcat(header, "#define USE_IGNORE_TEXTURE_ALPHA 1\n");
strcat(header, "#define IGNORE_TEXTURE_ALPHA\n");
}
if (i & ATTR_OFFSET_COLOR) {
strcat(header, "#define OFFSET_COLOR 1\n");
strcat(header, "#define OFFSET_COLOR\n");
}
if (!rb_compile_program(program, header, ta_vp, ta_fp)) {
if (!rb_compile_program(rb, program, header, ta_vp, ta_fp)) {
LOG_FATAL("Failed to compile ta shader.");
}
}
if (!rb_compile_program(&rb->ui_program, NULL, ui_vp, ui_fp)) {
if (!rb_compile_program(rb, &rb->ui_program, NULL, ui_vp, ui_fp)) {
LOG_FATAL("Failed to compile ui shader.");
}
}
@ -596,7 +610,8 @@ void rb_draw_surface(struct render_backend *rb, const struct surface *surf) {
/* if uniforms have yet to be bound for this program, do so now */
if (program->uniform_token != rb->uniform_token) {
glUniformMatrix4fv(UNIFORM_MVP, 1, GL_FALSE, rb->uniform_mvp);
glUniformMatrix4fv(rb_get_uniform(rb, UNIFORM_MVP), 1, GL_FALSE,
rb->uniform_mvp);
program->uniform_token = rb->uniform_token;
}
@ -702,7 +717,7 @@ void rb_begin_ortho(struct render_backend *rb) {
rb_bind_vao(rb, rb->ui_vao);
rb_bind_program(rb, &rb->ui_program);
glUniformMatrix4fv(UNIFORM_MVP, 1, GL_FALSE, ortho);
glUniformMatrix4fv(rb_get_uniform(rb, UNIFORM_MVP), 1, GL_FALSE, ortho);
}
void rb_end_frame(struct render_backend *rb) {

View File

@ -1,5 +1,5 @@
static const char *ta_vp =
"layout(location = 0) uniform mat4 u_mvp;\n"
"uniform mat4 u_mvp;\n"
"layout(location = 0) in vec3 attr_xyz;\n"
"layout(location = 1) in vec2 attr_texcoord;\n"
@ -26,7 +26,7 @@ static const char *ta_vp =
"}";
static const char *ta_fp =
"layout(location = 1) uniform sampler2D u_diffuse;\n"
"uniform sampler2D u_diffuse;\n"
"in vec4 var_color;\n"
"in vec4 var_offset_color;\n"
@ -36,32 +36,32 @@ static const char *ta_fp =
"void main() {\n"
" vec4 col = var_color;\n"
" #if IGNORE_ALPHA\n"
" #ifdef IGNORE_ALPHA\n"
" col.a = 1.0;\n"
" #endif\n"
" #if TEXTURE\n"
" #ifdef TEXTURE\n"
" vec4 tex = texture(u_diffuse, var_texcoord);\n"
" #if IGNORE_TEXTURE_ALPHA\n"
" #ifdef IGNORE_TEXTURE_ALPHA\n"
" tex.a = 1.0;\n"
" #endif\n"
" #if SHADE_DECAL\n"
" #ifdef SHADE_DECAL\n"
" fragcolor = tex;\n"
" #endif\n"
" #if SHADE_MODULATE\n"
" #ifdef SHADE_MODULATE\n"
" fragcolor.rgb = tex.rgb * col.rgb;\n"
" fragcolor.a = tex.a;\n"
" #endif\n"
" #if SHADE_DECAL_ALPHA\n"
" #ifdef SHADE_DECAL_ALPHA\n"
" fragcolor.rgb = tex.rgb * tex.a + col.rgb * (1 - tex.a);\n"
" fragcolor.a = col.a;\n"
" #endif\n"
" #if SHADE_MODULATE_ALPHA\n"
" #ifdef SHADE_MODULATE_ALPHA\n"
" fragcolor = tex * col;\n"
" #endif\n"
" #else\n"
" fragcolor = col;\n"
" #endif\n"
" #if OFFSET_COLOR\n"
" #ifdef OFFSET_COLOR\n"
" fragcolor.rgb += var_offset_color.rgb;\n"
" #endif\n"
"}";

View File

@ -1,5 +1,5 @@
static const char *ui_vp =
"layout(location = 0) uniform mat4 u_mvp;\n"
"uniform mat4 u_mvp;\n"
"layout(location = 0) in vec2 attr_xy;\n"
"layout(location = 1) in vec2 attr_texcoord;\n"
@ -15,7 +15,7 @@ static const char *ui_vp =
"}";
static const char *ui_fp =
"layout(location = 1) uniform sampler2D u_diffuse;\n"
"uniform sampler2D u_diffuse;\n"
"in vec4 var_color;\n"
"in vec2 var_texcoord;\n"