hk: fix passthrough GS key invalidation

Just seeing that a passthrough GS was already bound is not sufficient to
know that it is a *matching* passthrough GS. If the application binds a
new VS that requires a different passthrough GS key than the previous
VS, then we need to bind a different passthrough GS.

Fixes: 5bc8284816 ("hk: add Vulkan driver for Apple GPUs")
Signed-off-by: Olivia Lee <olivia.lee@collabora.com>
Reviewed-by: Mary Guillemard <mary@mary.zone>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39624>
This commit is contained in:
Olivia Lee 2026-01-28 23:52:35 -08:00 committed by Marge Bot
parent dfa9df7cfd
commit e10f29399f

View file

@ -3213,6 +3213,9 @@ hk_handle_passthrough_gs(struct hk_cmd_buffer *cmd, struct agx_draw draw)
struct hk_graphics_state *gfx = &cmd->state.gfx;
struct hk_api_shader *gs = gfx->shaders[MESA_SHADER_GEOMETRY];
if (!IS_SHADER_DIRTY(VERTEX) && !IS_SHADER_DIRTY(GEOMETRY))
return;
/* If there's an application geometry shader, there's nothing to un/bind */
if (gs && !gs->is_passthrough)
return;
@ -3222,12 +3225,8 @@ hk_handle_passthrough_gs(struct hk_cmd_buffer *cmd, struct agx_draw draw)
uint32_t xfb_outputs = last_sw->info.xfb_info.output_count;
bool needs_gs = xfb_outputs;
/* If we already have a matching GS configuration, we're done */
if ((gs != NULL) == needs_gs)
return;
/* If we don't need a GS but we do have a passthrough, unbind it */
if (gs) {
if (!needs_gs && gs != NULL) {
assert(!needs_gs && gs->is_passthrough);
hk_cmd_bind_graphics_shader(cmd, MESA_SHADER_GEOMETRY, NULL);
return;