diff options
author | Timothy Arceri <[email protected]> | 2017-04-21 17:04:10 +1000 |
---|---|---|
committer | Emil Velikov <[email protected]> | 2017-04-24 13:13:38 +0100 |
commit | f61c453cfc34c78fecf26e1f92825fda4f5ff46f (patch) | |
tree | c004e963ae291e26a9e3135bb4d5380aec8212cd /src | |
parent | 612fc14aab46e85452915d6e77fffee7bb94cfe5 (diff) |
mesa: validate sampler type across the whole program
Currently we were only making sure types were the same within a
single stage. This looks to have regressed with 953a0af8e3f73.
Fixes: 953a0af8e3f73 ("mesa: validate sampler uniforms during gluniform calls")
Reviewed-by: Nicolai Hähnle <[email protected]>
Reviewed-by: Tapani Pälli <[email protected]>
https://bugs.freedesktop.org/show_bug.cgi?id=97524
(cherry picked from commit d682f8aa8e0edd166166f87fcd774dd2d57b4180)
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/main/uniform_query.cpp | 2 | ||||
-rw-r--r-- | src/mesa/main/uniforms.c | 26 | ||||
-rw-r--r-- | src/mesa/program/ir_to_mesa.cpp | 5 |
3 files changed, 28 insertions, 5 deletions
diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp index e613898713b..85bb7a40b63 100644 --- a/src/mesa/main/uniform_query.cpp +++ b/src/mesa/main/uniform_query.cpp @@ -945,6 +945,8 @@ _mesa_uniform(GLint location, GLsizei count, const GLvoid *values, */ if (uni->type->is_sampler()) { bool flushed = false; + shProg->SamplersValidated = GL_TRUE; + for (int i = 0; i < MESA_SHADER_STAGES; i++) { struct gl_linked_shader *const sh = shProg->_LinkedShaders[i]; diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c index 59ae4c5dce2..8869b6eb22d 100644 --- a/src/mesa/main/uniforms.c +++ b/src/mesa/main/uniforms.c @@ -67,11 +67,15 @@ void _mesa_update_shader_textures_used(struct gl_shader_program *shProg, struct gl_program *prog) { - memset(prog->TexturesUsed, 0, sizeof(prog->TexturesUsed)); + GLbitfield mask = prog->SamplersUsed; + gl_shader_stage prog_stage = + _mesa_program_enum_to_shader_stage(prog->Target); + struct gl_linked_shader *shader = shProg->_LinkedShaders[prog_stage]; - shProg->SamplersValidated = GL_TRUE; + assert(shader); + + memset(prog->TexturesUsed, 0, sizeof(prog->TexturesUsed)); - GLbitfield mask = prog->SamplersUsed; while (mask) { const int s = u_bit_scan(&mask); GLuint unit = prog->SamplerUnits[s]; @@ -87,8 +91,20 @@ _mesa_update_shader_textures_used(struct gl_shader_program *shProg, * types pointing to the same texture image unit within a program * object." */ - if (prog->TexturesUsed[unit] & ~(1 << tgt)) - shProg->SamplersValidated = GL_FALSE; + unsigned stages_mask = shProg->data->linked_stages; + while (stages_mask) { + const int stage = u_bit_scan(&stages_mask); + + /* Skip validation if we are yet to update textures used in this + * stage. + */ + if (prog_stage < stage) + break; + + struct gl_program *glprog = shProg->_LinkedShaders[stage]->Program; + if (glprog->TexturesUsed[unit] & ~(1 << tgt)) + shProg->SamplersValidated = GL_FALSE; + } prog->TexturesUsed[unit] |= (1 << tgt); } diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp index 6b33266f1b9..674905d5c85 100644 --- a/src/mesa/program/ir_to_mesa.cpp +++ b/src/mesa/program/ir_to_mesa.cpp @@ -3117,6 +3117,11 @@ _mesa_glsl_link_shader(struct gl_context *ctx, struct gl_shader_program *prog) } if (prog->data->LinkStatus) { + /* Reset sampler validated to true, validation happens via the + * LinkShader call below. + */ + prog->SamplersValidated = GL_TRUE; + if (!ctx->Driver.LinkShader(ctx, prog)) { prog->data->LinkStatus = linking_failure; } |