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.
Topik terkait
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk