[Mesa-dev] [PATCH] st/glsl_to_nir: add patch support to st_nir_assign_var_locations()

Marek Olšák maraeo at gmail.com
Tue Dec 26 17:25:45 UTC 2017


Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Thu, Dec 14, 2017 at 12:14 AM, Timothy Arceri <tarceri at itsqueeze.com> wrote:
> ---
>  src/mesa/state_tracker/st_glsl_to_nir.cpp | 22 +++++++++++++++++-----
>  1 file changed, 17 insertions(+), 5 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp
> index 70c5daaa225..be34031bfb5 100644
> --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
> @@ -119,46 +119,58 @@ st_nir_assign_vs_in_locations(struct gl_program *prog, nir_shader *nir)
>           exec_list_push_tail(&nir->globals, &var->node);
>        }
>     }
>  }
>
>  static void
>  st_nir_assign_var_locations(struct exec_list *var_list, unsigned *size,
>                              gl_shader_stage stage)
>  {
>     unsigned location = 0;
> -   unsigned assigned_locations[VARYING_SLOT_MAX];
> +   unsigned assigned_locations[VARYING_SLOT_TESS_MAX];
>     uint64_t processed_locs = 0;
> +   uint32_t processed_patch_locs = 0;
>
>     nir_foreach_variable(var, var_list) {
>
>        const struct glsl_type *type = var->type;
>        if (nir_is_per_vertex_io(var, stage)) {
>           assert(glsl_type_is_array(type));
>           type = glsl_get_array_element(type);
>        }
>
> +      bool processed = false;
> +      if (var->data.patch) {
> +         unsigned patch_loc = var->data.location - VARYING_SLOT_VAR0;
> +         if (processed_patch_locs & (1 << patch_loc))
> +            processed = true;
> +
> +         processed_patch_locs |= (1 << patch_loc);
> +      } else {
> +         if (processed_locs & ((uint64_t)1 << var->data.location))
> +            processed = true;
> +
> +         processed_locs |= ((uint64_t)1 << var->data.location);
> +      }
> +
>        /* Because component packing allows varyings to share the same location
>         * we may have already have processed this location.
>         */
> -      if (var->data.location >= VARYING_SLOT_VAR0 &&
> -          processed_locs & ((uint64_t)1 << var->data.location)) {
> +      if (processed && var->data.location >= VARYING_SLOT_VAR0) {
>           var->data.driver_location = assigned_locations[var->data.location];
>           *size += type_size(type);
>           continue;
>        }
>
>        assigned_locations[var->data.location] = location;
>        var->data.driver_location = location;
>        location += type_size(type);
> -
> -      processed_locs |= ((uint64_t)1 << var->data.location);
>     }
>
>     *size += location;
>  }
>
>  static int
>  st_nir_lookup_parameter_index(const struct gl_program_parameter_list *params,
>                                const char *name)
>  {
>     int loc = _mesa_lookup_parameter_index(params, name);
> --
> 2.14.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list