[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