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)] =
|
inst->src[vir_get_implicit_uniform_src(inst)] =
|
||||||
vir_uniform_ui(c, tlb_specifier | 0xffffff00);
|
vir_uniform_ui(c, tlb_specifier | 0xffffff00);
|
||||||
|
c->writes_z = true;
|
||||||
} else if (c->s->info.fs.uses_discard ||
|
} else if (c->s->info.fs.uses_discard ||
|
||||||
|
!c->s->info.fs.early_fragment_tests ||
|
||||||
c->fs_key->sample_alpha_to_coverage ||
|
c->fs_key->sample_alpha_to_coverage ||
|
||||||
!has_any_tlb_color_write) {
|
!has_any_tlb_color_write) {
|
||||||
/* Emit passthrough Z if it needed to be delayed until shader
|
/* 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)] =
|
inst->src[vir_get_implicit_uniform_src(inst)] =
|
||||||
vir_uniform_ui(c, tlb_specifier | 0xffffff00);
|
vir_uniform_ui(c, tlb_specifier | 0xffffff00);
|
||||||
|
c->writes_z = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX: Performance improvement: Merge Z write and color writes TLB
|
/* 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)];
|
uint32_t centroid_flags[BITSET_WORDS(V3D_MAX_FS_INPUTS)];
|
||||||
|
|
||||||
bool uses_center_w;
|
bool uses_center_w;
|
||||||
|
bool writes_z;
|
||||||
|
|
||||||
struct v3d_ubo_range *ubo_ranges;
|
struct v3d_ubo_range *ubo_ranges;
|
||||||
bool *ubo_range_used;
|
bool *ubo_range_used;
|
||||||
@@ -717,7 +718,7 @@ struct v3d_fs_prog_data {
|
|||||||
uint32_t centroid_flags[((V3D_MAX_FS_INPUTS - 1) / 24) + 1];
|
uint32_t centroid_flags[((V3D_MAX_FS_INPUTS - 1) / 24) + 1];
|
||||||
|
|
||||||
bool writes_z;
|
bool writes_z;
|
||||||
bool discard;
|
bool disable_ez;
|
||||||
bool uses_center_w;
|
bool uses_center_w;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -745,21 +745,9 @@ v3d_fs_set_prog_data(struct v3d_compile *c,
|
|||||||
struct v3d_fs_prog_data *prog_data)
|
struct v3d_fs_prog_data *prog_data)
|
||||||
{
|
{
|
||||||
v3d_set_fs_prog_data_inputs(c, prog_data);
|
v3d_set_fs_prog_data_inputs(c, prog_data);
|
||||||
prog_data->writes_z = (c->s->info.outputs_written &
|
prog_data->writes_z = c->writes_z;
|
||||||
(1 << FRAG_RESULT_DEPTH));
|
prog_data->disable_ez = !c->s->info.fs.early_fragment_tests;
|
||||||
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;
|
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
|
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)
|
if (c->fs_key->int_color_rb || c->fs_key->uint_color_rb)
|
||||||
v3d_fixup_fs_output_types(c);
|
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
|
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 needs to write the Z value (even just discards).
|
||||||
*/
|
*/
|
||||||
shader.fragment_shader_does_z_writes =
|
shader.fragment_shader_does_z_writes =
|
||||||
(v3d->prog.fs->prog_data.fs->writes_z ||
|
v3d->prog.fs->prog_data.fs->writes_z;
|
||||||
v3d->prog.fs->prog_data.fs->discard);
|
/* 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 =
|
shader.fragment_shader_uses_real_pixel_centre_w_in_addition_to_centroid_w2 =
|
||||||
v3d->prog.fs->prog_data.fs->uses_center_w;
|
v3d->prog.fs->prog_data.fs->uses_center_w;
|
||||||
|
Reference in New Issue
Block a user