diff options
author | Nicolai Hähnle <nicolai.haehnle@amd.com> | 2016-10-07 12:49:36 +0200 |
---|---|---|
committer | Nicolai Hähnle <nicolai.haehnle@amd.com> | 2016-10-07 21:31:01 +0200 |
commit | 90a01e3e5f5a8a84d8a3e51134859698aa5dcf8c (patch) | |
tree | aca1faf76889816f5c1e6dd7c7f2a048292048be | |
parent | e8fe6ee9a2be4804f89d30b34be566c6d03af393 (diff) |
st/glsl_to_tgsi: simpler fixup of empty writemasks
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).
-rw-r--r-- | src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 37 |
1 files changed, 10 insertions, 27 deletions
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index 3c2870d91e..444f5f7925 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -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; } |