summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolai Hähnle <nicolai.haehnle@amd.com>2016-10-07 12:49:36 +0200
committerNicolai Hähnle <nicolai.haehnle@amd.com>2016-10-07 21:31:01 +0200
commit90a01e3e5f5a8a84d8a3e51134859698aa5dcf8c (patch)
treeaca1faf76889816f5c1e6dd7c7f2a048292048be
parente8fe6ee9a2be4804f89d30b34be566c6d03af393 (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.cpp37
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;
}