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:
committed by
Marge Bot
parent
edbe1b5bb4
commit
b2a7717717
@@ -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;
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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}"),
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user