En la sección 6.4 Buffers constantes del libro Practical Rendering & Computation con Direct3D 11 (páginas 325, 326) se menciona:
Por defecto, el compilador HLSL intentará alinear constantes de modo que no abarquen múltiples registros float4. [...] El embalaje para un búfer constante HLSL también se puede especificar manualmente a través de la palabra clave packoffset.
Supongo que se aplicará una regla similar al equivalente de OpenGL, Uniform Buffer Objects, ya que se asignan a la misma característica de hardware.
Sin embargo, ¿qué pasa con los uniformes de vainilla? ¿Cuáles son las reglas que se aplican al declarar 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 el compilador puede hacer tales optimizaciones, ¿qué tan buenas son? ¿Podemos decirle explícitamente al compilador que empaque o no, y cuándo deberíamos?
s_buffer_load_dword
instrucciones: esas están leyendo los uniformes de entrada, y el último número en hexadecimal es el desplazamiento para leer. Se muestra en el primer casoxy
en el desplazamiento 0 yzw
en el desplazamiento 16. En el segundo caso, tienexy
en el desplazamiento 0,z
en el desplazamiento 16 yzw
en el desplazamiento 32. Parece que todos los uniformes están individualmente alineados con 16 bytes y no embalados juntos o reordenados.