diff options
author | Eric Anholt <[email protected]> | 2018-06-19 16:27:17 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2018-06-20 09:30:46 -0700 |
commit | f49d112a01f9bec79b0ddb028163dc189f663634 (patch) | |
tree | 54299d3bc57369a30acd8a7cb39caafc40788241 /src/broadcom/compiler/nir_to_vir.c | |
parent | 94f7c011d6e099f1c6e7cfce90b61700fbd9c1e2 (diff) |
v3d: Implement ALPHA_TO_COVERAGE.
There's a convenient "FTOC" instruction for generating the coverage now,
unlike vc4. This fixes
dEQP-GLES3.functional.multisample.fbo_4_samples.proportionality_alpha_to_coverage
Diffstat (limited to 'src/broadcom/compiler/nir_to_vir.c')
-rw-r--r-- | src/broadcom/compiler/nir_to_vir.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c index 4cbdb764eab..267d61a25ab 100644 --- a/src/broadcom/compiler/nir_to_vir.c +++ b/src/broadcom/compiler/nir_to_vir.c @@ -920,6 +920,16 @@ emit_frag_end(struct v3d_compile *c) has_any_tlb_color_write = true; } + if (c->fs_key->sample_alpha_to_coverage && c->output_color_var[0]) { + struct nir_variable *var = c->output_color_var[0]; + struct qreg *color = &c->outputs[var->data.driver_location * 4]; + + vir_SETMSF_dest(c, vir_reg(QFILE_NULL, 0), + vir_AND(c, + vir_MSF(c), + vir_FTOC(c, color[3]))); + } + if (c->output_position_index != -1) { struct qinst *inst = vir_MOV_dest(c, vir_reg(QFILE_TLBU, 0), @@ -930,7 +940,9 @@ emit_frag_end(struct v3d_compile *c) TLB_TYPE_DEPTH | TLB_DEPTH_TYPE_PER_PIXEL | 0xffffff00); - } else if (c->s->info.fs.uses_discard || !has_any_tlb_color_write) { + } else if (c->s->info.fs.uses_discard || + c->fs_key->sample_alpha_to_coverage || + !has_any_tlb_color_write) { /* Emit passthrough Z if it needed to be delayed until shader * end due to potential discards. * |