From b2a7717717bd36c8412dc4a2f719c21fa479ee18 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Mon, 27 Jun 2022 15:16:41 +1000 Subject: [PATCH] glsl: add explicit half float conversion support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Acked-by: Marek Olšák Part-of: --- src/compiler/glsl/ast_function.cpp | 46 ++++++++++++++++++++ src/compiler/glsl/glsl_to_nir.cpp | 10 +++++ src/compiler/glsl/ir.cpp | 10 +++++ src/compiler/glsl/ir_expression_operation.py | 10 +++++ src/compiler/glsl/ir_validate.cpp | 40 +++++++++++++++++ 5 files changed, 116 insertions(+) diff --git a/src/compiler/glsl/ast_function.cpp b/src/compiler/glsl/ast_function.cpp index 4354485852e..e9f5891b80e 100644 --- a/src/compiler/glsl/ast_function.cpp +++ b/src/compiler/glsl/ast_function.cpp @@ -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; diff --git a/src/compiler/glsl/glsl_to_nir.cpp b/src/compiler/glsl/glsl_to_nir.cpp index ed3fa9a91ed..456efa9d583 100644 --- a/src/compiler/glsl/glsl_to_nir.cpp +++ b/src/compiler/glsl/glsl_to_nir.cpp @@ -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: diff --git a/src/compiler/glsl/ir.cpp b/src/compiler/glsl/ir.cpp index fa7a4321b01..e8979da0c17 100644 --- a/src/compiler/glsl/ir.cpp +++ b/src/compiler/glsl/ir.cpp @@ -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: diff --git a/src/compiler/glsl/ir_expression_operation.py b/src/compiler/glsl/ir_expression_operation.py index 1d9a9aec1de..78804a34b82 100644 --- a/src/compiler/glsl/ir_expression_operation.py +++ b/src/compiler/glsl/ir_expression_operation.py @@ -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}"), diff --git a/src/compiler/glsl/ir_validate.cpp b/src/compiler/glsl/ir_validate.cpp index e71f60c32ca..b69b66b7414 100644 --- a/src/compiler/glsl/ir_validate.cpp +++ b/src/compiler/glsl/ir_validate.cpp @@ -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));