SM5.1 中的位元組程式碼變更
SM5.1 會變更如何在指示中宣告和參考資源暫存器。
SM5.1 會移至宣告暫存器「variable」,類似于群組共用記憶體暫存器如何完成,如下列範例所示:
Texture2D<float4> tex0 : register(t5, space0);
Texture2D<float4> tex1[][5][3] : register(t10, space0);
Texture2D<float4> tex2[8] : register(t0, space1);
SamplerState samp0 : register(s5, space0);
float4 main(float4 coord : COORD) : SV_TARGET
{
float4 r = coord;
r += tex0.Sample(samp0, r.xy);
r += tex2[r.x].Sample(samp0, r.xy);
r += tex1[r.x][r.y][r.z].Sample(samp0, r.xy);
return r;
}
此範例的反組解碼如下:
// Resource Bindings:
//
// Name Type Format Dim Space Slot Elements
// ------------------------------ ---------- ------- ----------- ----- ---- ---------
// samp0 sampler NA NA 0 5 1
// tex0 texture float4 2d 0 5 1
// tex1[0][5][3] texture float4 2d 0 10 unbounded
// tex2[8] texture float4 2d 1 0 8
//
//
//
// Input signature:
//
// Name Index Mask Register SysValue Format Used
// -------------------- ----- ------ -------- -------- ------- ------
// COORD 0 xyzw 0 NONE float xyzw
//
//
// Output signature:
//
// Name Index Mask Register SysValue Format Used
// -------------------- ----- ------ -------- -------- ------- ------
// SV_TARGET 0 xyzw 0 TARGET float xyzw
//
ps_5_1
dcl_globalFlags refactoringAllowed
dcl_sampler s0[5:5], mode_default, space=0
dcl_resource_texture2d (float,float,float,float) t0[5:5], space=0
dcl_resource_texture2d (float,float,float,float) t1[10:*], space=0
dcl_resource_texture2d (float,float,float,float) t2[0:7], space=1
dcl_input_ps linear v0.xyzw
dcl_output o0.xyzw
dcl_temps 2
sample r0.xyzw, v0.xyxx, t0[0].xyzw, s0[5]
add r0.xyzw, r0.xyzw, v0.xyzw
ftou r1.x, r0.x
sample r1.xyzw, r0.xyxx, t2[r1.x + 0].xyzw, s0[5]
add r0.xyzw, r0.xyzw, r1.xyzw
ftou r1.xyz, r0.zyxz
imul null, r1.yz, r1.zzyz, l(0, 15, 3, 0)
iadd r1.y, r1.z, r1.y
iadd r1.x, r1.x, r1.y
sample r1.xyzw, r0.xyxx, t1[r1.x + 10].xyzw, s0[5]
add o0.xyzw, r0.xyzw, r1.xyzw
ret
// Approximately 12 instruction slots used
每個著色器資源範圍現在都有識別碼 (著色器位元組程式碼中的名稱) 。 例如,著色器位元組程式碼中的 tex1 紋理陣列會變成 't1'。 為每個資源範圍提供唯一識別碼可允許兩件事:
- 明確識別哪些資源範圍 (請參閱dcl_resource_texture2d) 在指示中編制索引, (請參閱範例指令) 。
- 將一組屬性附加至宣告,例如元素類型、步進大小、點陣作業模式等等。
請注意,範圍的識別碼與 HLSL 下限宣告無關。
反映資源系結和著色器宣告指令的順序相同,有助於識別 HLSL 變數與位元組程式碼識別碼之間的對應。
SM5.1 中的每個宣告指令都會使用 3D 運算元來定義:範圍識別碼、下限和上限。 會發出額外的權杖來指定暫存器空間。 可能會發出其他權杖,以傳達範圍的其他屬性,例如 cbuffer 或結構化緩衝區宣告指令會發出 cbuffer 或結構的大小。 您可以在 d3d12TokenizedProgramFormat.h 和 D3D10ShaderBinary::CShaderCodeParser 中找到編碼的確切詳細資料。
SM5.1 指令不會發出其他資源運算元資訊,如同 SM5.0) 中的指示 (。 這項資訊現在已移至宣告指示。 在 SM5.0 中,指示索引資源所需的資源屬性,以在擴充的 opcode 權杖中描述,因為索引編制混淆了與宣告的關聯。 在 SM5.1 中,每個識別碼 (例如 't1') 明確與描述必要資源資訊的單一宣告相關聯。 因此,不會再發出用於描述資源資訊的指示上的擴充 Opcode 權杖。
在非宣告指令中,取樣器、SRV 和 UAV 的資源運算元是 2D 運算元。 第一個索引是指定範圍識別碼的常值常數。 第二個索引代表索引的線性值。 此值會相對於對應暫存器空間的開頭進行計算, (與邏輯範圍的開頭不相關) ,以便更與根簽章相互關聯,並降低調整索引的驅動程式編譯器負擔。
CBV 的資源運算元是 3D 運算元:範圍常值識別碼、cbuffer 的索引、位移到 cbuffer 的特定實例。
相關主題