glsl: support 64bit integer loop iterators

this was crashing due to the assumption that non-32bit integer values must be
floats

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7316>
This commit is contained in:
Mike Blumenkrantz 2020-10-26 10:47:37 -04:00 committed by Marge Bot
parent 234ba13f10
commit d76f51d6fd

View file

@ -107,7 +107,7 @@ calculate_iterations(ir_rvalue *from, ir_rvalue *to, ir_rvalue *increment,
return -1;
}
if (!iter->type->is_integer_32()) {
if (!iter->type->is_integer_32() && !iter->type->is_integer_64()) {
const ir_expression_operation op = iter->type->is_double()
? ir_unop_d2i : ir_unop_f2i;
ir_rvalue *cast =
@ -116,7 +116,7 @@ calculate_iterations(ir_rvalue *from, ir_rvalue *to, ir_rvalue *increment,
iter = cast->constant_expression_value(mem_ctx);
}
int iter_value = iter->get_int_component(0);
int64_t iter_value = iter->get_int64_component(0);
/* Code after this block works under assumption that iterator will be
* incremented or decremented until it hits the limit,
@ -159,17 +159,23 @@ calculate_iterations(ir_rvalue *from, ir_rvalue *to, ir_rvalue *increment,
/* Increment may be of type int, uint or float. */
switch (increment->type->base_type) {
case GLSL_TYPE_INT:
iter = new(mem_ctx) ir_constant(iter_value + bias[i]);
iter = new(mem_ctx) ir_constant(int32_t(iter_value + bias[i]));
break;
case GLSL_TYPE_INT16:
iter = new(mem_ctx) ir_constant(uint16_t(iter_value + bias[i]));
break;
case GLSL_TYPE_INT64:
iter = new(mem_ctx) ir_constant(int64_t(iter_value + bias[i]));
break;
case GLSL_TYPE_UINT:
iter = new(mem_ctx) ir_constant(unsigned(iter_value + bias[i]));
break;
case GLSL_TYPE_UINT16:
iter = new(mem_ctx) ir_constant(uint16_t(iter_value + bias[i]));
break;
case GLSL_TYPE_UINT64:
iter = new(mem_ctx) ir_constant(uint64_t(iter_value + bias[i]));
break;
case GLSL_TYPE_FLOAT:
iter = new(mem_ctx) ir_constant(float(iter_value + bias[i]));
break;