summaryrefslogtreecommitdiffstats
path: root/src/broadcom/compiler/nir_to_vir.c
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2017-11-15 15:05:37 -0800
committerEric Anholt <[email protected]>2017-11-17 16:09:55 -0800
commit87391e23cf2110051c3c74281402a690b67ccc7f (patch)
treef8023e5cf91aa9d18d56bad423982383e4849b8f /src/broadcom/compiler/nir_to_vir.c
parentc40ac132e4ba44f1d086112ebd27d3ec06aea8e9 (diff)
broadcom/vc5: Ensure that there is always a TLB write.
This should fix some GPU hangs in our (currently always single-threaded) fragment shaders, and definitely fixes assertion failures in simulation.
Diffstat (limited to 'src/broadcom/compiler/nir_to_vir.c')
-rw-r--r--src/broadcom/compiler/nir_to_vir.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c
index 4b176960b0b..879704aeeed 100644
--- a/src/broadcom/compiler/nir_to_vir.c
+++ b/src/broadcom/compiler/nir_to_vir.c
@@ -1065,6 +1065,12 @@ emit_frag_end(struct v3d_compile *c)
}
*/
+ bool has_any_tlb_color_write = false;
+ for (int rt = 0; rt < c->fs_key->nr_cbufs; rt++) {
+ if (c->output_color_var[rt])
+ has_any_tlb_color_write = true;
+ }
+
if (c->output_position_index != -1) {
struct qinst *inst = vir_MOV_dest(c,
vir_reg(QFILE_TLBU, 0),
@@ -1075,7 +1081,17 @@ emit_frag_end(struct v3d_compile *c)
TLB_TYPE_DEPTH |
TLB_DEPTH_TYPE_PER_PIXEL |
0xffffff00);
- } else if (c->s->info.fs.uses_discard) {
+ } else if (c->s->info.fs.uses_discard || !has_any_tlb_color_write) {
+ /* Emit passthrough Z if it needed to be delayed until shader
+ * end due to potential discards.
+ *
+ * Since (single-threaded) fragment shaders always need a TLB
+ * write, emit passthrouh Z if we didn't have any color
+ * buffers and flag us as potentially discarding, so that we
+ * can use Z as the TLB write.
+ */
+ c->s->info.fs.uses_discard = true;
+
struct qinst *inst = vir_MOV_dest(c,
vir_reg(QFILE_TLBU, 0),
vir_reg(QFILE_NULL, 0));