From ebd5504f73577818bd21fa81bb85c7faec18c3e2 Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Fri, 8 Aug 2025 11:21:11 +0200 Subject: [PATCH] etnaviv: Support hw based rasterizer_discard Add native hardware support for rasterizer_discard on GPU cores that support the HWTFB (Hardware Transform Feedback) feature. This moves rasterizer discard handling from software clipping to dedicated hardware state. Passes all dEQP-GLES3.functional.rasterizer_discard.* with HWTFB. Signed-off-by: Christian Gmeiner Part-of: --- src/gallium/drivers/etnaviv/etnaviv_emit.c | 5 +++++ src/gallium/drivers/etnaviv/etnaviv_rasterizer.c | 2 ++ src/gallium/drivers/etnaviv/etnaviv_rasterizer.h | 1 + src/gallium/drivers/etnaviv/etnaviv_state.c | 3 ++- 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/etnaviv/etnaviv_emit.c b/src/gallium/drivers/etnaviv/etnaviv_emit.c index 3bbf7e1d728..8d5890c096a 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_emit.c +++ b/src/gallium/drivers/etnaviv/etnaviv_emit.c @@ -606,6 +606,11 @@ etna_emit_state(struct etna_context *ctx) } } + if (unlikely(VIV_FEATURE(screen, ETNA_FEATURE_HWTFB) && + (dirty & ETNA_DIRTY_RASTERIZER))) { + /*1C000*/ EMIT_STATE(TFB_CONFIG, etna_rasterizer_state(ctx->rasterizer)->TFB_CONFIG); + } + etna_coalesce_end(stream, &coalesce); /* end only EMIT_STATE */ diff --git a/src/gallium/drivers/etnaviv/etnaviv_rasterizer.c b/src/gallium/drivers/etnaviv/etnaviv_rasterizer.c index af0b289244d..2cee2db5e47 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_rasterizer.c +++ b/src/gallium/drivers/etnaviv/etnaviv_rasterizer.c @@ -75,6 +75,8 @@ etna_rasterizer_state_create(struct pipe_context *pctx, cs->offset_units = 0.0f; } + cs->TFB_CONFIG = COND(so->rasterizer_discard, VIVS_TFB_CONFIG_RASTERIZER_DISCARD); + assert(!so->clip_halfz); /* could be supported with shader magic, actually D3D z is default on older gc */ diff --git a/src/gallium/drivers/etnaviv/etnaviv_rasterizer.h b/src/gallium/drivers/etnaviv/etnaviv_rasterizer.h index e7b39c58a01..a43a6c0983e 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_rasterizer.h +++ b/src/gallium/drivers/etnaviv/etnaviv_rasterizer.h @@ -38,6 +38,7 @@ struct etna_rasterizer_state { uint32_t PA_POINT_SIZE; uint32_t PA_SYSTEM_MODE; uint32_t SE_DEPTH_SCALE; + uint32_t TFB_CONFIG; float offset_units; uint32_t SE_CONFIG; bool point_size_per_vertex; diff --git a/src/gallium/drivers/etnaviv/etnaviv_state.c b/src/gallium/drivers/etnaviv/etnaviv_state.c index 7d3eee9dcc1..53166c80a7c 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_state.c +++ b/src/gallium/drivers/etnaviv/etnaviv_state.c @@ -812,7 +812,8 @@ etna_update_clipping(struct etna_context *ctx) const struct etna_rasterizer_state *rasterizer = etna_rasterizer_state(ctx->rasterizer); const struct pipe_framebuffer_state *fb = &ctx->framebuffer_s; - if (ctx->rasterizer->rasterizer_discard) { + if (!VIV_FEATURE(ctx->screen, ETNA_FEATURE_HWTFB) && + ctx->rasterizer->rasterizer_discard) { ctx->clipping.minx = 0; ctx->clipping.miny = 0; ctx->clipping.maxx = 0;