glsl: Distinguish between no interpolation qualifier and 'smooth'
authorPaul Berry <stereotype441@gmail.com>
Fri, 21 Oct 2011 14:40:37 +0000 (07:40 -0700)
committerPaul Berry <stereotype441@gmail.com>
Thu, 27 Oct 2011 22:31:20 +0000 (15:31 -0700)
Previously, we treated the 'smooth' qualifier as equivalent to no
qualifier at all.  However, this is incorrect for the built-in color
variables (gl_FrontColor, gl_BackColor, gl_FrontSecondaryColor, and
gl_BackSecondaryColor).  For those variables, if there is no qualifier
at all, interpolation should be flat if the shade model is GL_FLAT,
and smooth if the shade model is GL_SMOOTH.

To make this possible, I added a new value to the
glsl_interp_qualifier enum, INTERP_QUALIFIER_NONE.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/glsl/ast_to_hir.cpp
src/glsl/ir.cpp
src/glsl/ir.h
src/mesa/main/mtypes.h

index d090d311da8827212e2a443b05cd3ac4ba724f56..fa6206e5eb020bbe0e2cdf3de71c866facb2e1ad 100644 (file)
@@ -1965,8 +1965,10 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
       var->interpolation = INTERP_QUALIFIER_FLAT;
    else if (qual->flags.q.noperspective)
       var->interpolation = INTERP_QUALIFIER_NOPERSPECTIVE;
-   else
+   else if (qual->flags.q.smooth)
       var->interpolation = INTERP_QUALIFIER_SMOOTH;
+   else
+      var->interpolation = INTERP_QUALIFIER_NONE;
 
    var->pixel_center_integer = qual->flags.q.pixel_center_integer;
    var->origin_upper_left = qual->flags.q.origin_upper_left;
index 046ce25f90c767d5e33297d7e890fb90da9ddee1..9aad0fcd42fa1107455a7376a770ee665337a0f4 100644 (file)
@@ -1320,7 +1320,7 @@ ir_swizzle::variable_referenced() const
 ir_variable::ir_variable(const struct glsl_type *type, const char *name,
                         ir_variable_mode mode)
    : max_array_access(0), read_only(false), centroid(false), invariant(false),
-     mode(mode), interpolation(INTERP_QUALIFIER_SMOOTH)
+     mode(mode), interpolation(INTERP_QUALIFIER_NONE)
 {
    this->ir_type = ir_type_variable;
    this->type = type;
@@ -1343,6 +1343,7 @@ const char *
 ir_variable::interpolation_string() const
 {
    switch (this->interpolation) {
+   case INTERP_QUALIFIER_NONE:          return "no";
    case INTERP_QUALIFIER_SMOOTH:        return "smooth";
    case INTERP_QUALIFIER_FLAT:          return "flat";
    case INTERP_QUALIFIER_NOPERSPECTIVE: return "noperspective";
index 4ea8764b68f125acf009653ffbb876e24876e7b9..0c0cccbd034cb4e079ac30dd8ef15869444559eb 100644 (file)
@@ -283,6 +283,10 @@ public:
     * \return The string that would be used in a shader to specify \c
     * mode will be returned.
     *
+    * This function is used to generate error messages of the form "shader
+    * uses %s interpolation qualifier", so in the case where there is no
+    * interpolation qualifier, it returns "no".
+    *
     * This function should only be used on a shader input or output variable.
     */
    const char *interpolation_string() const;
index 9410e3ff67a39ad2784b04b5287de14fa71f9e04..aa3fa6aecf0783a11411a14bb5eaf3dbd9003431 100644 (file)
@@ -1793,9 +1793,13 @@ typedef enum
 /**
  * The possible interpolation qualifiers that can be applied to a fragment
  * shader input in GLSL.
+ *
+ * Note: INTERP_QUALIFIER_NONE must be 0 so that memsetting the
+ * gl_fragment_program data structure to 0 causes the default behavior.
  */
 enum glsl_interp_qualifier
 {
+   INTERP_QUALIFIER_NONE = 0,
    INTERP_QUALIFIER_SMOOTH,
    INTERP_QUALIFIER_FLAT,
    INTERP_QUALIFIER_NOPERSPECTIVE
@@ -1906,7 +1910,7 @@ struct gl_fragment_program
    /**
     * GLSL interpolation qualifier associated with each fragment shader input.
     * For inputs that do not have an interpolation qualifier specified in
-    * GLSL, the value is INTERP_QUALIFIER_SMOOTH.
+    * GLSL, the value is INTERP_QUALIFIER_NONE.
     */
    enum glsl_interp_qualifier InterpQualifier[FRAG_ATTRIB_MAX];
 };