glsl: Override the # of varying slots for ClipDistance and TessLevel*.
authorKenneth Graunke <kenneth@whitecape.org>
Sun, 15 Nov 2015 12:37:50 +0000 (04:37 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Fri, 6 Jan 2017 23:55:37 +0000 (15:55 -0800)
Right now, this shouldn't have any effect, as all drivers use
LowerClipDist and LowerTessFactors to turn the float[] arrays into
vectors.

However, it should help make it possible for drivers to avoid that
lowering.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
src/compiler/glsl/ir.cpp

index a77b9a9d85746fc47ba20fdc62c3ae51bf4ff999..69f1f1a7e5dfd10a845b7b6aeb198bb1d1dfa6af 100644 (file)
@@ -1621,6 +1621,24 @@ ir_variable::get_extension_warning() const
 unsigned
 ir_variable::count_attribute_slots(bool is_vertex_stage) const
 {
+   /* GLSL contains several built-in arrays that control fixed-function
+    * hardware, and are somewhat special.  Clip distances and tessellation
+    * factors are exposed as float[] arrays, but typically are packed
+    * tightly.  We want to expose these as taking a single varying slot
+    * and let drivers handle laying them out appropriately.
+    *
+    * Skip this override if the arrays were lowered to vectors.
+    */
+   if (type->without_array()->is_scalar() &&
+       (data.mode == ir_var_shader_in || data.mode == ir_var_shader_out) &&
+       (data.location == VARYING_SLOT_CLIP_DIST0 ||
+        data.location == VARYING_SLOT_CULL_DIST0 ||
+        data.location == VARYING_SLOT_TESS_LEVEL_OUTER ||
+        data.location == VARYING_SLOT_TESS_LEVEL_INNER)) {
+      return type->length / 4;
+   }
+
+   /* For normal variables, simply consult the type. */
    bool is_vs_input = is_vertex_stage && this->data.mode == ir_var_shader_in;
    return this->type->count_attribute_slots(is_vs_input);
 }