SaschaWillems Vulkan demo tessellation: ~4300fps -> ~4800fps --- src/amd/vulkan/radv_pipeline.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index d0e47383d7..69bda152e2 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -1760,20 +1760,21 @@ void radv_create_shaders(struct radv_pipeline *pipeline, } if (!modules[MESA_SHADER_FRAGMENT] && !modules[MESA_SHADER_COMPUTE]) { nir_builder fs_b; nir_builder_init_simple_shader(&fs_b, NULL, MESA_SHADER_FRAGMENT, NULL); fs_b.shader->info.name = ralloc_strdup(fs_b.shader, "noop_fs"); fs_m.nir = fs_b.shader; modules[MESA_SHADER_FRAGMENT] = &fs_m; } + int prev = -1; for (unsigned i = 0; i < MESA_SHADER_STAGES; ++i) { const VkPipelineShaderStageCreateInfo *stage = pStages[i]; if (!modules[i]) continue; nir[i] = radv_shader_compile_to_nir(device, modules[i], stage ? stage->pName : "main", i, stage ? stage->pSpecializationInfo : NULL); pipeline->active_stages |= mesa_to_vk_shader_stage(i); @@ -1790,20 +1791,32 @@ void radv_create_shaders(struct radv_pipeline *pipeline, if (i != first) mask = mask | nir_var_shader_in; if (i != last) mask = mask | nir_var_shader_out; nir_lower_io_to_scalar_early(nir[i], mask); radv_optimize_nir(nir[i]); } + + if (prev != -1) { + nir_compact_varyings(nir[prev], nir[i], true); + + /* TODO: In future nir_compact_varyings() should update the varying + * input/output mask to reflect the packing it has just done. However + * until we have an array/matrix splitting pass we would just be + * duplicating the complex partial marking code in nir_gather_info(). + */ + nir_shader_gather_info(nir[i], nir_shader_get_entrypoint(nir[i])); + } + prev = i; } if (nir[MESA_SHADER_TESS_CTRL]) { /* TODO: This is no longer used as a key we should refactor this */ if (keys) keys[MESA_SHADER_TESS_CTRL].tcs.primitive_mode = nir[MESA_SHADER_TESS_EVAL]->info.tess.primitive_mode; keys[MESA_SHADER_TESS_CTRL].tcs.tes_reads_tess_factors = !!(nir[MESA_SHADER_TESS_EVAL]->info.inputs_read & (VARYING_BIT_TESS_LEVEL_INNER | VARYING_BIT_TESS_LEVEL_OUTER)); nir_lower_tes_patch_vertices(nir[MESA_SHADER_TESS_EVAL], nir[MESA_SHADER_TESS_CTRL]->info.tess.tcs_vertices_out); } -- 2.13.6 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev