st/mesa: handle lowered IO in st_nir_assign_vs_in_locations
authorMarek Olšák <marek.olsak@amd.com>
Fri, 14 Aug 2020 05:32:00 +0000 (01:32 -0400)
committerMarge Bot <eric+marge@anholt.net>
Mon, 24 Aug 2020 19:07:18 +0000 (19:07 +0000)
There are piglit failures without this.

Reviewed-by: Eric Anholt <eric@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6442>

src/mesa/state_tracker/st_glsl_to_nir.cpp

index b4d78c86d6ca84f5b5395d0530158293b4591cc9..442f1ffeeb8eecca77c2cfe96bdea8806eb89cf7 100644 (file)
@@ -105,9 +105,36 @@ st_nir_assign_vs_in_locations(struct nir_shader *nir)
    if (nir->info.stage != MESA_SHADER_VERTEX)
       return;
 
    if (nir->info.stage != MESA_SHADER_VERTEX)
       return;
 
+   nir->num_inputs = util_bitcount64(nir->info.inputs_read);
+
+   if (nir->info.io_lowered) {
+      /* Adjust the locations in load_input intrinsics. */
+      nir_foreach_function(f, nir) {
+         if (f->impl) {
+            nir_foreach_block(block, f->impl) {
+               nir_foreach_instr_safe(instr, block) {
+                  if (instr->type == nir_instr_type_intrinsic) {
+                     nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
+
+                     if (intrin->intrinsic == nir_intrinsic_load_input) {
+                        unsigned base = nir_intrinsic_base(intrin);
+                        unsigned loc = nir_intrinsic_io_semantics(intrin).location;
+
+                        assert(nir->info.inputs_read & BITFIELD64_BIT(loc));
+                        base = util_bitcount64(nir->info.inputs_read &
+                                               BITFIELD64_MASK(loc));
+                        nir_intrinsic_set_base(intrin, base);
+                     }
+                  }
+               }
+            }
+         }
+      }
+      return;
+   }
+
    bool removed_inputs = false;
 
    bool removed_inputs = false;
 
-   nir->num_inputs = util_bitcount64(nir->info.inputs_read);
    nir_foreach_shader_in_variable_safe(var, nir) {
       /* NIR already assigns dual-slot inputs to two locations so all we have
        * to do is compact everything down.
    nir_foreach_shader_in_variable_safe(var, nir) {
       /* NIR already assigns dual-slot inputs to two locations so all we have
        * to do is compact everything down.