anv: Move nir_lower_wpos_center after dead variable elimination.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 11 Jan 2017 23:10:48 +0000 (15:10 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Fri, 13 Jan 2017 23:00:38 +0000 (15:00 -0800)
When multiple shader stages exist in the same SPIR-V module, we compile
all entry points and their inputs/outputs, then dead code eliminate the
ones not related to the specific entry point later.

nir_lower_wpos_center was being run prior to eliminating those random
other variables, which made it trip up, thinking it found gl_FragCoord
when it actually found something else like gl_PerVertex[3].

Fixes dEQP-VK.spirv_assembly.instruction.graphics.module.same_module.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/intel/vulkan/anv_pipeline.c

index 6c939b071dab59b493b4aeba19896ff3c7350406..7d939ebabe94565172f629c946e1251d26248b6b 100644 (file)
@@ -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.
@@ -161,6 +158,9 @@ anv_shader_compile_to_nir(struct anv_device *device,
    NIR_PASS_V(nir, nir_remove_dead_variables,
               nir_var_shader_in | nir_var_shader_out | nir_var_system_value);
 
+   if (stage == MESA_SHADER_FRAGMENT)
+      NIR_PASS_V(nir, nir_lower_wpos_center);
+
    /* Now that we've deleted all but the main function, we can go ahead and
     * lower the rest of the constant initializers.
     */