Module: Mesa Branch: fp64_pack32x2 Commit: 90f8de5a433a78e1e1170b26d4b96bb6f311306c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=90f8de5a433a78e1e1170b26d4b96bb6f311306c
Author: Topi Pohjolainen <[email protected]> Date: Wed Sep 3 12:24:07 2014 +0300 i965/fs: Add support for ir_unop_pack_double_2x32 TODO: I had to disable front-end optimizations to prevent eternal looping. Signed-off-by: Topi Pohjolainen <[email protected]> --- src/glsl/glsl_parser_extras.cpp | 2 ++ src/mesa/drivers/dri/i965/brw_fs.h | 6 +++++ .../dri/i965/brw_fs_channel_expressions.cpp | 2 ++ src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 25 ++++++++++++++++++++ 4 files changed, 35 insertions(+) diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp index e8a0a32..f57371a 100644 --- a/src/glsl/glsl_parser_extras.cpp +++ b/src/glsl/glsl_parser_extras.cpp @@ -1569,6 +1569,7 @@ do_common_optimization(exec_list *ir, bool linked, } progress = do_if_simplification(ir) || progress; progress = opt_flatten_nested_if_blocks(ir) || progress; +#if 0 progress = do_copy_propagation(ir) || progress; progress = do_copy_propagation_elements(ir) || progress; @@ -1602,6 +1603,7 @@ do_common_optimization(exec_list *ir, bool linked, progress = optimize_split_arrays(ir, linked) || progress; progress = optimize_redundant_jumps(ir) || progress; +#endif loop_state *ls = analyze_loop_variables(ir); if (ls->loop_found) { diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h index c2bc1f0..59f5e77 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.h +++ b/src/mesa/drivers/dri/i965/brw_fs.h @@ -444,6 +444,8 @@ public: void emit_interpolate_expression(ir_expression *ir); + void emit_pack32(ir_expression *ir); + bool try_rewrite_rhs_to_dst(ir_assignment *ir, fs_reg dst, fs_reg src, @@ -654,6 +656,10 @@ private: struct brw_reg dst, struct brw_reg x, struct brw_reg y); + void generate_pack_double_2x32(fs_inst *inst, + struct brw_reg dst, + struct brw_reg hi, + struct brw_reg lo); void generate_unpack_half_2x16_split(fs_inst *inst, struct brw_reg dst, struct brw_reg src); diff --git a/src/mesa/drivers/dri/i965/brw_fs_channel_expressions.cpp b/src/mesa/drivers/dri/i965/brw_fs_channel_expressions.cpp index 898ab54..293256c 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_channel_expressions.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_channel_expressions.cpp @@ -169,6 +169,7 @@ ir_channel_expressions_visitor::visit_leave(ir_assignment *ir) case ir_unop_interpolate_at_centroid: case ir_binop_interpolate_at_offset: case ir_binop_interpolate_at_sample: + case ir_unop_pack_double_2x32: return visit_continue; default: @@ -447,6 +448,7 @@ ir_channel_expressions_visitor::visit_leave(ir_assignment *ir) unreachable("not reached: expression operates on scalars only"); case ir_unop_pack_double_2x32: + unreachable("not reached: expression merges the input vector"); case ir_unop_unpack_double_2x32: case ir_unop_frexp_sig: case ir_unop_frexp_exp: diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index f80b2db..99fdb9e 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -472,6 +472,27 @@ fs_visitor::emit_interpolate_expression(ir_expression *ir) } void +fs_visitor::emit_pack32(ir_expression *ir) +{ + assert(ir->operands[0]->type == glsl_type::uvec2_type); + + ir_dereference *src = ir->operands[0]->as_dereference(); + ir_swizzle *src_hi_swiz = new(mem_ctx) ir_swizzle(src, 0, 0, 0, 0, 1); + ir_swizzle *src_lo_swiz = new(mem_ctx) ir_swizzle(src, 1, 0, 0, 0, 1); + + src_hi_swiz->accept(this); + fs_reg hi_src(this->result); + + src_lo_swiz->accept(this); + fs_reg lo_src(this->result); + + fs_reg tmp(this, glsl_type::double_type); + emit(FS_OPCODE_PACK_DOUBLE_2x32, tmp, hi_src, lo_src); + + this->result = tmp; +} + +void fs_visitor::visit(ir_expression *ir) { unsigned int operand; @@ -496,6 +517,10 @@ fs_visitor::visit(ir_expression *ir) emit_interpolate_expression(ir); return; + case ir_unop_pack_double_2x32: + emit_pack32(ir); + return; + default: break; } _______________________________________________ mesa-commit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-commit
