diff options
-rw-r--r-- | src/broadcom/compiler/nir_to_vir.c | 3 | ||||
-rw-r--r-- | src/broadcom/compiler/v3d_compiler.h | 3 | ||||
-rw-r--r-- | src/broadcom/compiler/vir.c | 25 | ||||
-rw-r--r-- | src/gallium/drivers/v3d/v3dx_draw.c | 9 |
4 files changed, 23 insertions, 17 deletions
diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c index 41fc03aa242..0a3275de7dc 100644 --- a/src/broadcom/compiler/nir_to_vir.c +++ b/src/broadcom/compiler/nir_to_vir.c @@ -1142,7 +1142,9 @@ emit_frag_end(struct v3d_compile *c) inst->src[vir_get_implicit_uniform_src(inst)] = vir_uniform_ui(c, tlb_specifier | 0xffffff00); + c->writes_z = true; } else if (c->s->info.fs.uses_discard || + !c->s->info.fs.early_fragment_tests || c->fs_key->sample_alpha_to_coverage || !has_any_tlb_color_write) { /* Emit passthrough Z if it needed to be delayed until shader @@ -1172,6 +1174,7 @@ emit_frag_end(struct v3d_compile *c) inst->src[vir_get_implicit_uniform_src(inst)] = vir_uniform_ui(c, tlb_specifier | 0xffffff00); + c->writes_z = true; } /* XXX: Performance improvement: Merge Z write and color writes TLB diff --git a/src/broadcom/compiler/v3d_compiler.h b/src/broadcom/compiler/v3d_compiler.h index 1b6d2e7c2dc..3d21a1154f7 100644 --- a/src/broadcom/compiler/v3d_compiler.h +++ b/src/broadcom/compiler/v3d_compiler.h @@ -520,6 +520,7 @@ struct v3d_compile { uint32_t centroid_flags[BITSET_WORDS(V3D_MAX_FS_INPUTS)]; bool uses_center_w; + bool writes_z; struct v3d_ubo_range *ubo_ranges; bool *ubo_range_used; @@ -717,7 +718,7 @@ struct v3d_fs_prog_data { uint32_t centroid_flags[((V3D_MAX_FS_INPUTS - 1) / 24) + 1]; bool writes_z; - bool discard; + bool disable_ez; bool uses_center_w; }; diff --git a/src/broadcom/compiler/vir.c b/src/broadcom/compiler/vir.c index 077f9c1ecc9..3efe41d3da9 100644 --- a/src/broadcom/compiler/vir.c +++ b/src/broadcom/compiler/vir.c @@ -745,21 +745,9 @@ v3d_fs_set_prog_data(struct v3d_compile *c, struct v3d_fs_prog_data *prog_data) { 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 || - c->fs_key->sample_alpha_to_coverage); + prog_data->writes_z = c->writes_z; + prog_data->disable_ez = !c->s->info.fs.early_fragment_tests; prog_data->uses_center_w = c->uses_center_w; - - /* If the shader has some side effects and hasn't allowed early - * fragment tests, disable them. - */ - if (!c->s->info.fs.early_fragment_tests && - (c->s->info.num_images || - c->s->info.num_ssbos || - c->s->info.num_abos)) { - prog_data->discard = true; - } } static void @@ -856,6 +844,15 @@ v3d_nir_lower_fs_early(struct v3d_compile *c) { if (c->fs_key->int_color_rb || c->fs_key->uint_color_rb) v3d_fixup_fs_output_types(c); + + /* If the shader has no non-TLB side effects, we can promote it to + * enabling early_fragment_tests even if the user didn't. + */ + if (!(c->s->info.num_images || + c->s->info.num_ssbos || + c->s->info.num_abos)) { + c->s->info.fs.early_fragment_tests = true; + } } static void diff --git a/src/gallium/drivers/v3d/v3dx_draw.c b/src/gallium/drivers/v3d/v3dx_draw.c index 9ca6aaa8f95..60fe745fbd3 100644 --- a/src/gallium/drivers/v3d/v3dx_draw.c +++ b/src/gallium/drivers/v3d/v3dx_draw.c @@ -203,8 +203,13 @@ v3d_emit_gl_shader_state(struct v3d_context *v3d, * shader needs to write the Z value (even just discards). */ shader.fragment_shader_does_z_writes = - (v3d->prog.fs->prog_data.fs->writes_z || - v3d->prog.fs->prog_data.fs->discard); + v3d->prog.fs->prog_data.fs->writes_z; + /* Set if the EZ test must be disabled (due to shader side + * effects and the early_z flag not being present in the + * shader). + */ + shader.turn_off_early_z_test = + v3d->prog.fs->prog_data.fs->disable_ez; shader.fragment_shader_uses_real_pixel_centre_w_in_addition_to_centroid_w2 = v3d->prog.fs->prog_data.fs->uses_center_w; |