glsl: Add a pass to flip matrix/vector multiplies to use dot products.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 18 Apr 2013 00:30:25 +0000 (17:30 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Sun, 12 May 2013 16:36:46 +0000 (09:36 -0700)
commite413d3f15ca72b82ca29e43f010597a83427d5e8
tree89436a108f3e2f53ebab46c30d80c74ef6336277
parent72a0b7a43531eb5e5cc4355941957864f86dd719
glsl: Add a pass to flip matrix/vector multiplies to use dot products.

This pass flips (matrix * vector) operations to (vector *
matrixTranspose) for certain built-in matrices (currently
gl_ModelViewProjectionMatrix and gl_TextureMatrix).

This is equivalent, but results in dot products rather than multiplies
and adds.  On some hardware, this is more efficient.

This pass is conditionalized on ctx->mvp_with_dp4, the flag drivers set
to indicate they prefer dot products.

Improves performance in Lightsmark by 1.01131% +/- 0.162069% (n = 10)
on a Haswell GT2 system.  Passes Piglit on Ivybridge.

v2: Use struct gl_shader_compiler_options instead of plumbing through
    another boolean flag for this purpose.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/glsl/Makefile.sources
src/glsl/glsl_parser_extras.cpp
src/glsl/ir_optimization.h
src/glsl/opt_flip_matrices.cpp [new file with mode: 0644]