From a2771967cbcb0e1f6f7bbddd98764f3b940c8826 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 12 Aug 2020 17:01:42 -0400 Subject: [PATCH] zink: add launch_grid pipe_context hook for compute handling we're reusing update_descriptors, so this is trivial Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/gallium/drivers/zink/zink_context.c | 1 + src/gallium/drivers/zink/zink_context.h | 2 ++ src/gallium/drivers/zink/zink_draw.c | 26 +++++++++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 6ab9c6f222b..1d3f06cc8ca 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -1675,6 +1675,7 @@ zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) ctx->base.clear_texture = zink_clear_texture; ctx->base.draw_vbo = zink_draw_vbo; + ctx->base.launch_grid = zink_launch_grid; ctx->base.flush = zink_flush; ctx->base.memory_barrier = zink_memory_barrier; diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h index 644aa01da4c..d7dc6f7449f 100644 --- a/src/gallium/drivers/zink/zink_context.h +++ b/src/gallium/drivers/zink/zink_context.h @@ -259,4 +259,6 @@ zink_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_start_count *draws, unsigned num_draws); +void +zink_launch_grid(struct pipe_context *pctx, const struct pipe_grid_info *info); #endif diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c index 9e97007648f..88c4f8c5820 100644 --- a/src/gallium/drivers/zink/zink_draw.c +++ b/src/gallium/drivers/zink/zink_draw.c @@ -780,3 +780,29 @@ zink_draw_vbo(struct pipe_context *pctx, } batch->has_draw = true; } + +void +zink_launch_grid(struct pipe_context *pctx, const struct pipe_grid_info *info) +{ + struct zink_context *ctx = zink_context(pctx); + struct zink_screen *screen = zink_screen(pctx->screen); + struct zink_batch *batch = &ctx->compute_batch; + struct zink_compute_program *comp_program = get_compute_program(ctx); + if (!comp_program) + return; + + VkPipeline pipeline = zink_get_compute_pipeline(screen, comp_program, + &ctx->compute_pipeline_state); + + update_descriptors(ctx, screen, true); + + + vkCmdBindPipeline(batch->cmdbuf, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline); + + if (info->indirect) { + vkCmdDispatchIndirect(batch->cmdbuf, zink_resource(info->indirect)->buffer, info->indirect_offset); + zink_batch_reference_resource_rw(batch, zink_resource(info->indirect), false); + } else + vkCmdDispatch(batch->cmdbuf, info->grid[0], info->grid[1], info->grid[2]); + batch->has_draw = true; +}