It's a little sketchy to put the logic in set_io_mask but due to a detail of the GLSL spec, it's safe to check for 64-bit without knowing the full access chain. This fixes a bug where try_mask_partial_io succeeded at marking a portion of the input as used but then we came along and marked the whole thing in double_inputs_read. By putting it in set_io_mask, we get the correct flagging even for partial reads.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103241 Cc: mesa-sta...@lists.freedesktop.org Cc: Timothy Arceri <tarc...@itsqueeze.com> Cc: Alejandro PiƱeiro <apinhe...@igalia.com> --- src/compiler/nir/nir_gather_info.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/compiler/nir/nir_gather_info.c b/src/compiler/nir/nir_gather_info.c index 9469396..bab37f3 100644 --- a/src/compiler/nir/nir_gather_info.c +++ b/src/compiler/nir/nir_gather_info.c @@ -54,6 +54,23 @@ set_io_mask(nir_shader *shader, nir_variable *var, int offset, int len, else shader->info.inputs_read |= bitfield; + /* From the GLSL 4.60 spec, section 4.3.4 "Input Variables": + * + * It is a compile-time error to declare a vertex shader input + * containing any of the following: + * + * - A Boolean type (bool, bvec2, bvec3, bvec4) + * - An opaque type + * - A structure + * + * Therefore, when looking for 64-bit attributes, we need only + * consider arrays of vectors. + */ + if (shader->info.stage == MESA_SHADER_VERTEX && + glsl_type_is_dual_slot(glsl_without_array(var->type))) { + shader->info.double_inputs_read |= bitfield; + } + if (shader->info.stage == MESA_SHADER_FRAGMENT) { shader->info.fs.uses_sample_qualifier |= var->data.sample; } @@ -226,17 +243,6 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader) if (!try_mask_partial_io(shader, instr->variables[0], is_output_read)) mark_whole_variable(shader, var, is_output_read); - - /* We need to track which input_reads bits correspond to a - * dvec3/dvec4 input attribute */ - if (shader->info.stage == MESA_SHADER_VERTEX && - var->data.mode == nir_var_shader_in && - glsl_type_is_dual_slot(glsl_without_array(var->type))) { - for (uint i = 0; i < glsl_count_attribute_slots(var->type, false); i++) { - int idx = var->data.location + i; - shader->info.double_inputs_read |= BITFIELD64_BIT(idx); - } - } } break; } -- 2.5.0.400.gff86faf _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev