summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2013-04-25 20:20:05 -0700
committerEric Anholt <eric@anholt.net>2013-04-29 11:41:35 -0700
commit61ca2c4f73f84eec29454698188309ab311eb503 (patch)
tree4e8017f1e796ac34a3d1ef6bcdc080ea38fccd79
parentde7e8b1d014aaecf87c2b26e8ab7e89266d5e176 (diff)
i965/fs: Allow LRPs with uniform registers.
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)
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs.cpp6
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs.h1
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs_visitor.cpp5
3 files changed, 11 insertions, 1 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index b45035e80f0..a8610eea92a 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -444,6 +444,12 @@ fs_reg::is_one() const
444 return type == BRW_REGISTER_TYPE_F ? imm.f == 1.0 : imm.i == 1; 444 return type == BRW_REGISTER_TYPE_F ? imm.f == 1.0 : imm.i == 1;
445} 445}
446 446
447bool
448fs_reg::is_valid_3src() const
449{
450 return file == GRF || file == UNIFORM;
451}
452
447int 453int
448fs_visitor::type_size(const struct glsl_type *type) 454fs_visitor::type_size(const struct glsl_type *type)
449{ 455{
diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
index efe90f4ae01..c9c9856748d 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.h
+++ b/src/mesa/drivers/dri/i965/brw_fs.h
@@ -93,6 +93,7 @@ public:
93 bool equals(const fs_reg &r) const; 93 bool equals(const fs_reg &r) const;
94 bool is_zero() const; 94 bool is_zero() const;
95 bool is_one() const; 95 bool is_one() const;
96 bool is_valid_3src() const;
96 97
97 /** Register file: ARF, GRF, MRF, IMM. */ 98 /** Register file: ARF, GRF, MRF, IMM. */
98 enum register_file file; 99 enum register_file file;
diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index f1539d5c3a7..55ae6898866 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -201,7 +201,10 @@ fs_visitor::visit(ir_dereference_array *ir)
201void 201void
202fs_visitor::emit_lrp(fs_reg dst, fs_reg x, fs_reg y, fs_reg a) 202fs_visitor::emit_lrp(fs_reg dst, fs_reg x, fs_reg y, fs_reg a)
203{ 203{
204 if (intel->gen < 6 || x.file != GRF || y.file != GRF || a.file != GRF) { 204 if (intel->gen < 6 ||
205 !x.is_valid_3src() ||
206 !y.is_valid_3src() ||
207 !a.is_valid_3src()) {
205 /* We can't use the LRP instruction. Emit x*(1-a) + y*a. */ 208 /* We can't use the LRP instruction. Emit x*(1-a) + y*a. */
206 fs_reg y_times_a = fs_reg(this, glsl_type::float_type); 209 fs_reg y_times_a = fs_reg(this, glsl_type::float_type);
207 fs_reg one_minus_a = fs_reg(this, glsl_type::float_type); 210 fs_reg one_minus_a = fs_reg(this, glsl_type::float_type);