From: Paul Berry Date: Fri, 21 Oct 2011 14:40:37 +0000 (-0700) Subject: glsl: Distinguish between no interpolation qualifier and 'smooth' X-Git-Tag: mesa-8.0-rc1~1468 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c488150dea083a9677429b4185c6b20d7facd52b;p=platform%2Fupstream%2Fmesa.git glsl: Distinguish between no interpolation qualifier and 'smooth' 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 Reviewed-by: Eric Anholt --- diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index d090d31..fa6206e5 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -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; diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp index 046ce25..9aad0fc 100644 --- a/src/glsl/ir.cpp +++ b/src/glsl/ir.cpp @@ -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"; diff --git a/src/glsl/ir.h b/src/glsl/ir.h index 4ea8764..0c0cccb 100644 --- a/src/glsl/ir.h +++ b/src/glsl/ir.h @@ -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; diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 9410e3f..aa3fa6a 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -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]; };