From aa2c2092604c1922ee9781ce6dc512471be6f966 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 17 May 2023 12:11:33 +1000 Subject: [PATCH] lavapipe: add execution backends for mesh shader draw apis This binds the mesh draw apis to the gallium backend ones. Reviewed-by: Mike Blumenkrantz Reviewed-by: Roland Scheidegger Part-of: --- src/gallium/frontends/lavapipe/lvp_execute.c | 52 +++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c index d0fba8807ec..b06dd2a2fd0 100644 --- a/src/gallium/frontends/lavapipe/lvp_execute.c +++ b/src/gallium/frontends/lavapipe/lvp_execute.c @@ -4146,6 +4146,42 @@ handle_shaders(struct vk_cmd_queue_entry *cmd, struct rendering_state *state) } } +static void handle_draw_mesh_tasks(struct vk_cmd_queue_entry *cmd, + struct rendering_state *state) +{ + state->dispatch_info.grid[0] = cmd->u.draw_mesh_tasks_ext.group_count_x; + state->dispatch_info.grid[1] = cmd->u.draw_mesh_tasks_ext.group_count_y; + state->dispatch_info.grid[2] = cmd->u.draw_mesh_tasks_ext.group_count_z; + state->dispatch_info.grid_base[0] = 0; + state->dispatch_info.grid_base[1] = 0; + state->dispatch_info.grid_base[2] = 0; + state->dispatch_info.draw_count = 1; + state->dispatch_info.indirect = NULL; + state->pctx->draw_mesh_tasks(state->pctx, &state->dispatch_info); +} + +static void handle_draw_mesh_tasks_indirect(struct vk_cmd_queue_entry *cmd, + struct rendering_state *state) +{ + state->dispatch_info.indirect = lvp_buffer_from_handle(cmd->u.draw_mesh_tasks_indirect_ext.buffer)->bo; + state->dispatch_info.indirect_offset = cmd->u.draw_mesh_tasks_indirect_ext.offset; + state->dispatch_info.indirect_stride = cmd->u.draw_mesh_tasks_indirect_ext.stride; + state->dispatch_info.draw_count = cmd->u.draw_mesh_tasks_indirect_ext.draw_count; + state->pctx->draw_mesh_tasks(state->pctx, &state->dispatch_info); +} + +static void handle_draw_mesh_tasks_indirect_count(struct vk_cmd_queue_entry *cmd, + struct rendering_state *state) +{ + state->dispatch_info.indirect = lvp_buffer_from_handle(cmd->u.draw_mesh_tasks_indirect_count_ext.buffer)->bo; + state->dispatch_info.indirect_offset = cmd->u.draw_mesh_tasks_indirect_count_ext.offset; + state->dispatch_info.indirect_stride = cmd->u.draw_mesh_tasks_indirect_count_ext.stride; + state->dispatch_info.draw_count = cmd->u.draw_mesh_tasks_indirect_count_ext.max_draw_count; + state->dispatch_info.indirect_draw_count_offset = cmd->u.draw_mesh_tasks_indirect_count_ext.count_buffer_offset; + state->dispatch_info.indirect_draw_count = lvp_buffer_from_handle(cmd->u.draw_mesh_tasks_indirect_count_ext.count_buffer)->bo; + state->pctx->draw_mesh_tasks(state->pctx, &state->dispatch_info); +} + void lvp_add_enqueue_cmd_entrypoints(struct vk_device_dispatch_table *disp) { struct vk_device_dispatch_table cmd_enqueue_dispatch; @@ -4266,7 +4302,9 @@ void lvp_add_enqueue_cmd_entrypoints(struct vk_device_dispatch_table *disp) ENQUEUE_CMD(CmdSetViewportSwizzleNV) ENQUEUE_CMD(CmdSetViewportWScalingEnableNV) ENQUEUE_CMD(CmdSetAttachmentFeedbackLoopEnableEXT) - + ENQUEUE_CMD(CmdDrawMeshTasksEXT) + ENQUEUE_CMD(CmdDrawMeshTasksIndirectEXT) + ENQUEUE_CMD(CmdDrawMeshTasksIndirectCountEXT) #undef ENQUEUE_CMD } @@ -4586,6 +4624,18 @@ static void lvp_execute_cmd_buffer(struct lvp_cmd_buffer *cmd_buffer, break; case VK_CMD_SET_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT: break; + case VK_CMD_DRAW_MESH_TASKS_EXT: + emit_state(state); + handle_draw_mesh_tasks(cmd, state); + break; + case VK_CMD_DRAW_MESH_TASKS_INDIRECT_EXT: + emit_state(state); + handle_draw_mesh_tasks_indirect(cmd, state); + break; + case VK_CMD_DRAW_MESH_TASKS_INDIRECT_COUNT_EXT: + emit_state(state); + handle_draw_mesh_tasks_indirect_count(cmd, state); + break; default: fprintf(stderr, "Unsupported command %s\n", vk_cmd_queue_type_names[cmd->type]); unreachable("Unsupported command");