6.4 Direct3D 11 ile Pratik Oluşturma ve Hesaplama (Sayfa 325, 326) kitabının 6.4 Sabit Tamponları bölümünde belirtilmiştir:
Varsayılan olarak, HLSL derleyicisi sabitleri birden çok float4 kaydına yayılmayacak şekilde hizalamaya çalışır. [...] Bir HLSL sabit tamponu için paketleme ayrıca packoffset anahtar sözcüğü aracılığıyla manuel olarak belirtilebilir.
Benzer bir kuralın aynı donanım özelliğiyle eşleştiği için OpenGL eşdeğeri, Tekdüzen Tampon Nesneleri için geçerli olacağını varsayıyorum.
Peki ya vanilya üniformaları? Üniforma ilan ederken geçerli olan kurallar nelerdir?
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?
Derleyici bu tür optimizasyonlar yapabilirse, ne kadar iyidir? Derleyiciye paketlenip paketlenmeyeceğini açıkça söyleyebilir miyiz ve ne zaman yapmalıyız?
s_buffer_load_dword
talimatlardır - giriş üniformalarını okuyorlar ve onaltılık son sayı okunacak ofset. İlk durumdaxy
0 ofsetinde vezw
16 ofsetinde gösterilir. İkinci durumdaxy
ofset 0'da,z
ofset 16'da vezw
ofset 32'de görünür. Tüm üniformalar ayrı ayrı 16 bayt hizalıdır ve paketlenmemiş gibi görünür. birlikte veya yeniden sıralanmıştır.