Mesa (master): glsl: Set proper swizzle when a channel is missing in vectorizing.

Matt Turner mattst88 at kemper.freedesktop.org
Tue Jan 28 05:18:51 UTC 2014


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

Author: Matt Turner <mattst88 at gmail.com>
Date:   Fri Jan 24 15:17:08 2014 -0800

glsl: Set proper swizzle when a channel is missing in vectorizing.

Previously, for example if the x channel was missing from a series of
assignments we were attempting to vectorize, the wrong swizzle mask
would be applied.

   a.y = b.y;
   a.z = b.z;
   a.w = b.w;

would be incorrectly transformed into

   a.yzw = b.xyz;

Fixes two transform feedback tests in the ES3 conformance suite.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=73978
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=73954
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

---

 src/glsl/opt_vectorize.cpp |   17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/src/glsl/opt_vectorize.cpp b/src/glsl/opt_vectorize.cpp
index 9ca811a..ac43a29 100644
--- a/src/glsl/opt_vectorize.cpp
+++ b/src/glsl/opt_vectorize.cpp
@@ -170,22 +170,31 @@ void
 ir_vectorize_visitor::try_vectorize()
 {
    if (this->last_assignment && this->channels > 1) {
-      ir_swizzle_mask mask = {0, 1, 2, 3, channels, 0};
-
-      visit_tree(this->last_assignment->rhs, rewrite_swizzle, &mask);
+      ir_swizzle_mask mask = {0, 0, 0, 0, channels, 0};
 
       this->last_assignment->write_mask = 0;
 
-      for (unsigned i = 0; i < 4; i++) {
+      for (unsigned i = 0, j = 0; i < 4; i++) {
          if (this->assignment[i]) {
             this->last_assignment->write_mask |= 1 << i;
 
             if (this->assignment[i] != this->last_assignment) {
                this->assignment[i]->remove();
             }
+
+            switch (j) {
+            case 0: mask.x = i; break;
+            case 1: mask.y = i; break;
+            case 2: mask.z = i; break;
+            case 3: mask.w = i; break;
+            }
+
+            j++;
          }
       }
 
+      visit_tree(this->last_assignment->rhs, rewrite_swizzle, &mask);
+
       this->progress = true;
    }
    clear();




More information about the mesa-commit mailing list