Menggunakan Tanda Tangan Akar
Tanda tangan akar adalah definisi kumpulan tabel deskriptor yang disusun secara acak (termasuk tata letaknya), konstanta akar, dan deskriptor akar. Setiap entri memiliki biaya menuju batas maksimum, sehingga aplikasi dapat menukar saldo antara berapa banyak dari setiap jenis entri yang akan dimuat tanda tangan akar.
Tanda tangan akar adalah objek yang dapat dibuat dengan spesifikasi manual di API. Semua shader dalam PSO harus kompatibel dengan tata letak akar yang ditentukan dengan PSO, atau shader individual harus menyertakan tata letak akar tersemat yang cocok satu sama lain; jika tidak, pembuatan PSO akan gagal. Salah satu properti tanda tangan akar adalah bahwa shader tidak perlu mengetahuinya ketika ditulis, meskipun tanda tangan akar juga dapat ditulis langsung dalam shader jika diinginkan. Aset shader yang ada tidak memerlukan perubahan apa pun agar kompatibel dengan tanda tangan akar. Shader Model 5.1 diperkenalkan untuk memberikan beberapa fleksibilitas ekstra (pengindeksan deskriptor dinamis dari dalam shader), dan dapat diadopsi secara bertahap mulai dari aset shader yang ada seperti yang diinginkan.
Semantik Daftar Perintah
Di awal daftar perintah, tanda tangan akar tidak ditentukan. Shader grafis memiliki tanda tangan akar terpisah dari shader komputasi, masing-masing ditetapkan secara independen pada daftar perintah. Tanda tangan akar yang diatur pada daftar perintah atau bundel juga harus cocok dengan PSO yang saat ini diatur di Draw/Dispatch; jika tidak, perilaku tidak ditentukan. Ketidakcocokan tanda tangan akar sementara sebelum Draw/Dispatch baik-baik saja - seperti mengatur PSO yang tidak kompatibel sebelum beralih ke tanda tangan akar yang kompatibel (selama ini kompatibel dengan waktu Draw/Dispatch dipanggil). Mengatur PSO tidak mengubah tanda tangan akar. Aplikasi harus memanggil API khusus untuk mengatur tanda tangan akar.
Setelah tanda tangan akar diatur pada daftar perintah, tata letak menentukan set pengikatan yang diharapkan disediakan aplikasi, dan PSO mana yang dapat digunakan (yang dikompilasi dengan tata letak yang sama) untuk panggilan gambar/pengiriman berikutnya. Misalnya, tanda tangan akar dapat didefinisikan oleh aplikasi untuk memiliki entri berikut. Setiap entri disebut sebagai "slot".
- [0] Deskriptor CBV sebaris (deskriptor akar)
- [1] Tabel deskriptor yang berisi 2 SRV, 1 CBV, dan 1 UAV
- [2] Tabel deskriptor yang berisi 1 sampler
- [3] Koleksi konstanta akar 4x32-bit
- [4] Tabel deskriptor yang berisi jumlah SRV yang tidak ditentukan
Dalam hal ini, sebelum dapat mengeluarkan Draw/Dispatch, aplikasi diharapkan untuk mengatur pengikatan yang sesuai ke masing-masing slot [0..4] yang ditentukan aplikasi dengan tanda tangan akarnya saat ini. Misalnya, pada slot [1], tabel deskriptor harus terikat, yang merupakan wilayah yang berdekatan dalam tumpuk deskriptor yang berisi (atau akan berisi pada eksekusi) 2 SRV, 1 CBV, dan 1 UAV. Demikian pula, tabel deskriptor harus diatur pada slot [2] dan [4].
Aplikasi dapat mengubah bagian dari pengikatan tanda tangan akar pada satu waktu (sisanya tetap tidak berubah). Misalnya, jika satu-satunya hal yang perlu berubah di antara gambar adalah salah satu konstanta di slot [2], itu saja aplikasi yang perlu digabungkan kembali. Seperti yang dibahas sebelumnya, versi driver/perangkat keras semua status ikatan tanda tangan akar karena dimodifikasi secara otomatis. Jika tanda tangan akar diubah pada daftar perintah, semua pengikatan tanda tangan akar sebelumnya menjadi basi dan semua pengikatan yang baru diharapkan harus diatur sebelum Draw/Dispatch; jika tidak, perilaku tidak ditentukan. Jika tanda tangan akar diatur secara berlebihan ke yang sama yang saat ini diatur, pengikatan tanda tangan akar yang ada tidak menjadi basi.
Semantik Bundel
Bundel mewarisi pengikatan tanda tangan akar daftar perintah (pengikatan ke berbagai slot dalam contoh Daftar Perintah di atas). Jika bundel perlu mengubah beberapa pengikatan tanda tangan akar yang diwariskan, pertama-tama harus mengatur tanda tangan akar agar sama dengan daftar perintah panggilan (pengikatan yang diwariskan tidak menjadi kedaluwarsa). Jika bundel mengatur tanda tangan akar agar berbeda dari daftar perintah panggilan, yang memiliki efek yang sama dengan mengubah tanda tangan akar pada daftar perintah yang dijelaskan di atas: semua pengikatan tanda tangan akar sebelumnya basi dan pengikatan yang baru diharapkan harus diatur sebelum Draw/Dispatch; jika tidak, perilaku tidak ditentukan. Jika bundel tidak perlu mengubah pengikatan tanda tangan akar apa pun, bundel tidak perlu mengatur tanda tangan akar.
Kode berikut menunjukkan contoh alur panggilan ke dalam bundel.
// Command List
...
pCmdList->SetGraphicsRootSignature(pRootSig); // new parameter space
MyEngine_SetTextures(); // bundle inherits descriptor table setting
MyEngine_SetAnimationFactor(fTime); // bundle inherits root constant
pCmdList->ExecuteBundle(...);
...
// Bundle
pBundle->SetGraphicsRootSignature(pRootSig); // same as caller, in order to inherits bindings
pBundle->SetPipelineState(pPS);
pBundle->SetGraphicsRoot32BitConstant(drawConstantsSlot,0,drawIDOffset);
pBundle->Draw(...); // using inherited textures / animation factor
pBundle->SetGraphicsRoot32BitConstant(drawConstantsSlot,1,drawIDOffset);
pBundle->Draw(...);
...
Keluar dari bundel, setiap perubahan tata letak akar dan/atau perubahan pengikatan yang dilakukan bundel diwariskan kembali ke daftar perintah panggilan ketika bundel selesai dieksekusi.
Untuk informasi selengkapnya tentang pewarisan, lihat bagian Pewarisan status alur Grafis dari Mengelola Status Alur Grafis di Direct3D 12.
Topik terkait