Module: Mesa
Branch: master
Commit: dac2964f3ebd96d5ac227984ab0cd79c2c3b2a1a
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=dac2964f3ebd96d5ac227984ab0cd79c2c3b2a1a

Author: Ilia Mirkin <[email protected]>
Date:   Thu Jan 21 07:17:06 2016 -0500

glsl: always compute proper varying type, irrespective of varying packing

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 <[email protected]>
Reviewed-by: Timothy Arceri <[email protected]>
Cc: "11.0 11.1" <[email protected]>

---

 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;

_______________________________________________
mesa-commit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to