On 10/03/2014 12:25 AM, Pekka Paalanen wrote:

AFFINE: last row is 0,0,?,1
NO_SKEW: a00*a01+a10*a11 ~= 0
NO_SCALE: a00^2+a01^2 ~= 1 && a10^2+a11^2 ~= 1
ORTHO: a00==a11==0 or a01==a10==0
NO_ROTATE: a01==a10==0
NOT_DEGENERATE: a00*a11-a10*a01 != 0
NO_MIRROR: a00,a01,a10,a11 are all >= 0
INT_SCALE: a00,a01,a10,a11 are all integers
INT_TRANSLATE: a03 and a13 are integers
IDENTITY: identity matrix

You must have missed our code, we already have some flags:
http://cgit.freedesktop.org/wayland/weston/tree/shared/matrix.h#n30

That looks like a good start, though I would agree that the flags need to change. You need a set with each bit as independent as possible, which is what I was trying to come up with in the above list. Tests for optimization probably require looking at more than one flag, for instance 1:1 pixel mappings are require AFFINE, NO_SKEW, NO_SCALE, ORTHO, and INT_TRANSLATE all turned on.

I suspect there are a lot of errors in the above list, too...

We could be using the flags to optimize matrix ops, but we don't so
far. No-one has seen the need to optimize our matrix ops. I suspect
very few people if any have even profiled Weston.

You are probably right, it is not to optimize the math. What I was trying to optimize was figuring out a new set of flags from the result of multiplying two matrices, rather than running the analysis on the result.

The most useful thing to speed this up is to use 32-bit floats, store in column-major order (ie the same order OpenGL uses), and get it to use the vector built-ins in gcc if possible. I'm pretty certain that will result in the fastest multiply and it will be faster than the if statements necessary to check the flags.
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to