[Mesa-dev] [PATCH] glsl: always compute proper varying type, irrespective of varying packing

Timothy Arceri t_arceri at yahoo.com.au
Thu Jan 21 04:30:21 PST 2016



On 21 January 2016 11:17:06 pm AEDT, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
>Normally there's a producer and consumer, and the producer var gets
>picked. In both the vertex->gs and tes->gs cases, that's the un-arrayed
>version.
>
>In the SSO case, however, there is no producer. So we picked the
>arrayed
>GS variable, and as a result, used more slots than we should. More
>critically, these slots would also no longer line up with the
>producer's
>calculation. To fix this, we need to fix up the type of the variable
>based on stage no matter what.
>
>Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93650
>Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>

Makes sense.

Reviewed-by: Timothy Arceri <timothy.arceri at collabora.com>


>---
> src/glsl/link_varyings.cpp | 13 +++++--------
> 1 file changed, 5 insertions(+), 8 deletions(-)
>
>diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp
>index 09f80d0..264b69c 100644
>--- a/src/glsl/link_varyings.cpp
>+++ b/src/glsl/link_varyings.cpp
>@@ -1001,23 +1001,20 @@ varying_matches::record(ir_variable
>*producer_var, ir_variable *consumer_var)
> 
>    const ir_variable *const var = (producer_var != NULL)
>       ? producer_var : consumer_var;
>+   const gl_shader_stage stage = (producer_var != NULL)
>+      ? producer_stage : consumer_stage;
>+   const glsl_type *type = get_varying_type(var, stage);
> 
>    this->matches[this->num_matches].packing_class
>       = this->compute_packing_class(var);
>    this->matches[this->num_matches].packing_order
>       = this->compute_packing_order(var);
>    if (this->disable_varying_packing) {
>-      unsigned slots;
>-      gl_shader_stage stage =
>-         (producer_var != NULL) ? producer_stage : consumer_stage;
>-
>-      const glsl_type *type = get_varying_type(var, stage);
>-
>-      slots = type->count_attribute_slots(false);
>+      unsigned slots = type->count_attribute_slots(false);
>       this->matches[this->num_matches].num_components = slots * 4;
>    } else {
>       this->matches[this->num_matches].num_components
>-         = var->type->component_slots();
>+         = type->component_slots();
>    }
>    this->matches[this->num_matches].producer_var = producer_var;
>    this->matches[this->num_matches].consumer_var = consumer_var;
>-- 
>2.4.10
>
>_______________________________________________
>mesa-dev mailing list
>mesa-dev at lists.freedesktop.org
>http://lists.freedesktop.org/mailman/listinfo/mesa-dev

-- 
Sent from my Android device with K-9 Mail. Please excuse my brevity.


More information about the mesa-dev mailing list