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 | |
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
-rw-r--r-- | src/broadcom/compiler/nir_to_vir.c | 14 | ||||
-rw-r--r-- | src/broadcom/compiler/vir.c | 3 |
2 files changed, 15 insertions, 2 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. * diff --git a/src/broadcom/compiler/vir.c b/src/broadcom/compiler/vir.c index 28e25cb23e2..2754924e6c1 100644 --- a/src/broadcom/compiler/vir.c +++ b/src/broadcom/compiler/vir.c @@ -840,7 +840,8 @@ uint64_t *v3d_compile_fs(const struct v3d_compiler *compiler, v3d_set_fs_prog_data_inputs(c, prog_data); prog_data->writes_z = (c->s->info.outputs_written & (1 << FRAG_RESULT_DEPTH)); - prog_data->discard = c->s->info.fs.uses_discard; + prog_data->discard = (c->s->info.fs.uses_discard || + c->fs_key->sample_alpha_to_coverage); prog_data->uses_center_w = c->uses_center_w; return v3d_return_qpu_insts(c, final_assembly_size); |