summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2015-01-12 14:53:48 +1300
committerEric Anholt <[email protected]>2015-01-15 22:19:25 +1300
commit6313a2c8f074e6876df56881eebb4be8690d8c41 (patch)
tree75a30064d2dbb1baaa3a59195a75938abe363ea1
parent0289a2620152528555cf9d37edf1616de47fea06 (diff)
vc4: Colormask should apply after all other fragment ops (like logic op).
Theoretically it should apply after dithering as well, but ditehring for 565 happens in fixed function in the TLB store.
-rw-r--r--src/gallium/drivers/vc4/vc4_program.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c
index ff2bdf2099d..0fa43e2c9fa 100644
--- a/src/gallium/drivers/vc4/vc4_program.c
+++ b/src/gallium/drivers/vc4/vc4_program.c
@@ -1804,15 +1804,6 @@ emit_frag_end(struct vc4_compile *c)
blend_color[i] = qir_srgb_encode(c, blend_color[i]);
}
- /* If the bit isn't set in the color mask, then just return the
- * original dst color, instead.
- */
- for (int i = 0; i < 4; i++) {
- if (!(c->fs_key->blend.colormask & (1 << i))) {
- blend_color[i] = dst_color[i];
- }
- }
-
/* Debug: Sometimes you're getting a black output and just want to see
* if the FS is getting executed at all. Spam magenta into the color
* output.
@@ -1875,6 +1866,24 @@ emit_frag_end(struct vc4_compile *c)
packed_color = vc4_logicop(c, packed_color, packed_dst_color);
}
+ /* If the bit isn't set in the color mask, then just return the
+ * original dst color, instead.
+ */
+ uint32_t colormask = 0xffffffff;
+ for (int i = 0; i < 4; i++) {
+ if (format_swiz[i] < 4 &&
+ !(c->fs_key->blend.colormask & (1 << format_swiz[i]))) {
+ colormask &= ~(0xff << (i * 8));
+ }
+ }
+ if (colormask != 0xffffffff) {
+ packed_color = qir_OR(c,
+ qir_AND(c, packed_color,
+ qir_uniform_ui(c, colormask)),
+ qir_AND(c, packed_dst_color,
+ qir_uniform_ui(c, ~colormask)));
+ }
+
qir_emit(c, qir_inst(QOP_TLB_COLOR_WRITE, c->undef,
packed_color, c->undef));
}