From 380bf224dcde3bad2c4da3e76cdc6c292828123a Mon Sep 17 00:00:00 2001 From: Simon Perretta Date: Mon, 3 Feb 2025 14:26:47 +0000 Subject: [PATCH] pco, pvr: account for early frag testing Signed-off-by: Simon Perretta Acked-by: Erik Faye-Lund Part-of: --- src/imagination/pco/pco_data.h | 1 + src/imagination/pco/pco_nir.c | 1 + src/imagination/pco/pco_trans_nir.c | 8 +++++++- src/imagination/vulkan/pvr_pipeline.c | 2 +- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/imagination/pco/pco_data.h b/src/imagination/pco/pco_data.h index cb77e3d7407..59430732fef 100644 --- a/src/imagination/pco/pco_data.h +++ b/src/imagination/pco/pco_data.h @@ -87,6 +87,7 @@ typedef struct _pco_fs_data { bool fbfetch; /** Whether the shader fetches from the framebuffer. */ bool depth_feedback; bool discard; + bool early_frag; } uses; } pco_fs_data; diff --git a/src/imagination/pco/pco_nir.c b/src/imagination/pco/pco_nir.c index 79cb45ea29a..40bda67b80b 100644 --- a/src/imagination/pco/pco_nir.c +++ b/src/imagination/pco/pco_nir.c @@ -237,6 +237,7 @@ static void gather_fs_data(nir_shader *nir, pco_data *data) } data->fs.uses.fbfetch = nir->info.fs.uses_fbfetch_output; + data->fs.uses.early_frag = nir->info.fs.early_fragment_tests; } /** diff --git a/src/imagination/pco/pco_trans_nir.c b/src/imagination/pco/pco_trans_nir.c index 055e957cc81..481102d3850 100644 --- a/src/imagination/pco/pco_trans_nir.c +++ b/src/imagination/pco/pco_trans_nir.c @@ -1317,7 +1317,13 @@ static pco_instr *trans_intr(trans_ctx *tctx, nir_intrinsic_instr *intr) break; case nir_intrinsic_depthf_pco: - instr = pco_depthf(&tctx->b, pco_ref_drc(PCO_DRC_0), src[0]); + assert(tctx->stage == MESA_SHADER_FRAGMENT); + if (tctx->shader->data.fs.uses.depth_feedback && + !tctx->shader->data.fs.uses.early_frag) { + instr = pco_depthf(&tctx->b, pco_ref_drc(PCO_DRC_0), src[0]); + } else { + return NULL; + } break; case nir_intrinsic_terminate: diff --git a/src/imagination/vulkan/pvr_pipeline.c b/src/imagination/vulkan/pvr_pipeline.c index 687c2936370..9e24df5e571 100644 --- a/src/imagination/vulkan/pvr_pipeline.c +++ b/src/imagination/vulkan/pvr_pipeline.c @@ -1232,7 +1232,7 @@ static void pvr_fragment_state_save(struct pvr_graphics_pipeline *gfx_pipeline, /* TODO: add selection for other values of pass type and sample rate. */ - if (shader_data->fs.uses.depth_feedback) + if (shader_data->fs.uses.depth_feedback && !shader_data->fs.uses.early_frag) fragment_state->pass_type = ROGUE_TA_PASSTYPE_DEPTH_FEEDBACK; else if (shader_data->fs.uses.discard) fragment_state->pass_type = ROGUE_TA_PASSTYPE_PUNCH_THROUGH;