glsl: Allow int -> uint implicit conversions on function parameters

V2: Fix crashes during linking, where the parse state is NULL. In this
case, all required checks have already been done, so we assume the
extension is enabled.

Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Chris Forbes 2014-05-04 20:23:58 +12:00
parent f17428a276
commit 6ae787584d
1 changed files with 16 additions and 3 deletions

View File

@ -688,10 +688,23 @@ glsl_type::can_implicitly_convert_to(const glsl_type *desired,
if (this->matrix_columns > 1 || desired->matrix_columns > 1)
return false;
/* Vector size must match. */
if (this->vector_elements != desired->vector_elements)
return false;
/* int and uint can be converted to float. */
return desired->is_float()
&& this->is_integer()
&& this->vector_elements == desired->vector_elements;
if (desired->is_float() && this->is_integer())
return true;
/* With GLSL 4.0 / ARB_gpu_shader5, int can be converted to uint.
* Note that state may be NULL here, when resolving function calls in the
* linker. By this time, all the state-dependent checks have already
* happened though, so allow anything that's allowed in any shader version. */
if ((!state || state->is_version(400, 0) || state->ARB_gpu_shader5_enable) &&
desired->base_type == GLSL_TYPE_UINT && this->base_type == GLSL_TYPE_INT)
return true;
return false;
}
unsigned