From 5d8b900369cb7358b2fd7ac624bd7bfe9c4469c2 Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Wed, 25 Mar 2026 22:49:09 +0100 Subject: [PATCH] mesa/st: Extend st_context_invalidate_state with meta-op flags MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add ST_INVALIDATE_* flags for all states that meta-operations (bitmap, clear, drawpixels, etc.) modify behind the state tracker's back. This enables meta-ops to use st_context_invalidate_state() instead of CSO save/restore for state re-derivation. The atoms already know how to re-derive Gallium state from GL context, so marking states dirty via st_context_invalidate_state() is sufficient - st_validate_state() will call the atoms before the next draw. Signed-off-by: Christian Gmeiner Reviewed-by: Marek Olšák Part-of: --- src/gallium/include/frontend/api.h | 14 ++++++++++++++ src/mesa/state_tracker/st_manager.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/src/gallium/include/frontend/api.h b/src/gallium/include/frontend/api.h index e95814ad64a..1cd11c2989a 100644 --- a/src/gallium/include/frontend/api.h +++ b/src/gallium/include/frontend/api.h @@ -99,6 +99,20 @@ enum st_attachment_type { #define ST_INVALIDATE_VS_CONSTBUF0 (1 << 2) #define ST_INVALIDATE_VERTEX_BUFFERS (1 << 3) #define ST_INVALIDATE_FB_STATE (1 << 4) +#define ST_INVALIDATE_VIEWPORT (1 << 5) +#define ST_INVALIDATE_VS_STATE (1 << 6) +#define ST_INVALIDATE_GS_STATE (1 << 7) +#define ST_INVALIDATE_TCS_STATE (1 << 8) +#define ST_INVALIDATE_TES_STATE (1 << 9) +#define ST_INVALIDATE_MESH_STATE (1 << 10) +#define ST_INVALIDATE_RASTERIZER (1 << 11) +#define ST_INVALIDATE_FS_SAMPLERS (1 << 12) +#define ST_INVALIDATE_FS_STATE (1 << 13) +#define ST_INVALIDATE_BLEND (1 << 14) +#define ST_INVALIDATE_DSA (1 << 15) +#define ST_INVALIDATE_SAMPLE_MASK (1 << 16) +#define ST_INVALIDATE_SAMPLE_SHADING (1 << 17) +#define ST_INVALIDATE_FS_IMAGES (1 << 18) /** * Value to pipe_frontend_streen::get_param function. diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c index 733d0da96c2..a42d0c36896 100644 --- a/src/mesa/state_tracker/st_manager.c +++ b/src/mesa/state_tracker/st_manager.c @@ -909,6 +909,34 @@ st_context_invalidate_state(struct st_context *st, unsigned flags) } if (flags & ST_INVALIDATE_FB_STATE) ST_SET_STATE(ctx->NewDriverState, ST_NEW_FB_STATE); + if (flags & ST_INVALIDATE_VIEWPORT) + ST_SET_STATE(ctx->NewDriverState, ST_NEW_VIEWPORT); + if (flags & ST_INVALIDATE_VS_STATE) + ST_SET_STATE(ctx->NewDriverState, ST_NEW_VS_STATE); + if (flags & ST_INVALIDATE_GS_STATE) + ST_SET_STATE(ctx->NewDriverState, ST_NEW_GS_STATE); + if (flags & ST_INVALIDATE_TCS_STATE) + ST_SET_STATE(ctx->NewDriverState, ST_NEW_TCS_STATE); + if (flags & ST_INVALIDATE_TES_STATE) + ST_SET_STATE(ctx->NewDriverState, ST_NEW_TES_STATE); + if (flags & ST_INVALIDATE_MESH_STATE) + ST_SET_STATE(ctx->NewDriverState, ST_NEW_MS_STATE); + if (flags & ST_INVALIDATE_RASTERIZER) + ST_SET_STATE(ctx->NewDriverState, ST_NEW_RASTERIZER); + if (flags & ST_INVALIDATE_FS_SAMPLERS) + ST_SET_STATE2(ctx->NewDriverState, ST_NEW_FS_SAMPLERS, ST_NEW_FS_SAMPLER_VIEWS); + if (flags & ST_INVALIDATE_FS_STATE) + ST_SET_STATE(ctx->NewDriverState, ST_NEW_FS_STATE); + if (flags & ST_INVALIDATE_BLEND) + ST_SET_STATE(ctx->NewDriverState, ST_NEW_BLEND); + if (flags & ST_INVALIDATE_DSA) + ST_SET_STATE(ctx->NewDriverState, ST_NEW_DSA); + if (flags & ST_INVALIDATE_SAMPLE_MASK) + ST_SET_STATE(ctx->NewDriverState, ST_NEW_SAMPLE_STATE); + if (flags & ST_INVALIDATE_SAMPLE_SHADING) + ST_SET_STATE(ctx->NewDriverState, ST_NEW_SAMPLE_SHADING); + if (flags & ST_INVALIDATE_FS_IMAGES) + ST_SET_STATE(ctx->NewDriverState, ST_NEW_FS_IMAGES); }