mesa: allow variable indexing into the predefined uniform variable arrays
authorBrian Paul <brianp@vmware.com>
Wed, 31 Dec 2008 00:11:32 +0000 (17:11 -0700)
committerBrian Paul <brianp@vmware.com>
Tue, 6 Jan 2009 16:18:08 +0000 (09:18 -0700)
commitb66fe32c52f1920297a6af0391b99f54eb8b310e
treeea71252ffec3d72cfd7c2b4bf922c0a3438af099
parentefe91b0000d162deb20486ef6d5e016a11428499
mesa: allow variable indexing into the predefined uniform variable arrays

This allows code such as "vec4 a = gl_LightSource[i].ambient;" to work.

When a built-in uniform array is indexed with a variable index we need to
"unroll" the whole array into the parameter list (aka constant buffer) because
we don't know which elements may be accessed at compile-time.  In the case of
the gl_LightSource array of size [8], we emit 64 state references into the
parameter array (8 elements times 8 vec4s per gl_LightSourceParameters
struct).

Previously, we only allowed constant-indexed references to uniform arrays
(such as gl_LightSource[2].position) which resulted in a single state reference
being added to the parameter array, not 64.  We still optimize this case.

Users should be aware that using "gl_LightSource[i].ambient" in their shaders
is a bit expensive since state validation will involve updating all 64
light source entries in the parameter list.

(cherry picked from commit c6537ac8b8130cf2271c8d1e51137a575073c762)
src/mesa/shader/slang/library/slang_common_builtin.gc
src/mesa/shader/slang/library/slang_common_builtin_gc.h
src/mesa/shader/slang/slang_builtin.c
src/mesa/shader/slang/slang_builtin.h
src/mesa/shader/slang/slang_emit.c