From 5503ffecfb4fe11e5cca60fbfef156c29196da4b Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 2 Oct 2020 13:12:47 -0400 Subject: [PATCH] zink: add zink_program struct as a base class for compute/gfx structs this is going to be useful for managing descriptors Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_draw.c | 16 +++++++------- src/gallium/drivers/zink/zink_program.c | 28 ++++++++++++------------- src/gallium/drivers/zink/zink_program.h | 19 ++++++++++------- 3 files changed, 33 insertions(+), 30 deletions(-) diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c index 345ff7e19ca..857ae506d5d 100644 --- a/src/gallium/drivers/zink/zink_draw.c +++ b/src/gallium/drivers/zink/zink_draw.c @@ -510,19 +510,19 @@ update_descriptors(struct zink_context *ctx, struct zink_screen *screen, bool is unsigned num_descriptors; VkDescriptorSetLayout dsl; if (is_compute) { - num_descriptors = ctx->curr_compute->num_descriptors; - dsl = ctx->curr_compute->dsl; + num_descriptors = ctx->curr_compute->base.num_descriptors; + dsl = ctx->curr_compute->base.dsl; batch = &ctx->compute_batch; } else { batch = zink_batch_rp(ctx); - num_descriptors = ctx->curr_program->num_descriptors; - dsl = ctx->curr_program->dsl; + num_descriptors = ctx->curr_program->base.num_descriptors; + dsl = ctx->curr_program->base.dsl; } if (is_compute) - zink_batch_reference_program(batch, &ctx->curr_compute->reference); + zink_batch_reference_program(batch, &ctx->curr_compute->base.reference); else - zink_batch_reference_program(batch, &ctx->curr_program->reference); + zink_batch_reference_program(batch, &ctx->curr_program->base.reference); if (batch->descs_used + num_descriptors >= batch->max_descs) { if (is_compute) @@ -769,7 +769,7 @@ zink_draw_vbo(struct pipe_context *pctx, barrier_vertex_buffers(ctx); barrier_draw_buffers(ctx, dinfo, dindirect, index_buffer); - if (gfx_program->num_descriptors) + if (gfx_program->base.num_descriptors) update_descriptors(ctx, screen, false); struct zink_batch *batch = zink_batch_rp(ctx); @@ -971,7 +971,7 @@ zink_launch_grid(struct pipe_context *pctx, const struct pipe_grid_info *info) VkPipeline pipeline = zink_get_compute_pipeline(screen, comp_program, &ctx->compute_pipeline_state); - if (comp_program->num_descriptors) + if (comp_program->base.num_descriptors) update_descriptors(ctx, screen, true); diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 0e863842b1d..68be3d05aed 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -457,7 +457,7 @@ zink_create_gfx_program(struct zink_context *ctx, if (!prog) goto fail; - pipe_reference_init(&prog->reference, 1); + pipe_reference_init(&prog->base.reference, 1); init_slot_map(ctx, prog); @@ -478,12 +478,12 @@ zink_create_gfx_program(struct zink_context *ctx, } } - prog->dsl = create_desc_set_layout(screen->dev, stages, - &prog->num_descriptors); - if (prog->num_descriptors && !prog->dsl) + prog->base.dsl = create_desc_set_layout(screen->dev, stages, + &prog->base.num_descriptors); + if (prog->base.num_descriptors && !prog->base.dsl) goto fail; - prog->layout = create_gfx_pipeline_layout(screen->dev, prog->dsl); + prog->layout = create_gfx_pipeline_layout(screen->dev, prog->base.dsl); if (!prog->layout) goto fail; @@ -540,7 +540,7 @@ zink_create_compute_program(struct zink_context *ctx, struct zink_shader *shader if (!comp) goto fail; - pipe_reference_init(&comp->reference, 1); + pipe_reference_init(&comp->base.reference, 1); if (!ctx->curr_compute || !ctx->curr_compute->shader_cache) { /* TODO: cs shader keys placeholder for now */ @@ -578,12 +578,12 @@ zink_create_compute_program(struct zink_context *ctx, struct zink_shader *shader struct zink_shader *stages[ZINK_SHADER_COUNT] = {}; stages[0] = shader; - comp->dsl = create_desc_set_layout(screen->dev, stages, - &comp->num_descriptors); - if (comp->num_descriptors && !comp->dsl) + comp->base.dsl = create_desc_set_layout(screen->dev, stages, + &comp->base.num_descriptors); + if (comp->base.num_descriptors && !comp->base.dsl) goto fail; - comp->layout = create_compute_pipeline_layout(screen->dev, comp->dsl); + comp->layout = create_compute_pipeline_layout(screen->dev, comp->base.dsl); if (!comp->layout) goto fail; @@ -612,8 +612,8 @@ zink_destroy_gfx_program(struct zink_screen *screen, if (prog->layout) vkDestroyPipelineLayout(screen->dev, prog->layout, NULL); - if (prog->dsl) - vkDestroyDescriptorSetLayout(screen->dev, prog->dsl, NULL); + if (prog->base.dsl) + vkDestroyDescriptorSetLayout(screen->dev, prog->base.dsl, NULL); for (int i = 0; i < ZINK_SHADER_COUNT; ++i) { if (prog->shaders[i]) @@ -643,8 +643,8 @@ zink_destroy_compute_program(struct zink_screen *screen, if (comp->layout) vkDestroyPipelineLayout(screen->dev, comp->layout, NULL); - if (comp->dsl) - vkDestroyDescriptorSetLayout(screen->dev, comp->dsl, NULL); + if (comp->base.dsl) + vkDestroyDescriptorSetLayout(screen->dev, comp->base.dsl, NULL); if (comp->shader) _mesa_set_remove_key(comp->shader->programs, comp); diff --git a/src/gallium/drivers/zink/zink_program.h b/src/gallium/drivers/zink/zink_program.h index 72bea425bbc..2f4b610c022 100644 --- a/src/gallium/drivers/zink/zink_program.h +++ b/src/gallium/drivers/zink/zink_program.h @@ -62,29 +62,32 @@ struct zink_shader_cache { struct hash_table *shader_cache; }; -struct zink_gfx_program { +struct zink_program { struct pipe_reference reference; + VkDescriptorSetLayout dsl; + unsigned num_descriptors; +}; + +struct zink_gfx_program { + struct zink_program base; + struct zink_shader_module *modules[ZINK_SHADER_COUNT]; // compute stage doesn't belong here struct zink_shader *shaders[ZINK_SHADER_COUNT]; struct zink_shader_cache *shader_cache; unsigned char shader_slot_map[VARYING_SLOT_MAX]; unsigned char shader_slots_reserved; - VkDescriptorSetLayout dsl; VkPipelineLayout layout; - unsigned num_descriptors; struct hash_table *pipelines[11]; // number of draw modes we support }; struct zink_compute_program { - struct pipe_reference reference; + struct zink_program base; struct zink_shader_module *module; struct zink_shader *shader; struct zink_shader_cache *shader_cache; - VkDescriptorSetLayout dsl; VkPipelineLayout layout; - unsigned num_descriptors; struct hash_table *pipelines; }; @@ -118,7 +121,7 @@ zink_gfx_program_reference(struct zink_screen *screen, { struct zink_gfx_program *old_dst = dst ? *dst : NULL; - if (pipe_reference_described(old_dst ? &old_dst->reference : NULL, &src->reference, + if (pipe_reference_described(old_dst ? &old_dst->base.reference : NULL, &src->base.reference, (debug_reference_descriptor)debug_describe_zink_gfx_program)) zink_destroy_gfx_program(screen, old_dst); if (dst) *dst = src; @@ -140,7 +143,7 @@ zink_compute_program_reference(struct zink_screen *screen, { struct zink_compute_program *old_dst = dst ? *dst : NULL; - if (pipe_reference_described(old_dst ? &old_dst->reference : NULL, &src->reference, + if (pipe_reference_described(old_dst ? &old_dst->base.reference : NULL, &src->base.reference, (debug_reference_descriptor)debug_describe_zink_compute_program)) zink_destroy_compute_program(screen, old_dst); if (dst) *dst = src;