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:
@@ -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
|
||||
|
@@ -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;
|
||||
};
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user