[Mesa-dev] [PATCH 10/28] glsl: fix cross validation for explicit locations on structs and arrays
Anuj Phogat
anuj.phogat at gmail.com
Wed Jan 6 12:15:31 PST 2016
On Mon, Dec 28, 2015 at 9:00 PM, Timothy Arceri
<timothy.arceri at collabora.com> wrote:
> ---
> src/glsl/link_varyings.cpp | 43 ++++++++++++++++++++++++++++++-------------
> 1 file changed, 30 insertions(+), 13 deletions(-)
>
> diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp
> index ee7cae0..dea8741 100644
> --- a/src/glsl/link_varyings.cpp
> +++ b/src/glsl/link_varyings.cpp
> @@ -239,18 +239,24 @@ cross_validate_outputs_to_inputs(struct gl_shader_program *prog,
> /* User-defined varyings with explicit locations are handled
> * differently because they do not need to have matching names.
> */
> - const unsigned idx = var->data.location - VARYING_SLOT_VAR0;
> + const glsl_type *type = get_varying_type(var, producer->Stage);
> + unsigned num_elements = type->count_attribute_slots(false);
> + unsigned idx = var->data.location - VARYING_SLOT_VAR0;
> + unsigned slot_limit = idx + num_elements;
>
> - if (explicit_locations[idx] != NULL) {
> - linker_error(prog,
> + while(idx < slot_limit) {
> + if (explicit_locations[idx] != NULL) {
> + linker_error(prog,
> "%s shader has multiple outputs explicitly "
> "assigned to location %d\n",
> _mesa_shader_stage_to_string(producer->Stage),
> idx);
> - return;
> - }
> + return;
> + }
>
> - explicit_locations[idx] = var;
> + explicit_locations[idx] = var;
> + idx++;
> + }
> }
> }
>
> @@ -298,14 +304,25 @@ cross_validate_outputs_to_inputs(struct gl_shader_program *prog,
> ir_variable *output = NULL;
> if (input->data.explicit_location
> && input->data.location >= VARYING_SLOT_VAR0) {
> - output = explicit_locations[input->data.location - VARYING_SLOT_VAR0];
>
> - if (output == NULL) {
> - linker_error(prog,
> - "%s shader input `%s' with explicit location "
> - "has no matching output\n",
> - _mesa_shader_stage_to_string(consumer->Stage),
> - input->name);
> + const glsl_type *type = get_varying_type(input, consumer->Stage);
> + unsigned num_elements = type->count_attribute_slots(false);
> + unsigned idx = input->data.location - VARYING_SLOT_VAR0;
> + unsigned slot_limit = idx + num_elements;
> +
> + while(idx < slot_limit) {
> + output = explicit_locations[idx];
> +
> + if (output == NULL ||
> + input->data.location != output->data.location) {
> + linker_error(prog,
> + "%s shader input `%s' with explicit location "
> + "has no matching output\n",
> + _mesa_shader_stage_to_string(consumer->Stage),
> + input->name);
> + break;
> + }
> + idx++;
> }
> } else {
> output = parameters.get_variable(input->name);
> --
> 2.4.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>
More information about the mesa-dev
mailing list