glsl: add explicit half float conversion support

Acked-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18540>
This commit is contained in:
Timothy Arceri
2022-06-27 15:16:41 +10:00
committed by Marge Bot
parent edbe1b5bb4
commit b2a7717717
5 changed files with 116 additions and 0 deletions
+46
View File
@@ -889,6 +889,9 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type)
case GLSL_TYPE_INT:
result = new(ctx) ir_expression(ir_unop_i2u, src);
break;
case GLSL_TYPE_FLOAT16:
result = new(ctx) ir_expression(ir_unop_f162u, src);
break;
case GLSL_TYPE_FLOAT:
result = new(ctx) ir_expression(ir_unop_f2u, src);
break;
@@ -919,6 +922,9 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type)
case GLSL_TYPE_UINT:
result = new(ctx) ir_expression(ir_unop_u2i, src);
break;
case GLSL_TYPE_FLOAT16:
result = new(ctx) ir_expression(ir_unop_f162i, src);
break;
case GLSL_TYPE_FLOAT:
result = new(ctx) ir_expression(ir_unop_f2i, src);
break;
@@ -936,6 +942,31 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type)
break;
}
break;
case GLSL_TYPE_FLOAT16:
switch (b) {
case GLSL_TYPE_UINT:
result = new(ctx) ir_expression(ir_unop_u2f16, desired_type, src, NULL);
break;
case GLSL_TYPE_INT:
result = new(ctx) ir_expression(ir_unop_i2f16, desired_type, src, NULL);
break;
case GLSL_TYPE_BOOL:
result = new(ctx) ir_expression(ir_unop_b2f16, desired_type, src, NULL);
break;
case GLSL_TYPE_FLOAT:
result = new(ctx) ir_expression(ir_unop_f2f16, desired_type, src, NULL);
break;
case GLSL_TYPE_DOUBLE:
result = new(ctx) ir_expression(ir_unop_d2f16, desired_type, src, NULL);
break;
case GLSL_TYPE_UINT64:
result = new(ctx) ir_expression(ir_unop_u642f16, desired_type, src, NULL);
break;
case GLSL_TYPE_INT64:
result = new(ctx) ir_expression(ir_unop_i642f16, desired_type, src, NULL);
break;
}
break;
case GLSL_TYPE_FLOAT:
switch (b) {
case GLSL_TYPE_UINT:
@@ -947,6 +978,9 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type)
case GLSL_TYPE_BOOL:
result = new(ctx) ir_expression(ir_unop_b2f, desired_type, src, NULL);
break;
case GLSL_TYPE_FLOAT16:
result = new(ctx) ir_expression(ir_unop_f162f, desired_type, src, NULL);
break;
case GLSL_TYPE_DOUBLE:
result = new(ctx) ir_expression(ir_unop_d2f, desired_type, src, NULL);
break;
@@ -968,6 +1002,9 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type)
case GLSL_TYPE_INT:
result = new(ctx) ir_expression(ir_unop_i2b, desired_type, src, NULL);
break;
case GLSL_TYPE_FLOAT16:
result = new(ctx) ir_expression(ir_unop_f162b, desired_type, src, NULL);
break;
case GLSL_TYPE_FLOAT:
result = new(ctx) ir_expression(ir_unop_f2b, desired_type, src, NULL);
break;
@@ -997,6 +1034,9 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type)
new(ctx) ir_expression(ir_unop_b2f,
src));
break;
case GLSL_TYPE_FLOAT16:
result = new(ctx) ir_expression(ir_unop_f162d, desired_type, src, NULL);
break;
case GLSL_TYPE_FLOAT:
result = new(ctx) ir_expression(ir_unop_f2d, desired_type, src, NULL);
break;
@@ -1021,6 +1061,9 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type)
new(ctx) ir_expression(ir_unop_b2i64,
src));
break;
case GLSL_TYPE_FLOAT16:
result = new(ctx) ir_expression(ir_unop_f162u64, src);
break;
case GLSL_TYPE_FLOAT:
result = new(ctx) ir_expression(ir_unop_f2u64, src);
break;
@@ -1043,6 +1086,9 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type)
case GLSL_TYPE_BOOL:
result = new(ctx) ir_expression(ir_unop_b2i64, src);
break;
case GLSL_TYPE_FLOAT16:
result = new(ctx) ir_expression(ir_unop_f162i64, src);
break;
case GLSL_TYPE_FLOAT:
result = new(ctx) ir_expression(ir_unop_f2i64, src);
break;
+10
View File
@@ -1861,10 +1861,20 @@ nir_visitor::visit(ir_expression *ir)
case ir_unop_b2i64:
case ir_unop_d2f:
case ir_unop_f2d:
case ir_unop_f162u:
case ir_unop_u2f16:
case ir_unop_f162i:
case ir_unop_i2f16:
case ir_unop_f162f:
case ir_unop_f2f16:
case ir_unop_f162b:
case ir_unop_b2f16:
case ir_unop_f162d:
case ir_unop_d2f16:
case ir_unop_f162u64:
case ir_unop_u642f16:
case ir_unop_f162i64:
case ir_unop_i642f16:
case ir_unop_i2i:
case ir_unop_u2u:
case ir_unop_d2i:
+10
View File
@@ -255,6 +255,7 @@ ir_expression::ir_expression(int op, ir_rvalue *op0)
this->type = op0->type;
break;
case ir_unop_f162i:
case ir_unop_f2i:
case ir_unop_b2i:
case ir_unop_u2i:
@@ -284,6 +285,11 @@ ir_expression::ir_expression(int op, ir_rvalue *op0)
case ir_unop_f2f16:
case ir_unop_f2fmp:
case ir_unop_b2f16:
case ir_unop_i2f16:
case ir_unop_u2f16:
case ir_unop_d2f16:
case ir_unop_i642f16:
case ir_unop_u642f16:
this->type = glsl_simple_type(GLSL_TYPE_FLOAT16, op0->type->vector_elements, 1);
break;
@@ -321,6 +327,7 @@ ir_expression::ir_expression(int op, ir_rvalue *op0)
this->type = glsl_simple_type(GLSL_TYPE_BOOL, op0->type->vector_elements, 1);
break;
case ir_unop_f162d:
case ir_unop_f2d:
case ir_unop_i2d:
case ir_unop_u2d:
@@ -330,6 +337,7 @@ ir_expression::ir_expression(int op, ir_rvalue *op0)
break;
case ir_unop_i2u:
case ir_unop_f162u:
case ir_unop_f2u:
case ir_unop_d2u:
case ir_unop_bitcast_f2u:
@@ -341,6 +349,7 @@ ir_expression::ir_expression(int op, ir_rvalue *op0)
case ir_unop_i2i64:
case ir_unop_u2i64:
case ir_unop_b2i64:
case ir_unop_f162i64:
case ir_unop_f2i64:
case ir_unop_d2i64:
case ir_unop_u642i64:
@@ -349,6 +358,7 @@ ir_expression::ir_expression(int op, ir_rvalue *op0)
case ir_unop_i2u64:
case ir_unop_u2u64:
case ir_unop_f162u64:
case ir_unop_f2u64:
case ir_unop_d2u64:
case ir_unop_i642u64:
@@ -490,6 +490,16 @@ ir_expression_operation = [
operation("f2f16", 1, source_types=(float_type,), dest_type=float_type, c_expression="{src0}"),
operation("f2fmp", 1, source_types=(float_type,), dest_type=float_type, c_expression="{src0}"),
operation("f162f", 1, source_types=(float_type,), dest_type=float_type, c_expression="{src0}"),
operation("u2f16", 1, source_types=(uint_type,), dest_type=float_type, c_expression="{src0}"),
operation("f162u", 1, source_types=(float_type,), dest_type=uint_type, c_expression="{src0}"),
operation("i2f16", 1, source_types=(int_type,), dest_type=float_type, c_expression="{src0}"),
operation("f162i", 1, source_types=(float_type,), dest_type=int_type, c_expression="{src0}"),
operation("d2f16", 1, source_types=(double_type,), dest_type=float_type, c_expression="{src0}"),
operation("f162d", 1, source_types=(float_type,), dest_type=double_type, c_expression="{src0}"),
operation("u642f16", 1, source_types=(uint64_type,), dest_type=float_type, c_expression="{src0}"),
operation("f162u64", 1, source_types=(float_type,), dest_type=uint64_type, c_expression="{src0}"),
operation("i642f16", 1, source_types=(int64_type,), dest_type=float_type, c_expression="{src0}"),
operation("f162i64", 1, source_types=(float_type,), dest_type=int64_type, c_expression="{src0}"),
# int16<->int32 conversion.
operation("i2i", 1, source_types=(int_type,), dest_type=int_type, c_expression="{src0}"),
operation("i2imp", 1, source_types=(int_type,), dest_type=int_type, c_expression="{src0}"),
+40
View File
@@ -694,6 +694,46 @@ ir_validate::visit_leave(ir_expression *ir)
assert(glsl_type_is_double(ir->operands[0]->type));
assert(glsl_type_is_boolean(ir->type));
break;
case ir_unop_u2f16:
assert(ir->type->base_type == GLSL_TYPE_FLOAT16);
assert(glsl_type_is_uint_16_32(ir->operands[0]->type));
break;
case ir_unop_f162u:
assert(glsl_type_is_uint_16_32(ir->type));
assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT16);
break;
case ir_unop_i2f16:
assert(ir->type->base_type == GLSL_TYPE_FLOAT16);
assert(glsl_type_is_int_16_32(ir->operands[0]->type));
break;
case ir_unop_f162i:
assert(glsl_type_is_int_16_32(ir->type));
assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT16);
break;
case ir_unop_d2f16:
assert(ir->type->base_type == GLSL_TYPE_FLOAT16);
assert(glsl_type_is_double(ir->operands[0]->type));
break;
case ir_unop_f162d:
assert(glsl_type_is_double(ir->type));
assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT16);
break;
case ir_unop_u642f16:
assert(ir->type->base_type == GLSL_TYPE_FLOAT16);
assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT64);
break;
case ir_unop_f162u64:
assert(ir->type->base_type == GLSL_TYPE_UINT64);
assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT16);
break;
case ir_unop_i642f16:
assert(ir->type->base_type == GLSL_TYPE_FLOAT16);
assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT64);
break;
case ir_unop_f162i64:
assert(ir->type->base_type == GLSL_TYPE_INT64);
assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT16);
break;
case ir_unop_frexp_sig:
assert(glsl_type_is_float_32_64(ir->operands[0]->type));