From 1f7bdcfa8ddc533e7b2ba9cba8a096cc6ebcae1d Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 27 Jun 2024 16:04:56 +0200 Subject: [PATCH] radv: add a helper that determines if DGC uses task shaders Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_cmd_buffer.c | 6 ++---- .../vulkan/radv_device_generated_commands.c | 19 +++++++++++++++++++ .../vulkan/radv_device_generated_commands.h | 2 ++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index a26783e7b28..b005c899e6d 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -11510,12 +11510,10 @@ static void radv_dgc_after_dispatch(struct radv_cmd_buffer *cmd_buffer); static void radv_dgc_execute_ib(struct radv_cmd_buffer *cmd_buffer, const VkGeneratedCommandsInfoNV *pGeneratedCommandsInfo) { - VK_FROM_HANDLE(radv_indirect_command_layout, layout, pGeneratedCommandsInfo->indirectCommandsLayout); VK_FROM_HANDLE(radv_buffer, prep_buffer, pGeneratedCommandsInfo->preprocessBuffer); - VK_FROM_HANDLE(radv_pipeline, pipeline, pGeneratedCommandsInfo->pipeline); struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); - const bool has_task_shader = layout->pipeline_bind_point == VK_PIPELINE_BIND_POINT_GRAPHICS && - pipeline->shaders[MESA_SHADER_TASK] && false /* TODO: Enable when fully implemented */; + const bool has_task_shader = + radv_dgc_with_task_shader(pGeneratedCommandsInfo) && false /* TODO: Enable when fully implemented */; const uint32_t cmdbuf_size = radv_get_indirect_cmdbuf_size(pGeneratedCommandsInfo); const uint64_t ib_va = diff --git a/src/amd/vulkan/radv_device_generated_commands.c b/src/amd/vulkan/radv_device_generated_commands.c index 9cefc469eb3..1d77a7a68b8 100644 --- a/src/amd/vulkan/radv_device_generated_commands.c +++ b/src/amd/vulkan/radv_device_generated_commands.c @@ -2198,6 +2198,25 @@ radv_GetGeneratedCommandsMemoryRequirementsNV(VkDevice _device, align(cmd_buf_size + upload_buf_size, pMemoryRequirements->memoryRequirements.alignment); } +bool +radv_dgc_with_task_shader(const VkGeneratedCommandsInfoNV *pGeneratedCommandsInfo) +{ + VK_FROM_HANDLE(radv_indirect_command_layout, layout, pGeneratedCommandsInfo->indirectCommandsLayout); + + if (layout->pipeline_bind_point != VK_PIPELINE_BIND_POINT_GRAPHICS) + return false; + + if (!layout->draw_mesh_tasks) + return false; + + VK_FROM_HANDLE(radv_pipeline, pipeline, pGeneratedCommandsInfo->pipeline); + const struct radv_shader *task_shader = radv_get_shader(pipeline->shaders, MESA_SHADER_TASK); + if (!task_shader) + return false; + + return true; +} + bool radv_use_dgc_predication(struct radv_cmd_buffer *cmd_buffer, const VkGeneratedCommandsInfoNV *pGeneratedCommandsInfo) { diff --git a/src/amd/vulkan/radv_device_generated_commands.h b/src/amd/vulkan/radv_device_generated_commands.h index ce48f66e3dc..3408afd0f15 100644 --- a/src/amd/vulkan/radv_device_generated_commands.h +++ b/src/amd/vulkan/radv_device_generated_commands.h @@ -65,6 +65,8 @@ bool radv_use_dgc_predication(struct radv_cmd_buffer *cmd_buffer, bool radv_dgc_can_preprocess(const struct radv_indirect_command_layout *layout, struct radv_pipeline *pipeline); +bool radv_dgc_with_task_shader(const VkGeneratedCommandsInfoNV *pGeneratedCommandsInfo); + void radv_prepare_dgc(struct radv_cmd_buffer *cmd_buffer, const VkGeneratedCommandsInfoNV *pGeneratedCommandsInfo, bool cond_render_enabled);