glsl: Rework assignments with write_masks to have LHS chan count match RHS.
It turns out that most people new to this IR are surprised when an assignment to (say) 3 components on the LHS takes 4 components on the RHS. It also makes for quite strange IR output: (assign (constant bool (1)) (x) (var_ref color) (swiz x (var_ref v) )) (assign (constant bool (1)) (y) (var_ref color) (swiz yy (var_ref v) )) (assign (constant bool (1)) (z) (var_ref color) (swiz zzz (var_ref v) )) But even worse, even we get it wrong, as shown by this line of our current step(float, vec4): (assign (constant bool (1)) (w) (var_ref t) (expression float b2f (expression bool >= (swiz w (var_ref x))(var_ref edge)))) where we try to assign a float to the writemasked-out x channel and don't supply anything for the actual w channel we're writing. Drivers right now just get lucky since ir_to_mesa spams the float value across all the source channels of a vec4. Instead, the RHS will now have a number of components equal to the number of components actually being written. Hopefully this confuses everyone less, and it also makes codegen for a scalar target simpler. Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
@@ -391,14 +391,16 @@ ir_validate::visit_enter(ir_assignment *ir)
|
||||
abort();
|
||||
}
|
||||
|
||||
/* Mask of fields that do not exist in the destination. These should
|
||||
* not be written by the assignment.
|
||||
*/
|
||||
const unsigned invalid_mask = ~((1U << lhs->type->components()) - 1);
|
||||
int lhs_components = 0;
|
||||
for (int i = 0; i < 4; i++) {
|
||||
if (ir->write_mask & (1 << i))
|
||||
lhs_components++;
|
||||
}
|
||||
|
||||
if ((invalid_mask & ir->write_mask) != 0) {
|
||||
printf("Assignment write mask enables invalid components for "
|
||||
"type %s:\n", lhs->type->name);
|
||||
if (lhs_components != ir->rhs->type->vector_elements) {
|
||||
printf("Assignment count of LHS write mask channels enabled not\n"
|
||||
"matching RHS vector size (%d LHS, %d RHS).\n",
|
||||
lhs_components, ir->rhs->type->vector_elements);
|
||||
ir->print();
|
||||
abort();
|
||||
}
|
||||
|
Reference in New Issue
Block a user