[Mesa-dev] [PATCH] nir/gather_info: Handle double inputs in set_io_mask

Jason Ekstrand jason at jlekstrand.net
Sat Dec 2 19:03:41 UTC 2017


Ugh... This patch, though obviously correct if taken on its own, doesn't
wok.  The double_inputs_read field is more subtle and bonkers than I
thought.

On Sat, Dec 2, 2017 at 9:32 AM, Jason Ekstrand <jason at jlekstrand.net> wrote:

> 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-stable at lists.freedesktop.org
> Cc: Timothy Arceri <tarceri at itsqueeze.com>
> Cc: Alejandro PiƱeiro <apinheiro at 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20171202/a6520415/attachment.html>


More information about the mesa-dev mailing list