aco: Setup correct HW stages when tessellation is used.
authorTimur Kristóf <timur.kristof@gmail.com>
Wed, 12 Feb 2020 14:33:02 +0000 (15:33 +0100)
committerMarge Bot <eric+marge@anholt.net>
Wed, 11 Mar 2020 08:34:10 +0000 (08:34 +0000)
Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3964>

src/amd/compiler/aco_instruction_selection_setup.cpp
src/amd/compiler/aco_ir.h

index 9005c7075865a54d71a9779acd4472b0ad718498..5d6fd1b9f531c9919e3beea62e06a34fd8a4a864 100644 (file)
@@ -1038,6 +1038,18 @@ setup_isel_context(Program* program,
       program->stage |= hw_vs;
    else if (program->stage == (sw_vs | sw_gs) && gfx9_plus && !ngg)
       program->stage |= hw_gs;
+   else if (program->stage == sw_vs && args->shader_info->vs.as_ls)
+      program->stage |= hw_ls; /* GFX6-8: VS is a Local Shader, when tessellation is used */
+   else if (program->stage == sw_tcs)
+      program->stage |= hw_hs; /* GFX6-8: TCS is a Hull Shader */
+   else if (program->stage == (sw_vs | sw_tcs))
+      program->stage |= hw_hs; /* GFX9-10: VS+TCS merged into a Hull Shader */
+   else if (program->stage == sw_tes && !args->shader_info->tes.as_es && !ngg)
+      program->stage |= hw_vs; /* GFX6-9: TES without GS uses the HW VS stage (and GFX10/legacy) */
+   else if (program->stage == sw_tes && args->shader_info->tes.as_es && !ngg)
+      program->stage |= hw_es; /* GFX6-8: TES is an Export Shader */
+   else if (program->stage == (sw_tes | sw_gs) && gfx9_plus && !ngg)
+      program->stage |= hw_gs; /* GFX9: TES+GS merged into a GS (and GFX10/legacy) */
    else
       unreachable("Shader stage not implemented");
 
index 889c594634ded50e66a01558f816da2be65a4f87..2d5e59c3e2bf20f49a4842755a7e8e0ed4c05e7d 100644 (file)
@@ -1142,7 +1142,7 @@ static constexpr Stage tess_eval_geometry_gs = sw_tes | sw_gs | hw_gs;
 static constexpr Stage vertex_ls = sw_vs | hw_ls; /* vertex before tesselation control */
 static constexpr Stage vertex_es = sw_vs | hw_es; /* vertex before geometry */
 static constexpr Stage tess_control_hs = sw_tcs | hw_hs;
-static constexpr Stage tess_eval_es = sw_tes | hw_gs; /* tesselation evaluation before geometry */
+static constexpr Stage tess_eval_es = sw_tes | hw_es; /* tesselation evaluation before geometry */
 static constexpr Stage geometry_gs = sw_gs | hw_gs;
 
 class Program final {