나는 답을 찾고 GCN 용으로 컴파일 할 때 생성 된 어셈블리를보기 위해 AMD의 쉐이더 분석기를 다운로드했다. 아래 어셈블리에서 벡터 레지스터는 v #이고 스칼라 레지스터는 s #입니다.
벡터 유니폼조차도 유니폼이 별도의 스칼라로 쉐이더에 전달되므로 vec3은 3 개의 스칼라 레지스터를 사용합니다. 혼란스러워하는 비트는 v0 ~ v4였습니다 .v0이 전체 4 부동 소수점 레지스터인지 또는 레지스터의 단일 부동 소수점인지, 전체 벡터 레지스터가 v0 ~ v3에 이르는지 확실하지 않습니다. 한 가지 방법으로 두 버전 사이에서 변경되지 않은 것으로 보이므로 정의 순서가 어셈블리에 영향을 미치지 않는다고 가정 할 수 있습니다.
http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/07/AMD_GCN3_Instruction_Set_Architecture.pdf
#version 450
uniform vec2 xy;
uniform vec2 zw;
out vec4 v;
void main(){
v.xy = xy;
v.zw = zw;
}
shader
asic(VI)
type(VS)
v_cndmask_b32 v0, s0, v0, vcc
v_mov_b32 v0, 0
v_mov_b32 v1, 1.0
exp pos0, v0, v0, v0, v1 done
s_andn2_b32 s0, s5, 0x3fff0000
s_mov_b32 s1, s0
s_mov_b32 s2, s6
s_mov_b32 s3, s7
s_mov_b32 s0, s4
s_buffer_load_dwordx2 s[4:5], s[0:3], 0x00
s_buffer_load_dwordx2 s[0:1], s[0:3], 0x10
s_waitcnt expcnt(0) & lgkmcnt(0)
v_mov_b32 v0, s4
v_mov_b32 v1, s5
v_mov_b32 v2, s0
v_mov_b32 v3, s1
exp param0, v0, v1, v2, v3
end
#version 450
uniform vec2 xy;
uniform float z;
uniform vec2 zw;
out vec4 v;
void main(){
v.xy = xy;
v.zw = zw;
v.w += z;
}
shader
asic(VI)
type(VS)
v_cndmask_b32 v0, s0, v0, vcc
v_mov_b32 v0, 0
v_mov_b32 v1, 1.0
s_andn2_b32 s0, s5, 0x3fff0000
exp pos0, v0, v0, v0, v1 done
s_mov_b32 s1, s0
s_mov_b32 s2, s6
s_mov_b32 s3, s7
s_mov_b32 s0, s4
s_buffer_load_dword s4, s[0:3], 0x10
s_buffer_load_dwordx2 s[6:7], s[0:3], 0x00
s_buffer_load_dwordx2 s[0:1], s[0:3], 0x20
s_waitcnt expcnt(0) & lgkmcnt(0)
v_mov_b32 v0, s4
v_add_f32 v0, s1, v0
v_mov_b32 v1, s6
v_mov_b32 v2, s7
v_mov_b32 v3, s0
exp param0, v1, v2, v3, v0
end
s_buffer_load_dword
지침입니다-입력 유니폼을 읽는 중이며 16 진수의 마지막 숫자는 읽을 오프셋입니다. 첫 번째 경우xy
에는 오프셋 0과zw
오프셋 16에 표시됩니다. 두 번째 경우에는xy
오프셋 0,z
오프셋 16 및zw
오프셋 32에 있습니다. 모든 유니폼은 개별적으로 16 바이트로 정렬되고 압축되지 않은 것으로 나타납니다. 함께 또는 재정렬.