W rozdziale 6.4 Stałe bufory książki Practical Rendering & Computation with Direct3D 11 (strony 325, 326) wspomniano:
Domyślnie kompilator HLSL będzie próbował wyrównać stałe tak, aby nie obejmowały wielu rejestrów float4. [...] Pakowanie stałego bufora HLSL można również określić ręcznie za pomocą słowa kluczowego packoffset.
Zakładam, że podobna zasada będzie miała zastosowanie do równoważnika OpenGL, Uniform Buffer Objects, ponieważ są one odwzorowane na tę samą funkcję sprzętową.
A co z mundurami waniliowymi? Jakie zasady obowiązują przy deklarowaniu mundurów?
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?
Jeśli kompilator może przeprowadzić takie optymalizacje, to czy są one dobre? Czy możemy wyraźnie powiedzieć kompilatorowi, czy ma się spakować, czy nie, i kiedy powinniśmy?
źródło
s_buffer_load_dword
instrukcje - one czytają mundury wejściowe, a ostatnia liczba w hex jest przesunięciem do odczytu. Pokazuje, że w pierwszym przypadkuxy
jest z przesunięciem 0 izw
z przesunięciem 16. W drugim przypadku maszxy
przesunięcie 0,z
przesunięcie 16 izw
przesunięcie 32. Wygląda na to, że wszystkie mundury są indywidualnie wyrównane 16-bajtowo i nie są pakowane razem lub ponownie uporządkowane.