Signed-off-by: Topi Pohjolainen <topi.pohjolai...@intel.com> --- src/compiler/glsl/glsl_to_nir.cpp | 6 ++++++ src/compiler/glsl/ir_expression_operation.py | 16 ++++++++++++++-- src/compiler/glsl/ir_validate.cpp | 24 ++++++++++++++++++++++++ src/mesa/program/ir_to_mesa.cpp | 6 ++++++ src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 6 ++++++ 5 files changed, 56 insertions(+), 2 deletions(-)
diff --git a/src/compiler/glsl/glsl_to_nir.cpp b/src/compiler/glsl/glsl_to_nir.cpp index 14c358465b..c0adf744e0 100644 --- a/src/compiler/glsl/glsl_to_nir.cpp +++ b/src/compiler/glsl/glsl_to_nir.cpp @@ -1563,6 +1563,12 @@ nir_visitor::visit(ir_expression *ir) case ir_unop_u2d: case ir_unop_h2f: case ir_unop_f2h: + case ir_unop_h2u: + case ir_unop_u2h: + case ir_unop_h2i: + case ir_unop_i2h: + case ir_unop_h2b: + case ir_unop_b2h: case ir_unop_i642i: case ir_unop_i642u: case ir_unop_i642f: diff --git a/src/compiler/glsl/ir_expression_operation.py b/src/compiler/glsl/ir_expression_operation.py index 3158533c02..0316d1a82d 100644 --- a/src/compiler/glsl/ir_expression_operation.py +++ b/src/compiler/glsl/ir_expression_operation.py @@ -461,10 +461,22 @@ ir_expression_operation = [ operation("u2d", 1, source_types=(uint_type,), dest_type=double_type, c_expression="{src0}"), # Double-to-boolean conversion. operation("d2b", 1, source_types=(double_type,), dest_type=bool_type, c_expression="{src0} != 0.0"), - # hafl-to-float conversion. + # half-to-float conversion. operation("h2f", 1, source_types=(float16_t_type,), dest_type=float_type, c_expression="{src0}"), - # hafl-to-float conversion. + # float-to-half conversion. operation("f2h", 1, source_types=(float_type,), dest_type=float16_t_type, c_expression="{src0}"), + # half-to-unsigned conversion. + operation("h2u", 1, source_types=(float16_t_type,), dest_type=uint_type, c_expression="{src0}"), + # unsigned-to-half conversion. + operation("u2h", 1, source_types=(uint_type,), dest_type=float16_t_type, c_expression="{src0}"), + # half-to-integer conversion. + operation("h2i", 1, source_types=(float16_t_type,), dest_type=int_type, c_expression="{src0}"), + # integer-to-half conversion. + operation("i2h", 1, source_types=(int_type,), dest_type=float16_t_type, c_expression="{src0}"), + # half-to-boolean conversion. + operation("h2b", 1, source_types=(float16_t_type,), dest_type=bool_type, c_expression="{src0} != 0.0"), + # boolean-to-half conversion. + operation("b2h", 1, source_types=(bool_type,), dest_type=float16_t_type, c_expression="{src0} ? 1.0F : 0.0F"), # 'Bit-identical int-to-float "conversion" operation("bitcast_i2f", 1, source_types=(int_type,), dest_type=float_type, c_expression="bitcast_u2f({src0})"), # 'Bit-identical float-to-int "conversion" diff --git a/src/compiler/glsl/ir_validate.cpp b/src/compiler/glsl/ir_validate.cpp index 29e3cda865..a20f52e527 100644 --- a/src/compiler/glsl/ir_validate.cpp +++ b/src/compiler/glsl/ir_validate.cpp @@ -603,6 +603,30 @@ ir_validate::visit_leave(ir_expression *ir) assert(ir->operands[0]->type->is_float()); assert(ir->type->base_type == GLSL_TYPE_FLOAT16); break; + case ir_unop_h2u: + assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT16); + assert(ir->type->base_type == GLSL_TYPE_UINT); + break; + case ir_unop_u2h: + assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT); + assert(ir->type->base_type == GLSL_TYPE_FLOAT16); + break; + case ir_unop_h2i: + assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT16); + assert(ir->type->base_type == GLSL_TYPE_INT); + break; + case ir_unop_i2h: + assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT); + assert(ir->type->base_type == GLSL_TYPE_FLOAT16); + break; + case ir_unop_h2b: + assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT16); + assert(ir->type->is_boolean()); + break; + case ir_unop_b2h: + assert(ir->operands[0]->type->is_boolean()); + assert(ir->type->base_type == GLSL_TYPE_FLOAT16); + break; case ir_unop_frexp_sig: assert(ir->operands[0]->type->is_float() || diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp index d57e50366e..286b9e07bf 100644 --- a/src/mesa/program/ir_to_mesa.cpp +++ b/src/mesa/program/ir_to_mesa.cpp @@ -1315,6 +1315,12 @@ ir_to_mesa_visitor::visit(ir_expression *ir) case ir_unop_d2b: case ir_unop_h2f: case ir_unop_f2h: + case ir_unop_h2u: + case ir_unop_u2h: + case ir_unop_h2i: + case ir_unop_i2h: + case ir_unop_h2b: + case ir_unop_b2h: case ir_unop_frexp_sig: case ir_unop_frexp_exp: assert(!"not supported"); diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index f8cb94c7dc..3ccccbe7bd 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -1799,6 +1799,12 @@ glsl_to_tgsi_visitor::visit_expression(ir_expression* ir, st_src_reg *op) break; case ir_unop_h2f: case ir_unop_f2h: + case ir_unop_h2u: + case ir_unop_u2h: + case ir_unop_h2i: + case ir_unop_i2h: + case ir_unop_h2b: + case ir_unop_b2h: unreachable("not implemented yet"); case ir_unop_bitcast_u642d: case ir_unop_bitcast_i642d: -- 2.11.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev