mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-16 18:28:05 +02:00
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:
parent
4bd0f04531
commit
e6d07585f8
2 changed files with 51 additions and 0 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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).
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue