In Abschnitt 6.4 Konstante Puffer des Buches Praktisches Rendern und Rechnen mit Direct3D 11 (Seiten 325, 326) wird Folgendes erwähnt:
Standardmäßig versucht der HLSL-Compiler, Konstanten so auszurichten, dass sie nicht mehrere float4-Register umfassen. [...] Das Packen für einen HLSL-Konstantenpuffer kann auch manuell über das Schlüsselwort packoffset angegeben werden.
Ich gehe davon aus, dass eine ähnliche Regel für das OpenGL-Äquivalent Uniform Buffer Objects gilt, da sie derselben Hardwarefunktion zugeordnet sind.
Was ist mit Vanilleuniformen? Welche Regeln gelten für die Erklärung von Uniformen?
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?
Wenn der Compiler solche Optimierungen durchführen kann, wie gut sind sie? Können wir den Compiler explizit anweisen, zu packen oder nicht, und wann sollten wir?
quelle
s_buffer_load_dword
Anweisungen - diese lesen die Eingabeuniformen, und die letzte Zahl in hexadezimal ist der Versatz, aus dem gelesen werden soll. Es zeigt im ersten Fallxy
bei Offset 0 undzw
bei Offset 16. Im zweiten Fall haben Siexy
bei Offset 0,z
bei Offset 16 undzw
bei Offset 32. Es scheint, dass alle Uniformen einzeln 16-Byte-ausgerichtet und nicht gepackt sind zusammen oder neu bestellt.