Handle non 64bit sources (airlied) Signed-off-by: Elie Tournier <elie.tourn...@collabora.com> --- src/compiler/glsl/ir_optimization.h | 1 + src/compiler/glsl/lower_64bit.cpp | 49 ++++++++++++++++++++++++------ src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 3 +- 3 files changed, 43 insertions(+), 10 deletions(-)
diff --git a/src/compiler/glsl/ir_optimization.h b/src/compiler/glsl/ir_optimization.h index aa71dfdb39..5d1118d0cf 100644 --- a/src/compiler/glsl/ir_optimization.h +++ b/src/compiler/glsl/ir_optimization.h @@ -69,6 +69,7 @@ #define LT64 (1U << 8) #define ADD64 (1U << 9) #define D2U (1U << 10) +#define U2D (1U << 11) /** * \see class lower_packing_builtins_visitor diff --git a/src/compiler/glsl/lower_64bit.cpp b/src/compiler/glsl/lower_64bit.cpp index 0b9d466b9d..38b0420baa 100644 --- a/src/compiler/glsl/lower_64bit.cpp +++ b/src/compiler/glsl/lower_64bit.cpp @@ -52,7 +52,7 @@ using namespace ir_builder; namespace lower_64bit { void expand_source(ir_factory &, ir_rvalue *val, ir_variable **expanded_src); - +void extract_source(ir_factory &, ir_rvalue *val, ir_variable **extracted_src); ir_dereference_variable *compact_destination(ir_factory &, const glsl_type *type, ir_variable *result[4]); @@ -124,7 +124,7 @@ private: ir_factory added_functions; ir_rvalue *handle_op(ir_expression *ir, const char *function_name, - function_generator generator); + function_generator generator, bool conv_to_double = false); }; } /* anonymous namespace */ @@ -245,6 +245,25 @@ lower_64bit::expand_source(ir_factory &body, expanded_src[i] = expanded_src[0]; } +void +lower_64bit::extract_source(ir_factory &body, + ir_rvalue *val, + ir_variable **extracted_src) +{ + ir_variable *const temp = body.make_temp(val->type, "tmp"); + + body.emit(assign(temp, val)); + unsigned i; + for (i = 0; i < val->type->vector_elements; i++) { + extracted_src[i] = body.make_temp(val->type->get_scalar_type(), "extracted_source"); + + body.emit(assign(extracted_src[i], swizzle(temp, i, 1))); + } + + for (/* empty */; i < 4; i++) + extracted_src[i] = extracted_src[0]; +} + /** * Convert a series of uvec2 results into a single 64-bit integer vector */ @@ -315,7 +334,10 @@ lower_64bit::lower_op_to_function_call(ir_instruction *base_ir, ir_factory body(&instructions, mem_ctx); for (unsigned i = 0; i < num_operands; i++) { - expand_source(body, ir->operands[i], src[i]); + if (ir->operands[i]->type->is_64bit()) + expand_source(body, ir->operands[i], src[i]); + else + extract_source(body, ir->operands[i], src[i]); if (ir->operands[i]->type->vector_elements > source_components) source_components = ir->operands[i]->type->vector_elements; @@ -365,13 +387,15 @@ lower_64bit::lower_op_to_function_call(ir_instruction *base_ir, ir_rvalue * lower_64bit_visitor::handle_op(ir_expression *ir, const char *function_name, - function_generator generator) + function_generator generator, + bool conv_to_double) { - for (unsigned i = 0; i < ir->get_num_operands(); i++) - if (!ir->operands[i]->type->is_integer_64() && - !ir->operands[i]->type->is_double()) - return ir; - + if (conv_to_double == false) { + for (unsigned i = 0; i < ir->num_operands; i++) + if (!ir->operands[i]->type->is_integer_64() && + !ir->operands[i]->type->is_double()) + return ir; + } /* Get a handle to the correct ir_function_signature for the core * operation. */ @@ -435,6 +459,13 @@ lower_64bit_visitor::handle_rvalue(ir_rvalue **rvalue) } break; + case ir_unop_u2d: + if (lowering(U2D)) { + if (ir->type->base_type == GLSL_TYPE_DOUBLE) + *rvalue = handle_op(ir, "__builtin_uint_to_fp64", generate_ir::uint_to_fp64, true); + } + break; + case ir_binop_add: if (lowering(ADD64)) { if (ir->type->base_type == GLSL_TYPE_DOUBLE) diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index de5a499f8d..df815a86d1 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -7066,7 +7066,8 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog) LT64 | ADD64 | MUL64 | - D2U; + D2U | + U2D; lower_64bit_double_instructions(ir, lower_inst); } -- 2.14.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev