diff options
author | Eric Anholt <eric@anholt.net> | 2012-11-30 22:29:26 -0800 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2012-12-14 16:06:30 -0800 |
commit | 471af25fc57dc43a8277b4b17ec82547287621d0 (patch) | |
tree | 9ae9b8d4136083af11b830b4e1459c1c097d1639 /src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp | |
parent | a76a03f437df3c6458da5b0e9e70fd4d986fbdae (diff) | |
download | external_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.cpp | 21 |
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); +} |