From: Edward K. C. <ek...@lg...> - 2004-02-12 19:01:20
|
On Feb 12, 2004, at 12:50, Dair Grant wrote: > Edward K. Chew wrote: > >> You know, if you added a fourth redundant dimension to the Cartesian >> coordinate system, you could load points, vectors, etc. as true >> altivec >> vectors and perform a number of operations VERY quickly, albeit at the >> cost of some unused memory. Hmm... > > Right now QD3D vectors and colours are always three components. > > This is something we might want to change, or at least add the option > that you can specify points as quads and colours as argb (rather than > distinct diffuse colour + diffuse transparency colour). > > I believe OpenGL on the Mac can perform better if you're sending down > vertices which are aligned like this, so it may be worth it even if we > don't do any vector processing ourselves. I have been thinking about this. Even if you don't restructure everything globally, you might derive some benefit from applying it locally. In other words, you could temporarily realign the vectors, do something time-consuming, and set them back to normal. Altivec has useful instructions for moving memory around in just this way. I work on scientific apps and deal with Cartesian coordinates pretty frequently. One other trick I have learned to help get altivec in on the action is to rearrange your array of vectors to look like this: Original: x0 y0 z0 x1 y1 z1 x2 y2 z2 x3 y3 z3 Optimized: x0 x1 x2 x3 y0 y1 y2 y3 z0 z1 z2 z3 Now you can do just about anything you were used to doing with scalar instructions, only four times faster! Well, in theory, anyway... ;-) Turns out it takes six vec_perm instructions to convert every group of four vectors into this form, which is not too shabby, really. At any rate, if you are interested in a function which does this, let me know. -Ted |