radv: copy linked I/O info for merged stages in radv_fill_shader_info
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Wed, 17 Aug 2022 14:57:33 +0000 (16:57 +0200)
committerMarge Bot <emma+marge@anholt.net>
Mon, 22 Aug 2022 13:45:28 +0000 (13:45 +0000)
To copy info to merged stage at the same place.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Reviewed-by: Timur Kristóf <timur.kristof@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18138>

src/amd/vulkan/radv_pipeline.c

index 84d9917..1f18afd 100644 (file)
@@ -2831,8 +2831,6 @@ static void
 radv_set_driver_locations(struct radv_pipeline *pipeline, struct radv_pipeline_stage *stages,
                           gl_shader_stage last_vgt_api_stage)
 {
-   const struct radv_physical_device *pdevice = pipeline->device->physical_device;
-
    if (stages[MESA_SHADER_FRAGMENT].nir) {
       nir_foreach_shader_out_variable(var, stages[MESA_SHADER_FRAGMENT].nir)
       {
@@ -2856,16 +2854,6 @@ radv_set_driver_locations(struct radv_pipeline *pipeline, struct radv_pipeline_s
    bool has_tess = stages[MESA_SHADER_TESS_CTRL].nir;
    bool has_gs = stages[MESA_SHADER_GEOMETRY].nir;
 
-   /* Merged stage for VS and TES */
-   unsigned vs_info_idx = MESA_SHADER_VERTEX;
-   unsigned tes_info_idx = MESA_SHADER_TESS_EVAL;
-
-   if (pdevice->rad_info.gfx_level >= GFX9) {
-      /* These are merged into the next stage */
-      vs_info_idx = has_tess ? MESA_SHADER_TESS_CTRL : MESA_SHADER_GEOMETRY;
-      tes_info_idx = has_gs ? MESA_SHADER_GEOMETRY : MESA_SHADER_TESS_EVAL;
-   }
-
    nir_foreach_shader_in_variable (var, stages[MESA_SHADER_VERTEX].nir) {
       var->data.driver_location = var->data.location;
    }
@@ -2883,20 +2871,12 @@ radv_set_driver_locations(struct radv_pipeline *pipeline, struct radv_pipeline_s
       stages[MESA_SHADER_TESS_EVAL].info.tes.num_linked_inputs = tcs2tes.num_linked_io_vars;
       stages[MESA_SHADER_TESS_EVAL].info.tes.num_linked_patch_inputs = tcs2tes.num_linked_patch_io_vars;
 
-      /* Copy data to merged stage */
-      stages[vs_info_idx].info.vs.num_linked_outputs = vs2tcs.num_linked_io_vars;
-      stages[tes_info_idx].info.tes.num_linked_inputs = tcs2tes.num_linked_io_vars;
-      stages[tes_info_idx].info.tes.num_linked_patch_inputs = tcs2tes.num_linked_patch_io_vars;
-
       if (has_gs) {
          nir_linked_io_var_info tes2gs = nir_assign_linked_io_var_locations(
             stages[MESA_SHADER_TESS_EVAL].nir, stages[MESA_SHADER_GEOMETRY].nir);
 
          stages[MESA_SHADER_TESS_EVAL].info.tes.num_linked_outputs = tes2gs.num_linked_io_vars;
          stages[MESA_SHADER_GEOMETRY].info.gs.num_linked_inputs = tes2gs.num_linked_io_vars;
-
-         /* Copy data to merged stage */
-         stages[tes_info_idx].info.tes.num_linked_outputs = tes2gs.num_linked_io_vars;
       }
    } else if (has_gs) {
       nir_linked_io_var_info vs2gs = nir_assign_linked_io_var_locations(
@@ -2904,9 +2884,6 @@ radv_set_driver_locations(struct radv_pipeline *pipeline, struct radv_pipeline_s
 
       stages[MESA_SHADER_VERTEX].info.vs.num_linked_outputs = vs2gs.num_linked_io_vars;
       stages[MESA_SHADER_GEOMETRY].info.gs.num_linked_inputs = vs2gs.num_linked_io_vars;
-
-      /* Copy data to merged stage */
-      stages[vs_info_idx].info.vs.num_linked_outputs = vs2gs.num_linked_io_vars;
    }
 
    assert(last_vgt_api_stage != MESA_SHADER_NONE);
@@ -3273,6 +3250,8 @@ radv_fill_shader_info(struct radv_pipeline *pipeline,
 
       /* Copy data to merged stage. */
       stages[MESA_SHADER_TESS_CTRL].info.vs.as_ls = true;
+      stages[MESA_SHADER_TESS_CTRL].info.vs.num_linked_outputs =
+            stages[MESA_SHADER_VERTEX].info.vs.num_linked_outputs;
 
       for (int i = 0; i < 2; i++) {
          radv_nir_shader_info_pass(device, combined_nir[i], pipeline_layout, pipeline_key,
@@ -3294,8 +3273,16 @@ radv_fill_shader_info(struct radv_pipeline *pipeline,
       /* Copy data to merged stage. */
       if (pre_stage == MESA_SHADER_VERTEX) {
          stages[MESA_SHADER_GEOMETRY].info.vs.as_es = stages[MESA_SHADER_VERTEX].info.vs.as_es;
+         stages[MESA_SHADER_GEOMETRY].info.vs.num_linked_outputs =
+            stages[MESA_SHADER_VERTEX].info.vs.num_linked_outputs;
       } else {
          stages[MESA_SHADER_GEOMETRY].info.tes.as_es = stages[MESA_SHADER_TESS_EVAL].info.tes.as_es;
+         stages[MESA_SHADER_GEOMETRY].info.tes.num_linked_outputs =
+            stages[MESA_SHADER_TESS_EVAL].info.tes.num_linked_outputs;
+         stages[MESA_SHADER_GEOMETRY].info.tes.num_linked_inputs =
+            stages[MESA_SHADER_TESS_EVAL].info.tes.num_linked_inputs;
+         stages[MESA_SHADER_GEOMETRY].info.tes.num_linked_patch_inputs =
+            stages[MESA_SHADER_TESS_EVAL].info.tes.num_linked_patch_inputs;
       }
       stages[MESA_SHADER_GEOMETRY].info.is_ngg = stages[pre_stage].info.is_ngg;
       stages[MESA_SHADER_GEOMETRY].info.gs.es_type = pre_stage;