st/glsl_to_tgsi: simpler fixup of empty writemasks
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Fri, 7 Oct 2016 10:49:36 +0000 (12:49 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 12 Oct 2016 16:50:10 +0000 (18:50 +0200)
Empty writemasks mean "copy everything", so we can always just use the number
of vector elements (which uses the GLSL meaning here, i.e. each double is a
single element/writemask bit).

Reviewed-by: Edward O'Callaghan <funfunctor@folklore1984.net>
Reviewed-by: Dave Airlie <airlied@redhat.com>
src/mesa/state_tracker/st_glsl_to_tgsi.cpp

index da7b83b7f08f65a609eddd4d053265e4890c7760..6a63e5c6ec08fa228f4f9af12dbd2e0ed331bf85 100644 (file)
@@ -2842,33 +2842,7 @@ glsl_to_tgsi_visitor::visit(ir_assignment *ir)
 
    l = get_assignment_lhs(ir->lhs, this);
 
-   /* FINISHME: This should really set to the correct maximal writemask for each
-    * FINISHME: component written (in the loops below).  This case can only
-    * FINISHME: occur for matrices, arrays, and structures.
-    */
-   if (ir->write_mask == 0) {
-      assert(!ir->lhs->type->is_scalar() && !ir->lhs->type->is_vector());
-
-      if (ir->lhs->type->is_array() || ir->lhs->type->without_array()->is_matrix()) {
-         if (ir->lhs->type->without_array()->is_64bit()) {
-            switch (ir->lhs->type->without_array()->vector_elements) {
-            case 1:
-               l.writemask = WRITEMASK_X;
-               break;
-            case 2:
-               l.writemask = WRITEMASK_XY;
-               break;
-            case 3:
-               l.writemask = WRITEMASK_XYZ;
-               break;
-            case 4:
-               l.writemask = WRITEMASK_XYZW;
-               break;
-            }
-         } else
-            l.writemask = WRITEMASK_XYZW;
-      }
-   } else {
+   {
       int swizzles[4];
       int first_enabled_chan = 0;
       int rhs_chan = 0;
@@ -2887,6 +2861,15 @@ glsl_to_tgsi_visitor::visit(ir_assignment *ir)
             assert(variable->data.location == FRAG_RESULT_STENCIL);
             l.writemask = WRITEMASK_Y;
          }
+      } else if (ir->write_mask == 0) {
+         assert(!ir->lhs->type->is_scalar() && !ir->lhs->type->is_vector());
+
+         if (ir->lhs->type->is_array() || ir->lhs->type->is_matrix()) {
+            unsigned num_elements = ir->lhs->type->without_array()->vector_elements;
+            l.writemask = u_bit_consecutive(0, num_elements);
+         } else {
+            l.writemask = WRITEMASK_XYZW;
+         }
       } else {
          l.writemask = ir->write_mask;
       }