glsl: Add method glsl_type::can_implicitly_convert_to()

This method checks if a source type is identical to or can be implicitly
converted to a target type according to the GLSL 1.20 spec, Section 4.1.10
Implicit Conversions.

The following commits use the method for a bugfix:
    glsl: Fix implicit conversions in non-constructor function calls
    glsl: Fix implicit conversions in array constructors

Note: This is a candidate for the 7.10 and 7.11 branches.
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Signed-off-by: Chad Versace <chad@chad-versace.us>
(cherry picked from commit 200e4972c1)
This commit is contained in:
Chad Versace 2011-07-27 12:21:27 -07:00 committed by Marek Olšák
parent 4bd0f04531
commit e6d07585f8
2 changed files with 51 additions and 0 deletions

View file

@ -523,3 +523,19 @@ glsl_type::component_slots() const
return 0;
}
}
bool
glsl_type::can_implicitly_convert_to(const glsl_type *desired) const
{
if (this == desired)
return true;
/* There is no conversion among matrix types. */
if (this->matrix_columns > 1 || desired->matrix_columns > 1)
return false;
/* int and uint can be converted to float. */
return desired->is_float()
&& this->is_integer()
&& this->vector_elements == desired->vector_elements;
}

View file

@ -224,6 +224,41 @@ struct glsl_type {
*/
unsigned component_slots() const;
/**
* \brief Can this type be implicitly converted to another?
*
* \return True if the types are identical or if this type can be converted
* to \c desired according to Section 4.1.10 of the GLSL spec.
*
* \verbatim
* From page 25 (31 of the pdf) of the GLSL 1.50 spec, Section 4.1.10
* Implicit Conversions:
*
* In some situations, an expression and its type will be implicitly
* converted to a different type. The following table shows all allowed
* implicit conversions:
*
* Type of expression | Can be implicitly converted to
* --------------------------------------------------
* int float
* uint
*
* ivec2 vec2
* uvec2
*
* ivec3 vec3
* uvec3
*
* ivec4 vec4
* uvec4
*
* There are no implicit array or structure conversions. For example,
* an array of int cannot be implicitly converted to an array of float.
* There are no implicit conversions between signed and unsigned
* integers.
* \endverbatim
*/
bool can_implicitly_convert_to(const glsl_type *desired) const;
/**
* Query whether or not a type is a scalar (non-vector and non-matrix).