Nella sezione 6.4 Buffer costanti del libro Rendering e calcolo pratici con Direct3D 11 (pagine 325, 326) è menzionato:
Per impostazione predefinita, il compilatore HLSL tenterà di allineare le costanti in modo che non si estendano su più registri float4. [...] L'imballaggio per un buffer costante HLSL può anche essere specificato manualmente tramite la parola chiave packoffset.
Presumo che una regola simile si applicherà all'equivalente OpenGL, Uniform Buffer Objects, poiché si associano alla stessa funzionalità hardware.
E le uniformi alla vaniglia? Quali sono le regole che si applicano quando si dichiarano le uniformi?
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?
Se il compilatore può fare tali ottimizzazioni, quanto sono buone? Possiamo dire esplicitamente al compilatore di impacchettare o no, e quando dovremmo?
s_buffer_load_dword
istruzioni: quelle stanno leggendo le uniformi di input, e l'ultimo numero in esadecimale è l'offset da cui leggere. Mostra che nel primo casoxy
è nell'offset 0 ezw
nell'offset 16. Nel secondo caso hai l'xy
offset 0, l'z
offset 16 e l'zw
offset 32. Sembra che tutte le uniformi siano allineate singolarmente a 16 byte e non impacchettate insieme o riordinati.