[Mesa-dev] [RFC 05/16] glsl: Allow half float type to be used where-ever float is supported
Topi Pohjolainen
topi.pohjolainen at intel.com
Fri May 15 02:39:32 PDT 2015
Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
---
src/glsl/glsl_types.h | 2 +-
src/glsl/ir_validate.cpp | 36 ++++++++++++++++++++++++------------
2 files changed, 25 insertions(+), 13 deletions(-)
diff --git a/src/glsl/glsl_types.h b/src/glsl/glsl_types.h
index d58718e..b90aa28 100644
--- a/src/glsl/glsl_types.h
+++ b/src/glsl/glsl_types.h
@@ -443,7 +443,7 @@ struct glsl_type {
*/
bool is_float() const
{
- return base_type == GLSL_TYPE_FLOAT;
+ return base_type == GLSL_TYPE_FLOAT || base_type == GLSL_TYPE_HALF;
}
/**
diff --git a/src/glsl/ir_validate.cpp b/src/glsl/ir_validate.cpp
index cfe0df3..0669d9f 100644
--- a/src/glsl/ir_validate.cpp
+++ b/src/glsl/ir_validate.cpp
@@ -262,24 +262,29 @@ ir_validate::visit_leave(ir_expression *ir)
break;
case ir_unop_f2i:
- assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT);
+ assert(ir->operands[0]->type->base_type == GLSL_TYPE_HALF ||
+ ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT);
assert(ir->type->base_type == GLSL_TYPE_INT);
break;
case ir_unop_f2u:
- assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT);
+ assert(ir->operands[0]->type->base_type == GLSL_TYPE_HALF ||
+ ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT);
assert(ir->type->base_type == GLSL_TYPE_UINT);
break;
case ir_unop_i2f:
assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT);
- assert(ir->type->base_type == GLSL_TYPE_FLOAT);
+ assert(ir->type->base_type == GLSL_TYPE_HALF ||
+ ir->type->base_type == GLSL_TYPE_FLOAT);
break;
case ir_unop_f2b:
- assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT);
+ assert(ir->operands[0]->type->base_type == GLSL_TYPE_HALF ||
+ ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT);
assert(ir->type->base_type == GLSL_TYPE_BOOL);
break;
case ir_unop_b2f:
assert(ir->operands[0]->type->base_type == GLSL_TYPE_BOOL);
- assert(ir->type->base_type == GLSL_TYPE_FLOAT);
+ assert(ir->type->base_type == GLSL_TYPE_HALF ||
+ ir->type->base_type == GLSL_TYPE_FLOAT);
break;
case ir_unop_i2b:
assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT);
@@ -291,7 +296,8 @@ ir_validate::visit_leave(ir_expression *ir)
break;
case ir_unop_u2f:
assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT);
- assert(ir->type->base_type == GLSL_TYPE_FLOAT);
+ assert(ir->type->base_type == GLSL_TYPE_HALF ||
+ ir->type->base_type == GLSL_TYPE_FLOAT);
break;
case ir_unop_i2u:
assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT);
@@ -328,7 +334,8 @@ ir_validate::visit_leave(ir_expression *ir)
case ir_unop_ceil:
case ir_unop_floor:
case ir_unop_fract:
- assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT ||
+ assert(ir->operands[0]->type->base_type == GLSL_TYPE_HALF ||
+ ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT ||
ir->operands[0]->type->base_type == GLSL_TYPE_DOUBLE);
assert(ir->operands[0]->type == ir->type);
break;
@@ -340,7 +347,8 @@ ir_validate::visit_leave(ir_expression *ir)
case ir_unop_dFdy:
case ir_unop_dFdy_coarse:
case ir_unop_dFdy_fine:
- assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT);
+ assert(ir->operands[0]->type->base_type == GLSL_TYPE_HALF ||
+ ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT);
assert(ir->operands[0]->type == ir->type);
break;
@@ -547,9 +555,11 @@ ir_validate::visit_leave(ir_expression *ir)
break;
case ir_binop_dot:
- assert(ir->type == glsl_type::float_type ||
+ assert(ir->type == glsl_type::hfloat_type ||
+ ir->type == glsl_type::float_type ||
ir->type == glsl_type::double_type);
- assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT ||
+ assert(ir->operands[0]->type->base_type == GLSL_TYPE_HALF ||
+ ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT ||
ir->operands[0]->type->base_type == GLSL_TYPE_DOUBLE);
assert(ir->operands[0]->type->is_vector());
assert(ir->operands[0]->type == ir->operands[1]->type);
@@ -602,7 +612,8 @@ ir_validate::visit_leave(ir_expression *ir)
break;
case ir_triop_fma:
- assert(ir->type->base_type == GLSL_TYPE_FLOAT ||
+ assert(ir->type->base_type == GLSL_TYPE_HALF ||
+ ir->type->base_type == GLSL_TYPE_FLOAT ||
ir->type->base_type == GLSL_TYPE_DOUBLE);
assert(ir->type == ir->operands[0]->type);
assert(ir->type == ir->operands[1]->type);
@@ -610,7 +621,8 @@ ir_validate::visit_leave(ir_expression *ir)
break;
case ir_triop_lrp:
- assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT ||
+ assert(ir->operands[0]->type->base_type == GLSL_TYPE_HALF ||
+ ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT ||
ir->operands[0]->type->base_type == GLSL_TYPE_DOUBLE);
assert(ir->operands[0]->type == ir->operands[1]->type);
assert(ir->operands[2]->type == ir->operands[0]->type ||
--
1.9.3
More information about the mesa-dev
mailing list