-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Marek Ol?ák wrote: > On Tue, Aug 31, 2010 at 2:14 AM, Ian Romanick <i...@freedesktop.org > <mailto:i...@freedesktop.org>> wrote: > > While I was trying to get one of the Humus demos working today, it > occurred to me that we can possibly do better than > ir_vec_index_to_cond_assign to lower variable indexing of vectors. In > addition to using conditional assignment, we can also use a dot-product > to pick a single element out of a vector. The variable index operation > becomes: > > const vec4 gl_vec_selector[4] = > vec4[4](vec4(1.0, 0.0, 0.0, 0.0), > vec4(0.0, 1.0, 0.0, 0.0), > vec4(0.0, 0.0, 1.0, 0.0), > vec4(0.0, 0.0, 0.0, 1.0)); > > ... > > float f = dot(v, gl_vec_selector[i]);
[snip] > Neither r300 nor r500 supports the ARL opcode in fragment shaders (it's Meh. I always forget about that asymmetry. > a D3D10 feature), which kind of makes this optimization a no-go. I > suggest using SEQ instead: > > bvec4 selector = equal(vec4(i), vec4(0,1,2,3)); > float f = dot(v, vec4(selector)); > > which should end up being just SEQ followed by DP4. SEQ isn't part of the ARB_fragment_program / ARB_vertex_program instruction set either. Does R300 support that? I won't be surprised if i915 doesn't. Of course, it doesn't support the ARL-based optimization either. SEQ is itself lowered to a sequence of instructions: SGE t0, i.xxxx, { 0, 1, 2, 3}; SGE t1, i.xxxx, {-0, -1, -2, -3}; MUL selector, t0, t1; DP4 result, v, selector; So, that probably still would be better than the mess that gets generated today. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iEYEARECAAYFAkx9OfMACgkQX1gOwKyEAw+HlQCfZCqRdGwn3x9k06/qReehqMSf nCoAnjKMPoUlb/4QXeHW0EYOozlLpQn2 =X6R+ -----END PGP SIGNATURE----- _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev