gallium/u_blitter: save mesh shader

Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36976>
This commit is contained in:
Qiang Yu 2025-05-07 09:49:16 +08:00
parent 5e35be338c
commit e1bd743c3a
2 changed files with 33 additions and 0 deletions

View file

@ -137,6 +137,7 @@ struct blitter_context_priv
void *custom_vs;
bool has_mesh_shader;
bool has_geometry_shader;
bool has_tessellation;
bool has_layered;
@ -183,6 +184,8 @@ struct blitter_context *util_blitter_create(struct pipe_context *pipe)
ctx->base.saved_fs = INVALID_PTR;
ctx->base.saved_vs = INVALID_PTR;
ctx->base.saved_gs = INVALID_PTR;
ctx->base.saved_ts = INVALID_PTR;
ctx->base.saved_ms = INVALID_PTR;
ctx->base.saved_velem_state = INVALID_PTR;
ctx->base.saved_fb_state.nr_cbufs = ~0;
ctx->base.saved_num_sampler_views = ~0;
@ -195,6 +198,9 @@ struct blitter_context *util_blitter_create(struct pipe_context *pipe)
ctx->has_tessellation =
pipe->screen->shader_caps[MESA_SHADER_TESS_CTRL].max_instructions > 0;
ctx->has_mesh_shader =
pipe->screen->shader_caps[MESA_SHADER_MESH].max_instructions > 0;
ctx->has_stream_out = pipe->screen->caps.max_stream_output_buffers != 0;
ctx->has_stencil_export = pipe->screen->caps.shader_stencil_export;
@ -600,6 +606,14 @@ void util_blitter_restore_vertex_states(struct blitter_context *blitter)
ctx->base.saved_tes = INVALID_PTR;
}
/* Driver like llvmpipe may not need to save mesh shader state. */
if (ctx->has_mesh_shader && ctx->base.saved_ms != INVALID_PTR) {
pipe->bind_ts_state(pipe, ctx->base.saved_ts);
pipe->bind_ms_state(pipe, ctx->base.saved_ms);
ctx->base.saved_ts = INVALID_PTR;
ctx->base.saved_ms = INVALID_PTR;
}
/* Stream outputs. */
if (ctx->has_stream_out) {
unsigned offsets[PIPE_MAX_SO_BUFFERS];
@ -1343,6 +1357,10 @@ static void blitter_set_common_draw_rect_state(struct blitter_context_priv *ctx,
pipe->bind_tcs_state(pipe, NULL);
pipe->bind_tes_state(pipe, NULL);
}
if (ctx->has_mesh_shader && ctx->base.saved_ms != INVALID_PTR) {
pipe->bind_ts_state(pipe, NULL);
pipe->bind_ms_state(pipe, NULL);
}
if (ctx->has_stream_out)
pipe->set_stream_output_targets(pipe, 0, NULL, NULL, 0);
}

View file

@ -107,6 +107,7 @@ struct blitter_context
void *saved_velem_state; /**< vertex elements state */
void *saved_rs_state; /**< rasterizer state */
void *saved_fs, *saved_vs, *saved_gs, *saved_tcs, *saved_tes; /**< shaders */
void *saved_ts, *saved_ms;
struct pipe_framebuffer_state saved_fb_state; /**< framebuffer state */
struct pipe_stencil_ref saved_stencil_ref; /**< stencil ref */
@ -485,6 +486,20 @@ util_blitter_save_tesseval_shader(struct blitter_context *blitter,
blitter->saved_tes = sh;
}
static inline void
util_blitter_save_task_shader(struct blitter_context *blitter,
void *sh)
{
blitter->saved_ts = sh;
}
static inline void
util_blitter_save_mesh_shader(struct blitter_context *blitter,
void *sh)
{
blitter->saved_ms = sh;
}
static inline void
util_blitter_save_framebuffer(struct blitter_context *blitter,
const struct pipe_framebuffer_state *state)