Dans la section 6.4 Constant Buffers du livre Practical Rendering & Computation with Direct3D 11 (pages 325, 326), il est mentionné:
Par défaut, le compilateur HLSL tentera d'aligner les constantes de sorte qu'elles ne s'étendent pas sur plusieurs registres float4. [...] L'emballage d'un tampon de constantes HLSL peut également être spécifié manuellement via le mot clé packoffset.
Je suppose qu'une règle similaire s'appliquera à l'équivalent OpenGL, Uniform Buffer Objects, car ils correspondent à la même fonctionnalité matérielle.
Et les uniformes vanille? Quelles sont les règles qui s'appliquent lors de la déclaration d'uniformes?
uniform vec2 xy; // Can we expect the compiler to pack xy
uniform vec2 zw; // into a same four component register?
uniform vec2 rg;
uniform float foo; // Will this prevent from packing rg and ba?
uniform vec2 ba; // If so, will foo eat up a full four components register?
Si le compilateur peut faire de telles optimisations, à quel point sont-elles bonnes? Pouvons-nous dire explicitement au compilateur de compresser ou non, et quand le devrions-nous?
s_buffer_load_dword
instructions - celles-ci lisent les uniformes d'entrée, et le dernier nombre en hexadécimal est le décalage à lire. Il montre dans le premier casxy
est à l'offset 0 etzw
à l'offset 16. Dans le second cas, vous avezxy
à l'offset 0,z
à l'offset 16 etzw
à l'offset 32. Il apparaît que tous les uniformes sont individuellement alignés sur 16 octets et non emballés ensemble ou réorganisé.