i965/fs: Allow LRPs with uniform registers.
authorEric Anholt <eric@anholt.net>
Fri, 26 Apr 2013 03:20:05 +0000 (20:20 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 29 Apr 2013 18:41:35 +0000 (11:41 -0700)
Improves GLB2.7 performance on my HSW by 0.671455% +/- 0.225037% (n=62).

v2: Make is_valid_3src() a method of the fs_reg. (recommended by Ken)

Reviewed-by: Matt Turner <mattst88@gmail.com> (v1)
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> (v1)
src/mesa/drivers/dri/i965/brw_fs.cpp
src/mesa/drivers/dri/i965/brw_fs.h
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp

index b45035e80f038cc9e85da1844a72f7fc531e7545..a8610eea92ac60b481db741b326cef31b8dd6c59 100644 (file)
@@ -444,6 +444,12 @@ fs_reg::is_one() const
    return type == BRW_REGISTER_TYPE_F ? imm.f == 1.0 : imm.i == 1;
 }
 
+bool
+fs_reg::is_valid_3src() const
+{
+   return file == GRF || file == UNIFORM;
+}
+
 int
 fs_visitor::type_size(const struct glsl_type *type)
 {
index efe90f4ae0114b619e3812908f11afe9f0cd9879..c9c9856748d8e68645c8442f7188d53cf148ccbe 100644 (file)
@@ -93,6 +93,7 @@ public:
    bool equals(const fs_reg &r) const;
    bool is_zero() const;
    bool is_one() const;
+   bool is_valid_3src() const;
 
    /** Register file: ARF, GRF, MRF, IMM. */
    enum register_file file;
index f1539d5c3a7f45568388db23112c263ed75daf0b..55ae68988669b62d402f5b899c747907958cb578 100644 (file)
@@ -201,7 +201,10 @@ fs_visitor::visit(ir_dereference_array *ir)
 void
 fs_visitor::emit_lrp(fs_reg dst, fs_reg x, fs_reg y, fs_reg a)
 {
-   if (intel->gen < 6 || x.file != GRF || y.file != GRF || a.file != GRF) {
+   if (intel->gen < 6 ||
+       !x.is_valid_3src() ||
+       !y.is_valid_3src() ||
+       !a.is_valid_3src()) {
       /* We can't use the LRP instruction.  Emit x*(1-a) + y*a. */
       fs_reg y_times_a           = fs_reg(this, glsl_type::float_type);
       fs_reg one_minus_a         = fs_reg(this, glsl_type::float_type);