glsl/ast: Add 64-bit integer support to conversion functions
This adds support to call the new operations on conversions. v2 (idr): Delete an unnecessary break-statement. Noticed by Matt. Add a missing blank line. Noticed by Ian. v3 (idr): "cut them down later" => Remove ir_unop_b2u64 and ir_unop_u642b. Handle these with extra i2u or u2i casts just like uint(bool) and bool(uint) conversion is done. Signed-off-by: Dave Airlie <airlied@redhat.com> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> [v1] Reviewed-by: Matt Turner <mattst88@gmail.com> [v2] Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:

committed by
Ian Romanick

parent
85faf5082f
commit
78cc44280e
@@ -760,6 +760,12 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type)
|
|||||||
case GLSL_TYPE_DOUBLE:
|
case GLSL_TYPE_DOUBLE:
|
||||||
result = new(ctx) ir_expression(ir_unop_d2u, src);
|
result = new(ctx) ir_expression(ir_unop_d2u, src);
|
||||||
break;
|
break;
|
||||||
|
case GLSL_TYPE_UINT64:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_u642u, src);
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_INT64:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_i642u, src);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GLSL_TYPE_INT:
|
case GLSL_TYPE_INT:
|
||||||
@@ -776,6 +782,12 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type)
|
|||||||
case GLSL_TYPE_DOUBLE:
|
case GLSL_TYPE_DOUBLE:
|
||||||
result = new(ctx) ir_expression(ir_unop_d2i, src);
|
result = new(ctx) ir_expression(ir_unop_d2i, src);
|
||||||
break;
|
break;
|
||||||
|
case GLSL_TYPE_UINT64:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_u642i, src);
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_INT64:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_i642i, src);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GLSL_TYPE_FLOAT:
|
case GLSL_TYPE_FLOAT:
|
||||||
@@ -792,6 +804,12 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type)
|
|||||||
case GLSL_TYPE_DOUBLE:
|
case GLSL_TYPE_DOUBLE:
|
||||||
result = new(ctx) ir_expression(ir_unop_d2f, desired_type, src, NULL);
|
result = new(ctx) ir_expression(ir_unop_d2f, desired_type, src, NULL);
|
||||||
break;
|
break;
|
||||||
|
case GLSL_TYPE_UINT64:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_u642f, desired_type, src, NULL);
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_INT64:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_i642f, desired_type, src, NULL);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GLSL_TYPE_BOOL:
|
case GLSL_TYPE_BOOL:
|
||||||
@@ -810,6 +828,14 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type)
|
|||||||
case GLSL_TYPE_DOUBLE:
|
case GLSL_TYPE_DOUBLE:
|
||||||
result = new(ctx) ir_expression(ir_unop_d2b, desired_type, src, NULL);
|
result = new(ctx) ir_expression(ir_unop_d2b, desired_type, src, NULL);
|
||||||
break;
|
break;
|
||||||
|
case GLSL_TYPE_UINT64:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_i642b,
|
||||||
|
new(ctx) ir_expression(ir_unop_u642i64,
|
||||||
|
src));
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_INT64:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_i642b, desired_type, src, NULL);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GLSL_TYPE_DOUBLE:
|
case GLSL_TYPE_DOUBLE:
|
||||||
@@ -828,7 +854,60 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type)
|
|||||||
case GLSL_TYPE_FLOAT:
|
case GLSL_TYPE_FLOAT:
|
||||||
result = new(ctx) ir_expression(ir_unop_f2d, desired_type, src, NULL);
|
result = new(ctx) ir_expression(ir_unop_f2d, desired_type, src, NULL);
|
||||||
break;
|
break;
|
||||||
|
case GLSL_TYPE_UINT64:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_u642d, desired_type, src, NULL);
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_INT64:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_i642d, desired_type, src, NULL);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_UINT64:
|
||||||
|
switch (b) {
|
||||||
|
case GLSL_TYPE_INT:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_i2u64, src);
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_UINT:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_u2u64, src);
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_BOOL:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_i642u64,
|
||||||
|
new(ctx) ir_expression(ir_unop_b2i64,
|
||||||
|
src));
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_FLOAT:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_f2u64, src);
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_DOUBLE:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_d2u64, src);
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_INT64:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_i642u64, src);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_INT64:
|
||||||
|
switch (b) {
|
||||||
|
case GLSL_TYPE_INT:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_i2i64, src);
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_UINT:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_u2i64, src);
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_BOOL:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_b2i64, src);
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_FLOAT:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_f2i64, src);
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_DOUBLE:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_d2i64, src);
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_UINT64:
|
||||||
|
result = new(ctx) ir_expression(ir_unop_u642i64, src);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(result != NULL);
|
assert(result != NULL);
|
||||||
|
@@ -259,6 +259,26 @@ get_implicit_conversion_operation(const glsl_type *to, const glsl_type *from,
|
|||||||
case GLSL_TYPE_INT: return ir_unop_i2d;
|
case GLSL_TYPE_INT: return ir_unop_i2d;
|
||||||
case GLSL_TYPE_UINT: return ir_unop_u2d;
|
case GLSL_TYPE_UINT: return ir_unop_u2d;
|
||||||
case GLSL_TYPE_FLOAT: return ir_unop_f2d;
|
case GLSL_TYPE_FLOAT: return ir_unop_f2d;
|
||||||
|
case GLSL_TYPE_INT64: return ir_unop_i642d;
|
||||||
|
case GLSL_TYPE_UINT64: return ir_unop_u642d;
|
||||||
|
default: return (ir_expression_operation)0;
|
||||||
|
}
|
||||||
|
|
||||||
|
case GLSL_TYPE_UINT64:
|
||||||
|
if (!state->has_int64())
|
||||||
|
return (ir_expression_operation)0;
|
||||||
|
switch (from->base_type) {
|
||||||
|
case GLSL_TYPE_INT: return ir_unop_i2u64;
|
||||||
|
case GLSL_TYPE_UINT: return ir_unop_u2u64;
|
||||||
|
case GLSL_TYPE_INT64: return ir_unop_i642u64;
|
||||||
|
default: return (ir_expression_operation)0;
|
||||||
|
}
|
||||||
|
|
||||||
|
case GLSL_TYPE_INT64:
|
||||||
|
if (!state->has_int64())
|
||||||
|
return (ir_expression_operation)0;
|
||||||
|
switch (from->base_type) {
|
||||||
|
case GLSL_TYPE_INT: return ir_unop_i2i64;
|
||||||
default: return (ir_expression_operation)0;
|
default: return (ir_expression_operation)0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user