summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/vc4
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2014-09-16 12:55:16 -0700
committerEric Anholt <[email protected]>2014-09-16 13:03:41 -0700
commit2264925f85f349f57773d46114806a148eae6394 (patch)
tree9b059661ae394b6e68c4dd164c356be920efc5df /src/gallium/drivers/vc4
parentaae4223fbd2d94f922339baa11ffefdb88896770 (diff)
vc4: Add support for computed depth writes.
Fixes piglit glsl-1.10-fragdepth and early-z.
Diffstat (limited to 'src/gallium/drivers/vc4')
-rw-r--r--src/gallium/drivers/vc4/vc4_program.c23
-rw-r--r--src/gallium/drivers/vc4/vc4_qir.c3
-rw-r--r--src/gallium/drivers/vc4/vc4_qir.h2
3 files changed, 26 insertions, 2 deletions
diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c
index 8a83913bbe5..a662dc2ce54 100644
--- a/src/gallium/drivers/vc4/vc4_program.c
+++ b/src/gallium/drivers/vc4/vc4_program.c
@@ -891,6 +891,16 @@ emit_tgsi_declaration(struct vc4_compile *c,
case TGSI_FILE_OUTPUT:
resize_qreg_array(c, &c->outputs, &c->outputs_array_size,
(decl->Range.Last + 1) * 4);
+
+ switch (decl->Semantic.Name) {
+ case TGSI_SEMANTIC_POSITION:
+ c->output_position_index = decl->Range.First * 4;
+ break;
+ case TGSI_SEMANTIC_COLOR:
+ c->output_color_index = decl->Range.First * 4;
+ break;
+ }
+
break;
}
}
@@ -1206,7 +1216,9 @@ emit_frag_end(struct vc4_compile *c)
c->undef, c->undef, c->undef, c->undef
};
vc4_blend(c, blend_color, dst_color,
- c->outputs ? c->outputs : undef_array);
+ (c->output_color_index != -1 ?
+ c->outputs + c->output_color_index :
+ undef_array));
/* If the bit isn't set in the color mask, then just return the
* original dst color, instead.
@@ -1238,7 +1250,14 @@ emit_frag_end(struct vc4_compile *c)
qir_TLB_DISCARD_SETUP(c, c->discard);
if (c->fs_key->depth_enabled) {
- qir_TLB_Z_WRITE(c, qir_FRAG_Z(c));
+ struct qreg z;
+ if (c->output_position_index != -1) {
+ z = qir_FTOI(c, qir_FMUL(c, c->outputs[c->output_position_index + 2],
+ qir_uniform_f(c, 0xffffff)));
+ } else {
+ z = qir_FRAG_Z(c);
+ }
+ qir_TLB_Z_WRITE(c, z);
}
bool color_written = false;
diff --git a/src/gallium/drivers/vc4/vc4_qir.c b/src/gallium/drivers/vc4/vc4_qir.c
index 640589d23c0..216abb37828 100644
--- a/src/gallium/drivers/vc4/vc4_qir.c
+++ b/src/gallium/drivers/vc4/vc4_qir.c
@@ -279,6 +279,9 @@ qir_compile_init(void)
make_empty_list(&c->instructions);
+ c->output_position_index = -1;
+ c->output_color_index = -1;
+
return c;
}
diff --git a/src/gallium/drivers/vc4/vc4_qir.h b/src/gallium/drivers/vc4/vc4_qir.h
index f26f8963f34..f3dad5ed67c 100644
--- a/src/gallium/drivers/vc4/vc4_qir.h
+++ b/src/gallium/drivers/vc4/vc4_qir.h
@@ -227,6 +227,8 @@ struct vc4_compile {
uint32_t num_uniforms;
uint32_t num_outputs;
uint32_t num_texture_samples;
+ uint32_t output_position_index;
+ uint32_t output_color_index;
struct qreg undef;
enum qstage stage;