summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2012-11-30 22:29:26 -0800
committerEric Anholt <eric@anholt.net>2012-12-14 16:06:30 -0800
commit471af25fc57dc43a8277b4b17ec82547287621d0 (patch)
tree9ae9b8d4136083af11b830b4e1459c1c097d1639 /src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp
parenta76a03f437df3c6458da5b0e9e70fd4d986fbdae (diff)
downloadexternal_mesa3d-471af25fc57dc43a8277b4b17ec82547287621d0.zip
external_mesa3d-471af25fc57dc43a8277b4b17ec82547287621d0.tar.gz
external_mesa3d-471af25fc57dc43a8277b4b17ec82547287621d0.tar.bz2
i965/vs: Extend opt_compute_to_mrf to handle limited "reswizzling"
The way our visitor works, scalar expression/swizzle results that get stored in channels other than .x will have an intermediate MOV from their result in the .x channel to the real .y (or whatever) channel, and similarly for vec2/vec3 results. By knowing how to adjust DP4-type instructions for optimizing out a swizzled MOV, we can reduce instructions in common matrix multiplication cases. Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Diffstat (limited to 'src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp')
-rw-r--r--src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp b/src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp
index c79b0fd..fa9c155 100644
--- a/src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp
+++ b/src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp
@@ -122,3 +122,24 @@ TEST_F(register_coalesce_test, test_multiple_use)
EXPECT_NE(mul->dst.file, MRF);
}
+
+TEST_F(register_coalesce_test, test_dp4_mrf)
+{
+ src_reg some_src_1 = src_reg(v, glsl_type::vec4_type);
+ src_reg some_src_2 = src_reg(v, glsl_type::vec4_type);
+ dst_reg init;
+
+ dst_reg m0 = dst_reg(MRF, 0);
+ m0.writemask = WRITEMASK_Y;
+ m0.type = BRW_REGISTER_TYPE_F;
+
+ dst_reg temp = dst_reg(v, glsl_type::float_type);
+
+ vec4_instruction *dp4 = v->emit(v->DP4(temp, some_src_1, some_src_2));
+ v->emit(v->MOV(m0, src_reg(temp)));
+
+ register_coalesce(v);
+
+ EXPECT_EQ(dp4->dst.file, MRF);
+ EXPECT_EQ(dp4->dst.writemask, WRITEMASK_Y);
+}