radv: move gs copy shader creation before other variants
authorRhys Perry <pendingchaos02@gmail.com>
Fri, 20 Sep 2019 12:45:42 +0000 (13:45 +0100)
committerMarge Bot <eric+marge@anholt.net>
Fri, 24 Jan 2020 13:35:07 +0000 (13:35 +0000)
ACO lowers output derefs which breaks the shader_info pass used by gs copy
shader creation.

v3: rebase

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/2421>

src/amd/vulkan/radv_pipeline.c

index eaedc02..588a249 100644 (file)
@@ -2863,6 +2863,42 @@ void radv_create_shaders(struct radv_pipeline *pipeline,
                gfx9_get_gs_info(key, pipeline, nir, infos, gs_info);
        }
 
+       if(modules[MESA_SHADER_GEOMETRY]) {
+               struct radv_shader_binary *gs_copy_binary = NULL;
+               if (!pipeline->gs_copy_shader &&
+                   !radv_pipeline_has_ngg(pipeline)) {
+                       struct radv_shader_info info = {};
+                       struct radv_shader_variant_key key = {};
+
+                       key.has_multiview_view_index =
+                               keys[MESA_SHADER_GEOMETRY].has_multiview_view_index;
+
+                       radv_nir_shader_info_pass(nir[MESA_SHADER_GEOMETRY],
+                                                 pipeline->layout, &key,
+                                                 &info);
+                       info.wave_size = 64; /* Wave32 not supported. */
+
+                       pipeline->gs_copy_shader = radv_create_gs_copy_shader(
+                                       device, nir[MESA_SHADER_GEOMETRY], &info,
+                                       &gs_copy_binary, keep_executable_info,
+                                       keys[MESA_SHADER_GEOMETRY].has_multiview_view_index);
+               }
+
+               if (!keep_executable_info && pipeline->gs_copy_shader) {
+                       struct radv_shader_binary *binaries[MESA_SHADER_STAGES] = {NULL};
+                       struct radv_shader_variant *variants[MESA_SHADER_STAGES] = {0};
+
+                       binaries[MESA_SHADER_GEOMETRY] = gs_copy_binary;
+                       variants[MESA_SHADER_GEOMETRY] = pipeline->gs_copy_shader;
+
+                       radv_pipeline_cache_insert_shaders(device, cache,
+                                                          gs_copy_hash,
+                                                          variants,
+                                                          binaries);
+               }
+               free(gs_copy_binary);
+       }
+
        if (nir[MESA_SHADER_FRAGMENT]) {
                if (!pipeline->shaders[MESA_SHADER_FRAGMENT]) {
                        radv_start_feedback(stage_feedbacks[MESA_SHADER_FRAGMENT]);
@@ -2938,42 +2974,6 @@ void radv_create_shaders(struct radv_pipeline *pipeline,
                }
        }
 
-       if(modules[MESA_SHADER_GEOMETRY]) {
-               struct radv_shader_binary *gs_copy_binary = NULL;
-               if (!pipeline->gs_copy_shader &&
-                   !radv_pipeline_has_ngg(pipeline)) {
-                       struct radv_shader_info info = {};
-                       struct radv_shader_variant_key key = {};
-
-                       key.has_multiview_view_index =
-                               keys[MESA_SHADER_GEOMETRY].has_multiview_view_index;
-
-                       radv_nir_shader_info_pass(nir[MESA_SHADER_GEOMETRY],
-                                                 pipeline->layout, &key,
-                                                 &info);
-                       info.wave_size = 64; /* Wave32 not supported. */
-
-                       pipeline->gs_copy_shader = radv_create_gs_copy_shader(
-                                       device, nir[MESA_SHADER_GEOMETRY], &info,
-                                       &gs_copy_binary, keep_executable_info,
-                                       keys[MESA_SHADER_GEOMETRY].has_multiview_view_index);
-               }
-
-               if (!keep_executable_info && pipeline->gs_copy_shader) {
-                       struct radv_shader_binary *binaries[MESA_SHADER_STAGES] = {NULL};
-                       struct radv_shader_variant *variants[MESA_SHADER_STAGES] = {0};
-
-                       binaries[MESA_SHADER_GEOMETRY] = gs_copy_binary;
-                       variants[MESA_SHADER_GEOMETRY] = pipeline->gs_copy_shader;
-
-                       radv_pipeline_cache_insert_shaders(device, cache,
-                                                          gs_copy_hash,
-                                                          variants,
-                                                          binaries);
-               }
-               free(gs_copy_binary);
-       }
-
        if (!keep_executable_info) {
                radv_pipeline_cache_insert_shaders(device, cache, hash, pipeline->shaders,
                                                   binaries);