We can have a crash produced because the tests is using the same shader module for all stages (setting a different entry point per stage). So when we fix world position center on the fragment's built-in input position in fragment shader ("gl_Fragcoord" in GLSL), we might be using one from previous shaders (geometry or tessellation shaders is "gl_in" in GLSL) because the slot location would match.
After moving this lowering to later, the rest of optimizations will take care of removing unused inputs for each stage, so we don't lower the wrong fragment shader's built-in position input. Fixes a crash in: dEQP-VK.spirv_assembly.instruction.graphics.module.same_mod Signed-off-by: Samuel Iglesias Gonsálvez <sigles...@igalia.com> --- src/intel/vulkan/anv_pipeline.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c index 6c939b071da..5a6e4f6256e 100644 --- a/src/intel/vulkan/anv_pipeline.c +++ b/src/intel/vulkan/anv_pipeline.c @@ -139,9 +139,6 @@ anv_shader_compile_to_nir(struct anv_device *device, free(spec_entries); - if (stage == MESA_SHADER_FRAGMENT) - NIR_PASS_V(nir, nir_lower_wpos_center); - /* We have to lower away local constant initializers right before we * inline functions. That way they get properly initialized at the top * of the function and not at the top of its caller. @@ -177,8 +174,10 @@ anv_shader_compile_to_nir(struct anv_device *device, NIR_PASS_V(nir, nir_lower_clip_cull_distance_arrays); - if (stage == MESA_SHADER_FRAGMENT) + if (stage == MESA_SHADER_FRAGMENT) { NIR_PASS_V(nir, anv_nir_lower_input_attachments); + NIR_PASS_V(nir, nir_lower_wpos_center); + } nir_shader_gather_info(nir, entry_point->impl); -- 2.11.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev