Mesa (fp64_pack32x2): i965/fs: Add support for ir_unop_pack_double_2x32

Topi Pohjolainen tpohjola at kemper.freedesktop.org
Wed Sep 3 09:30:44 UTC 2014


Module: Mesa
Branch: fp64_pack32x2
Commit: 90f8de5a433a78e1e1170b26d4b96bb6f311306c
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=90f8de5a433a78e1e1170b26d4b96bb6f311306c

Author: Topi Pohjolainen <topi.pohjolainen at intel.com>
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 <topi.pohjolainen at intel.com>

---

 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;
    }




More information about the mesa-commit mailing list