glsl: rewrite clip/cull distance lowering pass
authorDave Airlie <airlied@redhat.com>
Sun, 15 May 2016 22:47:32 +0000 (08:47 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 24 May 2016 01:27:29 +0000 (11:27 +1000)
commita08c4ebbe841e22076c6d3929248876c60b3dfcd
treec358f0975adf886d53f0963fc07703863cf03bec
parent8c628ab13e4fa86ee662dcddb0f5a89b2d30e1a4
glsl: rewrite clip/cull distance lowering pass

The last version of this broke clipping, and I had to spend
sometime getting this working properly.

I had to introduce a third pass to count the clip/cull totals,
all due to one messy corner case. We have a piglit test
tes-input-gl_ClipDistance.shader_test
that doesn't actually output the clip distances, it just passes
them like a varying from TCS->TES, the older lowering pass worked
but to lower clip/cull we need to know the total number of clip+culls
used to defined the new variable correctly, and to offset culls
properly.

This adds an extra pass that works out the sizes for clip/cull,
then lowers gl_ClipDistance then gl_CullDistance into the new
gl_ClipDistanceMESA.

The pass checks using the fixed array sizes code if they array
has been referenced, or is actually never used, and ignores
it in the latter case.

Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/compiler/glsl/ir_optimization.h
src/compiler/glsl/linker.cpp
src/compiler/glsl/lower_distance.cpp