nir/lower_sysvals: Add support for un-lowered tess_level_inner/outer.
authorEmma Anholt <emma@anholt.net>
Mon, 20 Mar 2023 17:10:42 +0000 (10:10 -0700)
committerMarge Bot <emma+marge@anholt.net>
Wed, 29 Mar 2023 16:06:03 +0000 (16:06 +0000)
GLSL has been responsible for doing this, but we can just extract the
array index here.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21940>

src/compiler/nir/nir_lower_system_values.c

index ba4187a..b2e570c 100644 (file)
@@ -129,12 +129,33 @@ lower_system_value_instr(nir_builder *b, nir_instr *instr, void *_state)
          assert(deref->deref_type == nir_deref_type_array);
          assert(deref->arr.index.is_ssa);
          column = deref->arr.index.ssa;
+         nir_deref_instr *arr_deref = deref;
          deref = nir_deref_instr_parent(deref);
          assert(deref->deref_type == nir_deref_type_var);
-         assert(deref->var->data.location == SYSTEM_VALUE_SAMPLE_MASK_IN ||
-                deref->var->data.location == SYSTEM_VALUE_RAY_OBJECT_TO_WORLD ||
-                deref->var->data.location == SYSTEM_VALUE_RAY_WORLD_TO_OBJECT ||
-                deref->var->data.location == SYSTEM_VALUE_MESH_VIEW_INDICES);
+
+         switch (deref->var->data.location) {
+         case SYSTEM_VALUE_TESS_LEVEL_INNER:
+         case SYSTEM_VALUE_TESS_LEVEL_OUTER: {
+            nir_ssa_def *index = nir_ssa_for_src(b, arr_deref->arr.index, 1);
+            nir_ssa_def *sysval = (deref->var->data.location ==
+                                   SYSTEM_VALUE_TESS_LEVEL_INNER)
+                                      ? nir_load_tess_level_inner(b)
+                                      : nir_load_tess_level_outer(b);
+            return nir_vector_extract(b, sysval, index);
+         }
+
+         case SYSTEM_VALUE_SAMPLE_MASK_IN:
+         case SYSTEM_VALUE_RAY_OBJECT_TO_WORLD:
+         case SYSTEM_VALUE_RAY_WORLD_TO_OBJECT:
+         case SYSTEM_VALUE_MESH_VIEW_INDICES:
+            /* These are all single-element arrays in our implementation, and
+             * the sysval load below just drops the 0 array index.
+             */
+            break;
+
+         default:
+            unreachable("unsupported system value array deref");
+         }
       }
       nir_variable *var = deref->var;