From 361b98c625f76d34ed1db99ee6c47a964ba92135 Mon Sep 17 00:00:00 2001 From: Anthony Pesch Date: Thu, 29 Dec 2016 11:11:39 -0800 Subject: [PATCH] dont rely on explicit uniform layout extension use ifdef instead of if for shader attributes --- src/video/gl_backend.c | 51 +++++++++++++++++++++++++++--------------- src/video/ta.glsl | 20 ++++++++--------- src/video/ui.glsl | 4 ++-- 3 files changed, 45 insertions(+), 30 deletions(-) diff --git a/src/video/gl_backend.c b/src/video/gl_backend.c index de033124..68ca26f9 100644 --- a/src/video/gl_backend.c +++ b/src/video/gl_backend.c @@ -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) { diff --git a/src/video/ta.glsl b/src/video/ta.glsl index b0b236f3..dcf44791 100644 --- a/src/video/ta.glsl +++ b/src/video/ta.glsl @@ -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" "}"; diff --git a/src/video/ui.glsl b/src/video/ui.glsl index 39679a5d..b8f6a10c 100644 --- a/src/video/ui.glsl +++ b/src/video/ui.glsl @@ -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"