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 <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9273>
This commit is contained in:
Mike Blumenkrantz
2020-10-02 13:12:47 -04:00
committed by Marge Bot
parent 50ca42dc43
commit 5503ffecfb
3 changed files with 33 additions and 30 deletions

View File

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

View File

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

View File

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