From: Tapani Pälli <tapani.pa...@intel.com> Patch makes following Piglit test pass: arb_gpu_shader_fp64/compiler/implicit-conversions.vert
v2: fix issues in 'can_implicitly_convert_to' and take has_double() in use (Dave Airlie) Signed-off-by: Tapani Pälli <tapani.pa...@intel.com> --- src/glsl/ast_to_hir.cpp | 10 ++++++++++ src/glsl/glsl_types.cpp | 12 ++++++++++++ src/glsl/ir_builder.cpp | 12 ++++++++++++ src/glsl/ir_builder.h | 2 ++ src/mesa/drivers/dri/i965/brw_fs.cpp | 1 + src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 1 + 6 files changed, 38 insertions(+) diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index efebf50..06864da 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -184,6 +184,16 @@ get_conversion_operation(const glsl_type *to, const glsl_type *from, default: return (ir_expression_operation)0; } + case GLSL_TYPE_DOUBLE: + if (!state->has_double()) + return (ir_expression_operation)0; + switch (from->base_type) { + case GLSL_TYPE_INT: return ir_unop_i2d; + case GLSL_TYPE_UINT: return ir_unop_u2d; + case GLSL_TYPE_FLOAT: return ir_unop_f2d; + default: return (ir_expression_operation)0; + } + default: return (ir_expression_operation)0; } } diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp index 649dbc4..6ab1db3 100644 --- a/src/glsl/glsl_types.cpp +++ b/src/glsl/glsl_types.cpp @@ -777,6 +777,18 @@ glsl_type::can_implicitly_convert_to(const glsl_type *desired, desired->base_type == GLSL_TYPE_UINT && this->base_type == GLSL_TYPE_INT) return true; + /* No implicit conversions from double. */ + if ((!state || state->has_double()) && this->is_double()) + return false; + + /* Conversions from different types to double. */ + if ((!state || state->has_double()) && desired->is_double()) { + if (this->is_float()) + return true; + if (this->is_integer()) + return true; + } + return false; } diff --git a/src/glsl/ir_builder.cpp b/src/glsl/ir_builder.cpp index 25789e9..37bbffa 100644 --- a/src/glsl/ir_builder.cpp +++ b/src/glsl/ir_builder.cpp @@ -526,6 +526,18 @@ f2d(operand a) } ir_expression * +i2d(operand a) +{ + return expr(ir_unop_i2d, a); +} + +ir_expression * +u2d(operand a) +{ + return expr(ir_unop_u2d, a); +} + +ir_expression * fma(operand a, operand b, operand c) { return expr(ir_triop_fma, a, b, c); diff --git a/src/glsl/ir_builder.h b/src/glsl/ir_builder.h index 7881288..81571ef 100644 --- a/src/glsl/ir_builder.h +++ b/src/glsl/ir_builder.h @@ -185,6 +185,8 @@ ir_expression *f2b(operand a); ir_expression *b2f(operand a); ir_expression *f2d(operand a); +ir_expression *i2d(operand a); +ir_expression *u2d(operand a); ir_expression *min2(operand a, operand b); ir_expression *max2(operand a, operand b); diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 5f98287..e5dbfe0 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -501,6 +501,7 @@ fs_visitor::type_size(const struct glsl_type *type) case GLSL_TYPE_INT: case GLSL_TYPE_FLOAT: case GLSL_TYPE_BOOL: + case GLSL_TYPE_DOUBLE: return type->components(); case GLSL_TYPE_ARRAY: return type_size(type->fields.array) * type->length; diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index ba163ec..6eeefbf 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -1013,6 +1013,7 @@ fs_visitor::emit_assignment_writes(fs_reg &l, fs_reg &r, { switch (type->base_type) { case GLSL_TYPE_FLOAT: + case GLSL_TYPE_DOUBLE: case GLSL_TYPE_UINT: case GLSL_TYPE_INT: case GLSL_TYPE_BOOL: -- 2.1.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev