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 with953a0af8e3
. Fixes:953a0af8e3
("mesa: validate sampler uniforms during gluniform calls") Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com> Reviewed-by: Tapani Pälli <tapani.palli@intel.com> https://bugs.freedesktop.org/show_bug.cgi?id=97524
This commit is contained in:
parent
918cec8cbe
commit
d682f8aa8e
|
@ -972,6 +972,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];
|
||||
|
||||
|
|
|
@ -67,11 +67,15 @@ void
|
|||
_mesa_update_shader_textures_used(struct gl_shader_program *shProg,
|
||||
struct gl_program *prog)
|
||||
{
|
||||
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];
|
||||
|
||||
assert(shader);
|
||||
|
||||
memset(prog->TexturesUsed, 0, sizeof(prog->TexturesUsed));
|
||||
|
||||
shProg->SamplersValidated = GL_TRUE;
|
||||
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue