Perubahan bytecode di SM5.1

SM5.1 mengubah cara pendaftaran sumber daya dideklarasikan dan direferensikan dalam instruksi.

SM5.1 bergerak menuju mendeklarasikan register "variabel", mirip dengan bagaimana hal itu dilakukan untuk register memori bersama grup, diilustrasikan oleh contoh berikut:

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;
}

Pembbongkaran contoh ini mengikuti:

// 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

Setiap rentang sumber daya shader sekarang memiliki ID (nama) dalam bytecode shader. Misalnya, array tekstur tex1 menjadi 't1' dalam kode byte shader. Memberikan ID unik untuk setiap rentang sumber daya memungkinkan dua hal:

  • Mengidentifikasi rentang sumber daya mana yang tidak ambigu (lihat dcl_resource_texture2d) yang sedang diindeks dalam instruksi (lihat instruksi sampel).
  • Lampirkan set atribut ke deklarasi, misalnya, jenis elemen, ukuran langkah, mode operasi raster, dll..

Perhatikan bahwa ID rentang tidak terkait dengan deklarasi terikat HLSL yang lebih rendah.

Urutan pengikatan sumber daya refleksi dan instruksi deklarasi shader sama untuk membantu mengidentifikasi korespondensi antara variabel HLSL dan ID bytecode.

Setiap instruksi deklarasi di SM5.1 menggunakan operan 3D untuk menentukan: ID rentang, batas bawah dan atas. Token tambahan dipancarkan untuk menentukan ruang register. Token lain juga dapat dipancarkan untuk menyampaikan properti tambahan dari rentang, misalnya, cbuffer atau instruksi deklarasi buffer terstruktur memancarkan ukuran cbuffer atau struktur. Detail pengodean yang tepat dapat ditemukan di d3d12TokenizedProgramFormat.h dan D3D10ShaderBinary::CShaderCodeParser.

Instruksi SM5.1 tidak akan memancarkan informasi operand sumber daya tambahan sebagai bagian dari instruksi (seperti dalam SM5.0). Informasi ini sekarang dipindahkan ke instruksi deklarasi. Di SM5.0, sumber daya pengindeksan instruksi memerlukan atribut sumber daya untuk dijelaskan dalam token opcode yang diperluas, karena pengindeksan mengaburkan asosiasi ke deklarasi. Dalam SM5.1 setiap ID (seperti 't1') secara tidak ambigu dikaitkan dengan satu deklarasi yang menjelaskan informasi sumber daya yang diperlukan. Oleh karena itu, token opcode yang diperluas yang digunakan pada instruksi untuk menjelaskan informasi sumber daya tidak lagi dipancarkan.

Dalam instruksi non-deklarasi, operand sumber daya untuk sampler, SRV, dan UAV adalah operan 2D. Indeks pertama adalah konstanta harfiah yang menentukan ID rentang. Indeks kedua mewakili nilai linearisasi indeks. Nilai dihitung relatif terhadap awal ruang register yang sesuai (tidak relatif terhadap awal rentang logis) untuk berkorelasi dengan tanda tangan akar dengan lebih baik dan untuk mengurangi beban pengkompilasi driver untuk menyesuaikan indeks.

Operand sumber daya untuk CBV adalah operan 3D: ID harfiah dari rentang, indeks cbuffer, offset ke dalam instans cbuffer tertentu.

Fitur HLSL Shader Model 5.1 untuk Direct3D 12

Model Shader 5.1