glsl: don't run intrastage array validation when the interface type is not an array
authorSamuel Iglesias Gonsálvez <siglesias@igalia.com>
Thu, 9 Nov 2017 10:15:03 +0000 (11:15 +0100)
committerSamuel Iglesias Gonsálvez <siglesias@igalia.com>
Mon, 4 Dec 2017 08:32:57 +0000 (09:32 +0100)
We validate that the interface block array type's definition matches.
However, previously, the function could be called if an non-array
interface block has different type definitions -for example, when the
precision qualifier differs in a GLSL ES shader, we would create two
different types-, and it would return invalid as both definitions are
non-arrays.

We fix this by specifying that at least one definition should be an
array to call the validation.

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/compiler/glsl/link_interface_blocks.cpp

index c2c3b58..ce90d91 100644 (file)
@@ -137,7 +137,7 @@ intrastage_match(ir_variable *a,
    /* If a block is an array then it must match across the shader.
     * Unsized arrays are also processed and matched agaist sized arrays.
     */
-   if (b->type != a->type &&
+   if (b->type != a->type && (b->type->is_array() || a->type->is_array()) &&
        (b->is_interface_instance() || a->is_interface_instance()) &&
        !validate_intrastage_arrays(prog, b, a))
       return false;