From: Eric Anholt Date: Tue, 19 Jun 2018 23:27:17 +0000 (-0700) Subject: v3d: Implement ALPHA_TO_COVERAGE. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f49d112a01f9bec79b0ddb028163dc189f663634;p=mesa.git 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 --- 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);