From 5f1b0f4b48af90fbfc625f1838e821f434891f26 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Tue, 7 Jul 2020 18:10:00 +0200 Subject: [PATCH] radv: adjust IA_MULTI_VGT_PARAM.WD_SWITCH_ON_EOP at draw time In preparation for the dynamic topology state. Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/amd/vulkan/radv_pipeline.c | 17 ----------------- src/amd/vulkan/radv_private.h | 1 - src/amd/vulkan/si_cmd_buffer.c | 15 ++++++++++++++- 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index 52a882297df..a970c9ef66d 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -4684,23 +4684,6 @@ radv_compute_ia_multi_vgt_param_helpers(struct radv_pipeline *pipeline, if (SI_GS_PER_ES / ia_multi_vgt_param.primgroup_size >= pipeline->device->gs_table_depth - 3) ia_multi_vgt_param.partial_es_wave = true; - ia_multi_vgt_param.wd_switch_on_eop = false; - if (device->physical_device->rad_info.chip_class >= GFX7) { - /* WD_SWITCH_ON_EOP has no effect on GPUs with less than - * 4 shader engines. Set 1 to pass the assertion below. - * The other cases are hardware requirements. */ - if (device->physical_device->rad_info.max_se < 4 || - prim == V_008958_DI_PT_POLYGON || - prim == V_008958_DI_PT_LINELOOP || - prim == V_008958_DI_PT_TRIFAN || - prim == V_008958_DI_PT_TRISTRIP_ADJ || - (pipeline->graphics.prim_restart_enable && - (device->physical_device->rad_info.family < CHIP_POLARIS10 || - (prim != V_008958_DI_PT_POINTLIST && - prim != V_008958_DI_PT_LINESTRIP)))) - ia_multi_vgt_param.wd_switch_on_eop = true; - } - ia_multi_vgt_param.ia_switch_on_eoi = false; if (pipeline->shaders[MESA_SHADER_FRAGMENT]->info.ps.prim_id_input) ia_multi_vgt_param.ia_switch_on_eoi = true; diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 52790aea23c..0fe611b068d 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -1635,7 +1635,6 @@ struct radv_ia_multi_vgt_param_helpers { uint32_t base; bool partial_es_wave; uint8_t primgroup_size; - bool wd_switch_on_eop; bool ia_switch_on_eoi; bool partial_vs_wave; }; diff --git a/src/amd/vulkan/si_cmd_buffer.c b/src/amd/vulkan/si_cmd_buffer.c index 4b73bc513b5..c3ac17a87e2 100644 --- a/src/amd/vulkan/si_cmd_buffer.c +++ b/src/amd/vulkan/si_cmd_buffer.c @@ -705,6 +705,7 @@ si_get_ia_multi_vgt_param(struct radv_cmd_buffer *cmd_buffer, bool ia_switch_on_eoi = false; bool partial_vs_wave = false; bool partial_es_wave = cmd_buffer->state.pipeline->graphics.ia_multi_vgt_param.partial_es_wave; + unsigned topology = cmd_buffer->state.pipeline->graphics.topology; bool multi_instances_smaller_than_primgroup; multi_instances_smaller_than_primgroup = indirect_draw; @@ -718,7 +719,19 @@ si_get_ia_multi_vgt_param(struct radv_cmd_buffer *cmd_buffer, partial_vs_wave = cmd_buffer->state.pipeline->graphics.ia_multi_vgt_param.partial_vs_wave; if (chip_class >= GFX7) { - wd_switch_on_eop = cmd_buffer->state.pipeline->graphics.ia_multi_vgt_param.wd_switch_on_eop; + /* WD_SWITCH_ON_EOP has no effect on GPUs with less than + * 4 shader engines. Set 1 to pass the assertion below. + * The other cases are hardware requirements. */ + if (cmd_buffer->device->physical_device->rad_info.max_se < 4 || + topology == V_008958_DI_PT_POLYGON || + topology == V_008958_DI_PT_LINELOOP || + topology == V_008958_DI_PT_TRIFAN || + topology == V_008958_DI_PT_TRISTRIP_ADJ || + (cmd_buffer->state.pipeline->graphics.prim_restart_enable && + (cmd_buffer->device->physical_device->rad_info.family < CHIP_POLARIS10 || + (topology != V_008958_DI_PT_POINTLIST && + topology != V_008958_DI_PT_LINESTRIP)))) + wd_switch_on_eop = true; /* Hawaii hangs if instancing is enabled and WD_SWITCH_ON_EOP is 0. * We don't know that for indirect drawing, so treat it as -- 2.30.2