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 <kenneth@whitecape.org> Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
@@ -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;
|
||||
|
||||
+2
-1
@@ -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";
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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];
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user