This set of patches implements the minimal packing algorithm required by GLES 
2.0 specification
(see 
http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf 
p111, 
thank to Paul Berry for pointing this).

Currently any vector varying are occupying a full vec4 slot in output buffer. 
This means that
drivers can only honor their MAX_VARYING_FLOATS if each varying is of vec4 
type. The following
piglit test shows this :
http://lists.freedesktop.org/archives/piglit/2012-February/001850.html
For instance, if hardware reports a 32 varyings support, shaders won't compile 
if there is more than
8 varyings, even if they are floats.

The minimal varying algorithm required by the spec has several interesting 
properties :
- If there is enough vec4 slot to store varyings, it won't attempt to pack 
anything (like currently)
- Arrays access are left "untouched", meaning there is no swizzling hack to 
implement driver side
(also meaning that array of varying size is limited to MAX_VARYING_FLOATS/4).
- If there are only vec4, vec2 and scalar varyings (not in array), 
MAX_VARYING_FLOATS can always be
honored.

Of course more sophisticated algorithms can be implemented, however reshaping 
arrays/overlaping register
(vec3/vec3/vec2 inside 2 vec4s) can be costly for simd/vector architectures 
(and packing algorithms are
NP hard). It might be possible to do optimal packing for scalar architecture, 
when tgsi opcode support it.

Thank for review.

Regards,
Vincent


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to