nir/lower_samplers: Limit assert to GLSL shader programs
authorEduardo Lima Mitev <elima@igalia.com>
Wed, 15 Nov 2017 23:14:52 +0000 (00:14 +0100)
committerAlejandro Piñeiro <apinheiro@igalia.com>
Thu, 21 Jun 2018 12:25:05 +0000 (14:25 +0200)
Vulkan has the concept of separate image and sampler objects in the
SPIR-V code whereas GL conflates them into one. nir_lower_samplers
contains an assert to verify that sampler operand is not being set on
the nir instruction. However when the code comes from spirv_to_nir the
sampler operand is always set. GL_arb_gl_spirv explicitly states that
OpTypeSampler is not supported so it retains the GL behaviour of not
being able to seperate them. Therefore the sampler will always be the
same as the texture. This GL version of the lowering code ignores
instr->sampler and sets instr->sampler_index to the same value as
instr->texture_index. Some other places in the code (such as in
nir_print) assume that once the instruction is lowered then both
instr->texture and instr->sampler will be NULL, so to keep this
behaviour we now set instr->sampler to NULL after ignoring it to fill
in instr->sampler_index.

Signed-off-by: Eduardo Lima <elima@igalia.com>
Signed-off-by: Neil Roberts <nroberts@igalia.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/glsl/gl_nir_lower_samplers.c

index a53fabb7e6222ec5e31401411c77d7764914da71..c54455f91de01ee1555c3ac64efb59585c569696 100644 (file)
@@ -93,7 +93,7 @@ lower_sampler(nir_tex_instr *instr, const struct gl_shader_program *shader_progr
       return false;
 
    /* In GLSL, we only fill out the texture field.  The sampler is inferred */
-   assert(instr->sampler == NULL);
+   assert(instr->sampler == NULL || shader_program->data->spirv);
 
    instr->texture_index = 0;
    unsigned location = instr->texture->var->data.location;
@@ -125,6 +125,7 @@ lower_sampler(nir_tex_instr *instr, const struct gl_shader_program *shader_progr
    instr->sampler_index = instr->texture_index;
 
    instr->texture = NULL;
+   nir_instr_rewrite_deref(&instr->instr, &instr->sampler, NULL);
 
    return true;
 }