glsl: Make gl_ClipDistance[] implicitly sized.
authorPaul Berry <stereotype441@gmail.com>
Thu, 11 Aug 2011 22:03:19 +0000 (15:03 -0700)
committerPaul Berry <stereotype441@gmail.com>
Thu, 8 Sep 2011 16:36:13 +0000 (09:36 -0700)
From the GLSL 1.30 spec, section 7.1 (Vertex Shader Special Variables):

  The gl_ClipDistance array is predeclared as unsized and must be
  sized by the shader either redeclaring it with a size or indexing it
  only with integral constant expressions.

Fixes piglit tests clip-distance-implicit-length.vert,
clip-distance-implicit-nonconst-access.vert, and
{vs,fs}-clip-distance-explicitly-sized.shader_test.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/glsl/ir_variable.cpp

index b8487694c51fa0787908184af8a5aa391421eca7..38094568b4f58697a00ef3aef4404d35e1dea7b2 100644 (file)
@@ -595,9 +595,18 @@ generate_130_vs_variables(exec_list *instructions,
                           & builtin_130_vs_variables[i]);
    }
 
+   /* From the GLSL 1.30 spec, section 7.1 (Vertex Shader Special
+    * Variables):
+    *
+    *   The gl_ClipDistance array is predeclared as unsized and must
+    *   be sized by the shader either redeclaring it with a size or
+    *   indexing it only with integral constant expressions.
+    *
+    * We represent this in Mesa by initially declaring the array as
+    * size 0.
+    */
    const glsl_type *const clip_distance_array_type =
-      glsl_type::get_array_instance(glsl_type::float_type,
-                                   state->Const.MaxClipPlanes);
+      glsl_type::get_array_instance(glsl_type::float_type, 0);
 
    /* FINISHME: gl_ClipDistance needs a real location assigned. */
    add_variable(instructions, state->symbols,
@@ -802,9 +811,20 @@ generate_130_fs_variables(exec_list *instructions,
 {
    generate_120_fs_variables(instructions, state);
 
+   /* From the GLSL 1.30 spec, section 7.2 (Fragment Shader Special
+    * Variables):
+    *
+    *   The built-in input variable gl_ClipDistance array contains linearly
+    *   interpolated values for the vertex values written by the vertex shader
+    *   to the gl_ClipDistance vertex output variable. This array must be
+    *   sized in the fragment shader either implicitly or explicitly to be the
+    *   same size as it was sized in the vertex shader.
+    *
+    * In other words, the array must be pre-declared as implicitly sized.  We
+    * represent this in Mesa by initially declaring the array as size 0.
+    */
    const glsl_type *const clip_distance_array_type =
-      glsl_type::get_array_instance(glsl_type::float_type,
-                                   state->Const.MaxClipPlanes);
+      glsl_type::get_array_instance(glsl_type::float_type, 0);
 
    /* FINISHME: gl_ClipDistance needs a real location assigned. */
    add_variable(instructions, state->symbols,