compiler/nir: Add conditional lowering for gl_BaseVertex
authorAntia Puentes <apuentes@igalia.com>
Sat, 28 Apr 2018 12:09:21 +0000 (14:09 +0200)
committerAntia Puentes <apuentes@igalia.com>
Wed, 2 May 2018 09:24:31 +0000 (11:24 +0200)
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/nir/nir.h
src/compiler/nir/nir_lower_system_values.c

index f8e71d54a50d0783cc1a6b6a22573b9a82c1f196..ec3dbf035c051a72885f1e7238f4220e1e3f1e4f 100644 (file)
@@ -1930,6 +1930,12 @@ typedef struct nir_shader_compiler_options {
    /* Indicates that the driver only has zero-based vertex id */
    bool vertex_id_zero_based;
 
+   /**
+    * If enabled, gl_BaseVertex will be lowered as:
+    * is_indexed_draw (~0/0) & firstvertex
+    */
+   bool lower_base_vertex;
+
    bool lower_cs_local_index_from_id;
 
    bool lower_device_index_to_zero;
index 47709e9887b1a4799f75bb8a5e14f58dc210b88b..487da042620aa546dde82b49cded58ad918cc1fa 100644 (file)
@@ -121,6 +121,21 @@ convert_block(nir_block *block, nir_builder *b)
          }
          break;
 
+      case SYSTEM_VALUE_BASE_VERTEX:
+         /**
+          * From the OpenGL 4.6 (11.1.3.9 Shader Inputs) specification:
+          *
+          * "gl_BaseVertex holds the integer value passed to the baseVertex
+          * parameter to the command that resulted in the current shader
+          * invocation. In the case where the command has no baseVertex
+          * parameter, the value of gl_BaseVertex is zero."
+          */
+         if (b->shader->options->lower_base_vertex)
+            sysval = nir_iand(b,
+                              nir_load_is_indexed_draw(b),
+                              nir_load_first_vertex(b));
+         break;
+
       case SYSTEM_VALUE_INSTANCE_INDEX:
          sysval = nir_iadd(b,
                            nir_load_instance_id(b),