nir: Support sysval tess levels in SPIR-V to NIR
authorBrian Ho <brian@brkho.com>
Thu, 14 May 2020 18:51:43 +0000 (11:51 -0700)
committerMarge Bot <eric+marge@anholt.net>
Mon, 22 Jun 2020 14:35:45 +0000 (14:35 +0000)
This commit adds a tess_levels_are_sysvals flag to
spirv_to_nir_options similar to GLSLTessLevelsAsInputs in the GLSL to
NIR compiler options. This will be used by turnip as the tess IR3
lowering pass (ir3_nir_lower_tess) operates on TessLevelInner and
TessLevelOuter in the DS as sysvals.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5059>

src/compiler/spirv/nir_spirv.h
src/compiler/spirv/vtn_variables.c

index 3d6f74e43ca9337952a7f9743c0d999cb805e6ed..acfcc084f417d33b6b43d1e987ae5b7ef8ad337d 100644 (file)
@@ -64,6 +64,11 @@ struct spirv_to_nir_options {
     */
    bool frag_coord_is_sysval;
 
+   /* Whether to lower TessLevelInner and TessLevelOuter to system values.
+    * This is the inverse of GLSLTessLevelsAsInputs in GLSL.
+    */
+   bool tess_levels_are_sysvals;
+
    struct spirv_supported_capabilities caps;
 
    /* Address format for various kinds of pointers. */
index afe2aa89bbf22325802838a2f0135a2b2947176b..b36edbafa12287af62a7ae1f75f8446c72de7a5e 100644 (file)
@@ -1354,10 +1354,22 @@ vtn_get_builtin_location(struct vtn_builder *b,
          vtn_fail("invalid stage for SpvBuiltInViewportIndex");
       break;
    case SpvBuiltInTessLevelOuter:
-      *location = VARYING_SLOT_TESS_LEVEL_OUTER;
+      if (b->options && b->options->tess_levels_are_sysvals &&
+          *mode == nir_var_shader_in) {
+         *location = SYSTEM_VALUE_TESS_LEVEL_OUTER;
+         set_mode_system_value(b, mode);
+      } else {
+         *location = VARYING_SLOT_TESS_LEVEL_OUTER;
+      }
       break;
    case SpvBuiltInTessLevelInner:
-      *location = VARYING_SLOT_TESS_LEVEL_INNER;
+      if (b->options && b->options->tess_levels_are_sysvals &&
+          *mode == nir_var_shader_in) {
+         *location = SYSTEM_VALUE_TESS_LEVEL_INNER;
+         set_mode_system_value(b, mode);
+      } else {
+         *location = VARYING_SLOT_TESS_LEVEL_INNER;
+      }
       break;
    case SpvBuiltInTessCoord:
       *location = SYSTEM_VALUE_TESS_COORD;