diff options
author | Eric Anholt <eric@anholt.net> | 2014-08-21 12:47:14 -0700 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2014-08-22 10:16:58 -0700 |
commit | cc68be262003f371d2320f98e57931fcef1c7c8c (patch) | |
tree | 6c7e087158b7a7af7a8e48f1849e1b5ed880a7cc | |
parent | ae83955b1da238ccf180cba568f4269f01bb21fa (diff) |
vc4: Avoid using undefined values when there's no color write.
The simulator assertion fails when you read-before-write a temporary
value, and there's no point in doing the packing if there was no color
written.
-rw-r--r-- | src/gallium/drivers/vc4/vc4_program.c | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c index 9f59bdffe0c..08ac5e8b826 100644 --- a/src/gallium/drivers/vc4/vc4_program.c +++ b/src/gallium/drivers/vc4/vc4_program.c @@ -934,8 +934,6 @@ emit_frag_end(struct tgsi_to_qir *trans) { struct qcompile *c = trans->c; - struct qreg t = qir_get_temp(c); - struct qreg src_color[4] = { trans->outputs[0], trans->outputs[1], trans->outputs[2], trans->outputs[3], @@ -991,13 +989,34 @@ emit_frag_end(struct tgsi_to_qir *trans) c->undef, c->undef)); } - qir_emit(c, qir_inst4(QOP_PACK_COLORS, t, - swizzled_outputs[0], - swizzled_outputs[1], - swizzled_outputs[2], - swizzled_outputs[3])); + bool color_written = false; + for (int i = 0; i < 4; i++) { + if (swizzled_outputs[i].file != QFILE_NULL) + color_written = true; + } + + struct qreg packed_color; + if (color_written) { + /* Fill in any undefined colors. The simulator will assertion + * fail if we read something that wasn't written, and I don't + * know what hardware does. + */ + for (int i = 0; i < 4; i++) { + if (swizzled_outputs[i].file == QFILE_NULL) + swizzled_outputs[i] = qir_uniform_f(trans, 0.0); + } + packed_color = qir_get_temp(c); + qir_emit(c, qir_inst4(QOP_PACK_COLORS, packed_color, + swizzled_outputs[0], + swizzled_outputs[1], + swizzled_outputs[2], + swizzled_outputs[3])); + } else { + packed_color = qir_uniform_ui(trans, 0); + } + qir_emit(c, qir_inst(QOP_TLB_COLOR_WRITE, c->undef, - t, c->undef)); + packed_color, c->undef)); } static void |