From: Bas Nieuwenhuizen <[email protected]>

Here we make use of NIR the linking helpers to remove unused
varyings.

Sascha Willems demo results:

computecullandlod 39 -> 41 fps
pipelines ~6100 -> ~6200 fps

Signed-off-by: Bas Nieuwenhuizen <[email protected]>
Signed-off-by: Timothy Arceri <[email protected]>
---
 src/amd/vulkan/radv_pipeline.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 src/amd/vulkan/radv_shader.c   |  2 +-
 src/amd/vulkan/radv_shader.h   |  3 +++
 3 files changed, 46 insertions(+), 1 deletion(-)

diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index e95925fda5..9e0b494802 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -1515,20 +1515,60 @@ static void calculate_ps_inputs(struct radv_pipeline 
*pipeline)
 
                flat_shade = !!(ps->info.fs.flat_shaded_mask & (1u << 
ps_offset));
 
                pipeline->graphics.ps_input_cntl[ps_offset] = 
offset_to_ps_input(vs_offset, flat_shade);
                ++ps_offset;
        }
 
        pipeline->graphics.ps_input_cntl_num = ps_offset;
 }
 
+static void
+radv_link_shaders(struct radv_pipeline *pipeline, nir_shader **shaders)
+{
+       nir_shader* ordered_shaders[MESA_SHADER_STAGES];
+       int shader_count = 0;
+
+       if(shaders[MESA_SHADER_FRAGMENT]) {
+               ordered_shaders[shader_count++] = shaders[MESA_SHADER_FRAGMENT];
+       }
+       if(shaders[MESA_SHADER_GEOMETRY]) {
+               ordered_shaders[shader_count++] = shaders[MESA_SHADER_GEOMETRY];
+       }
+       if(shaders[MESA_SHADER_TESS_EVAL]) {
+               ordered_shaders[shader_count++] = 
shaders[MESA_SHADER_TESS_EVAL];
+       }
+       if(shaders[MESA_SHADER_TESS_CTRL]) {
+               ordered_shaders[shader_count++] = 
shaders[MESA_SHADER_TESS_CTRL];
+       }
+       if(shaders[MESA_SHADER_VERTEX]) {
+               ordered_shaders[shader_count++] = shaders[MESA_SHADER_VERTEX];
+       }
+
+       for (int i = 1; i < shader_count; ++i)  {
+               nir_remove_dead_variables(ordered_shaders[i],
+                                         nir_var_shader_out);
+               nir_remove_dead_variables(ordered_shaders[i - 1],
+                                         nir_var_shader_in);
+
+               bool progress = nir_remove_unused_varyings(ordered_shaders[i],
+                                                          ordered_shaders[i - 
1]);
+
+               if (progress) {
+                       nir_lower_global_vars_to_local(ordered_shaders[i]);
+                       radv_optimize_nir(ordered_shaders[i]);
+                       nir_lower_global_vars_to_local(ordered_shaders[i - 1]);
+                       radv_optimize_nir(ordered_shaders[i - 1]);
+               }
+       }
+}
+
 static
 void radv_create_shaders(struct radv_pipeline *pipeline,
                          struct radv_device *device,
                          struct radv_pipeline_cache *cache,
                          struct ac_shader_variant_key *keys,
                          const VkPipelineShaderStageCreateInfo **pStages)
 {
        struct radv_shader_module fs_m = {0};
        struct radv_shader_module *modules[MESA_SHADER_STAGES] = { 0, };
        nir_shader *nir[MESA_SHADER_STAGES] = {0};
@@ -1598,20 +1638,22 @@ void radv_create_shaders(struct radv_pipeline *pipeline,
                if (keys) {
                        keys[MESA_SHADER_VERTEX].vs.export_prim_id =
                                
pipeline->shaders[MESA_SHADER_FRAGMENT]->info.fs.prim_id_input;
                        keys[MESA_SHADER_TESS_EVAL].tes.export_prim_id =
                                
pipeline->shaders[MESA_SHADER_FRAGMENT]->info.fs.prim_id_input;
                }
 
                pipeline->active_stages |= 
mesa_to_vk_shader_stage(MESA_SHADER_FRAGMENT);
        }
 
+       radv_link_shaders(pipeline, nir);
+
        for (int i = 0; i < MESA_SHADER_STAGES; ++i) {
                if(modules[i] && !pipeline->shaders[i]) {
                        pipeline->shaders[i] = 
radv_shader_variant_create(device, modules[i], nir[i],
                                                                          
pipeline->layout,
                                                                          keys 
? keys + i : 0, &codes[i],
                                                                          
&code_sizes[i]);
 
                pipeline->active_stages |= mesa_to_vk_shader_stage(i);
                }
        }
diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
index d4bef9792e..055787a705 100644
--- a/src/amd/vulkan/radv_shader.c
+++ b/src/amd/vulkan/radv_shader.c
@@ -103,21 +103,21 @@ void radv_DestroyShaderModule(
 {
        RADV_FROM_HANDLE(radv_device, device, _device);
        RADV_FROM_HANDLE(radv_shader_module, module, _module);
 
        if (!module)
                return;
 
        vk_free2(&device->alloc, pAllocator, module);
 }
 
-static void
+void
 radv_optimize_nir(struct nir_shader *shader)
 {
         bool progress;
 
         do {
                 progress = false;
 
                 NIR_PASS_V(shader, nir_lower_vars_to_ssa);
                NIR_PASS_V(shader, nir_lower_64bit_pack);
                 NIR_PASS_V(shader, nir_lower_alu_to_scalar);
diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h
index 1ef13968f9..3862b3094c 100644
--- a/src/amd/vulkan/radv_shader.h
+++ b/src/amd/vulkan/radv_shader.h
@@ -60,20 +60,23 @@ struct radv_shader_variant {
 };
 
 struct radv_shader_slab {
        struct list_head slabs;
        struct list_head shaders;
        struct radeon_winsys_bo *bo;
        uint64_t size;
        char *ptr;
 };
 
+void
+radv_optimize_nir(struct nir_shader *shader);
+
 nir_shader *
 radv_shader_compile_to_nir(struct radv_device *device,
                           struct radv_shader_module *module,
                           const char *entrypoint_name,
                           gl_shader_stage stage,
                           const VkSpecializationInfo *spec_info);
 
 void *
 radv_alloc_shader_memory(struct radv_device *device,
                          struct radv_shader_variant *shader);
-- 
2.13.6

_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to