mesa/st: Extend st_context_invalidate_state with meta-op flags

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 <cgmeiner@igalia.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40592>
This commit is contained in:
Christian Gmeiner 2026-03-25 22:49:09 +01:00 committed by Marge Bot
parent c4bd6bd590
commit 5d8b900369
2 changed files with 42 additions and 0 deletions

View file

@ -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.

View file

@ -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);
}