glsl/linker: Pack between varyings.
authorPaul Berry <stereotype441@gmail.com>
Wed, 5 Dec 2012 22:37:19 +0000 (14:37 -0800)
committerPaul Berry <stereotype441@gmail.com>
Fri, 14 Dec 2012 18:51:21 +0000 (10:51 -0800)
commitca7e891e8aceaf1adb4c9ae776916fa3636747ee
treebbdedc3c50120d9ead8a8bd92f67f611a3a6ab5a
parentdf87722beccf0255d149668ca54a35cabf99a9c4
glsl/linker: Pack between varyings.

This patch implements varying packing between varyings.

Previously, each varying occupied components 0 through N-1 of its
assigned varying slot, so there was no way to pack two varyings into
the same slot.  For example, if the varyings were a float, a vec2, a
vec3, and another vec2, they would be stored as follows:

 <----slot1----> <----slot2----> <----slot3----> <----slot4---->  slots
  *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *
 flt  x   x   x  <vec2->  x   x  <--vec3--->  x  <vec2->  x   x   varyings

(Each * represents a varying component, and the "x"s represent wasted
space).

This change packs the varyings together to eliminate wasted space
between varyings, like so:

 <----slot1----> <----slot2----> <----slot3----> <----slot4---->  slots
  *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *
 <vec2-> <vec2-> flt <--vec3--->  x   x   x   x   x   x   x   x   varyings

Note that we take advantage of the sort order introduced in previous
patches (vec4's first, then vec2's, then scalars, then vec3's) to
minimize how often a varying is "double parked" (split across varying
slots).

Reviewed-by: Eric Anholt <eric@anholt.net>
v2: Skip varying packing if ctx->Const.DisableVaryingPacking is true.
src/glsl/linker.cpp