v3d: Use the early_fragment_tests flag for the shader's disable-EZ field.

Apparently we need disable-EZ flagged, not just "does Z writes".

Fixes
dEQP-GLES31.functional.image_load_store.early_fragment_tests.no_early_fragment_tests_depth_fbo
on 7278, even though it passed in simulation.

Signed-off-by: Eric Anholt <eric@anholt.net>
Fixes: 051a41d3d5 ("v3d: Add support for the early_fragment_tests flag.")
This commit is contained in:
Eric Anholt
2019-02-12 14:39:40 -08:00
parent 332b969c4e
commit cd5e0b2729
4 changed files with 23 additions and 17 deletions

View File

@@ -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

View File

@@ -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;
};

View File

@@ -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

View File

@@ -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;