summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2014-08-18 11:46:58 -0700
committerEric Anholt <[email protected]>2014-08-18 15:27:43 -0700
commitc1db622215e772fb94760ea2dbe97eacf2e6c4cb (patch)
treea3685cadc420155950b9d0ce6bd8b42dc63ce0da /src/gallium/drivers
parent50b4293eb3f26609c28c37898877d15e3c597702 (diff)
vc4: Add support for color masking.
This gets fbo-colormask-formats working for core formats, which increases my confidence in some of the swizzle and blend handling.
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/vc4/vc4_program.c37
1 files changed, 24 insertions, 13 deletions
diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c
index f12587028d2..0210ebc5815 100644
--- a/src/gallium/drivers/vc4/vc4_program.c
+++ b/src/gallium/drivers/vc4/vc4_program.c
@@ -872,9 +872,8 @@ vc4_blend_func(struct tgsi_to_qir *trans,
*/
static void
vc4_blend(struct tgsi_to_qir *trans, struct qreg *result,
- struct qreg *src_color)
+ struct qreg *dst_color, struct qreg *src_color)
{
- struct qcompile *c = trans->c;
struct pipe_rt_blend_state *blend = &trans->fs_key->blend;
if (!blend->blend_enable) {
@@ -883,15 +882,6 @@ vc4_blend(struct tgsi_to_qir *trans, struct qreg *result,
return;
}
- qir_emit(c, qir_inst(QOP_TLB_COLOR_READ, c->undef,
- c->undef, c->undef));
- struct qreg dst_color[4];
- for (int i = 0; i < 4; i++) {
- dst_color[i] = qir_R4_UNPACK(c, i);
-
- /* XXX: Swizzles? */
- }
-
struct qreg src_blend[4], dst_blend[4];
for (int i = 0; i < 3; i++) {
src_blend[i] = vc4_blend_channel(trans,
@@ -932,13 +922,34 @@ emit_frag_end(struct tgsi_to_qir *trans)
const struct util_format_description *format_desc =
util_format_description(trans->fs_key->color_format);
- struct qreg output_color[4] = {
+ struct qreg src_color[4] = {
trans->outputs[0], trans->outputs[1],
trans->outputs[2], trans->outputs[3],
};
+ struct qreg dst_color[4] = { c->undef, c->undef, c->undef, c->undef };
+ if (trans->fs_key->blend.blend_enable ||
+ trans->fs_key->blend.colormask != 0xf) {
+ qir_emit(c, qir_inst(QOP_TLB_COLOR_READ, c->undef,
+ c->undef, c->undef));
+ for (int i = 0; i < 4; i++) {
+ dst_color[i] = qir_R4_UNPACK(c, i);
+
+ /* XXX: Swizzles? */
+ }
+ }
+
struct qreg blend_color[4];
- vc4_blend(trans, blend_color, output_color);
+ vc4_blend(trans, blend_color, dst_color, src_color);
+
+ /* 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 (!(trans->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