From 303e06b19df75c2801ad22055ec638a9ad51e0fc Mon Sep 17 00:00:00 2001 From: antonino Date: Wed, 8 Mar 2023 17:30:10 +0100 Subject: [PATCH] zink: improve generated gs unbinding Avoid looping by using the new `parent` field to check if a generaetd gs is bound and use `bind_gs_state` insted of `bind_gfx_stage` so that `bind_last_vertex_stage` is automatically called Reviewed-by: Mike Blumenkrantz Reviewed-by: Erik Faye-Lund Part-of: --- src/gallium/drivers/zink/zink_compiler.c | 10 +++++----- src/gallium/drivers/zink/zink_program.c | 23 +++++++++-------------- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index e15967f83b8..4bc175afcff 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -4746,11 +4746,11 @@ zink_shader_free(struct zink_screen *screen, struct zink_shader *shader) /* only remove generated tcs during parent tes destruction */ if (stage == MESA_SHADER_TESS_EVAL && shader->non_fs.generated_tcs) prog->shaders[MESA_SHADER_TESS_CTRL] = NULL; - for (unsigned int i = 0; i < ARRAY_SIZE(shader->non_fs.generated_gs); i++) { - for (int j = 0; j < ARRAY_SIZE(shader->non_fs.generated_gs[0]); j++) { - if (stage != MESA_SHADER_FRAGMENT && shader->non_fs.generated_gs[i][j]) - prog->shaders[MESA_SHADER_GEOMETRY] = NULL; - } + if (stage != MESA_SHADER_FRAGMENT && + prog->shaders[MESA_SHADER_GEOMETRY] && + prog->shaders[MESA_SHADER_GEOMETRY]->non_fs.parent == + shader) { + prog->shaders[MESA_SHADER_GEOMETRY] = NULL; } zink_gfx_program_reference(screen, &prog, NULL); } diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 1b138aec8da..f6f6f8f9f90 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -1579,17 +1579,12 @@ unbind_generated_gs(struct zink_context *ctx, gl_shader_stage stage, struct zink if (ctx->gfx_stages[stage]->non_fs.is_generated) ctx->inlinable_uniforms_valid_mask &= ~BITFIELD_BIT(MESA_SHADER_GEOMETRY); - for (int i = 0; i < ARRAY_SIZE(shader->non_fs.generated_gs); i++) { - for (int j = 0; j < ARRAY_SIZE(shader->non_fs.generated_gs[0]); j++) { - if (ctx->gfx_stages[stage]->non_fs.generated_gs[i][j] && - ctx->gfx_stages[MESA_SHADER_GEOMETRY] == - ctx->gfx_stages[stage]->non_fs.generated_gs[i][j]) { - assert(stage != MESA_SHADER_GEOMETRY); /* let's not keep recursing! */ - bind_gfx_stage(ctx, MESA_SHADER_GEOMETRY, NULL); - ctx->is_generated_gs_bound = false; - ctx->inlinable_uniforms_valid_mask &= ~BITFIELD_BIT(MESA_SHADER_GEOMETRY); - } - } + if (ctx->gfx_stages[MESA_SHADER_GEOMETRY] && + ctx->gfx_stages[MESA_SHADER_GEOMETRY]->non_fs.parent == + ctx->gfx_stages[stage]) { + ctx->base.bind_gs_state(&ctx->base, NULL); + ctx->is_generated_gs_bound = false; + ctx->inlinable_uniforms_valid_mask &= ~BITFIELD_BIT(MESA_SHADER_GEOMETRY); } } @@ -2335,8 +2330,8 @@ zink_set_primitive_emulation_keys(struct zink_context *ctx) shader->sinfo.so_info = ctx->gfx_stages[prev_vertex_stage]->sinfo.so_info; } - bind_gfx_stage(ctx, MESA_SHADER_GEOMETRY, - ctx->gfx_stages[prev_vertex_stage]->non_fs.generated_gs[ctx->gfx_pipeline_state.gfx_prim_mode][zink_prim_type]); + ctx->base.bind_gs_state(&ctx->base, + ctx->gfx_stages[prev_vertex_stage]->non_fs.generated_gs[ctx->gfx_pipeline_state.gfx_prim_mode][zink_prim_type]); ctx->is_generated_gs_bound = true; } @@ -2345,5 +2340,5 @@ zink_set_primitive_emulation_keys(struct zink_context *ctx) ctx->gfx_pipeline_state.dyn_state3.pv_last}); } else if (ctx->gfx_stages[MESA_SHADER_GEOMETRY] && ctx->gfx_stages[MESA_SHADER_GEOMETRY]->non_fs.is_generated) - bind_gfx_stage(ctx, MESA_SHADER_GEOMETRY, NULL); + ctx->base.bind_gs_state(&ctx->base, NULL); }