Menggunakan Tanda Tangan Akar
Tanda tangan akar adalah definisi kumpulan tabel deskriptor yang disusun secara segan-segan (termasuk tata letaknya), konstanta akar, dan deskriptor akar. Setiap entri memiliki biaya hingga batas maksimum, sehingga aplikasi dapat mengimbangi jumlah setiap jenis entri yang akan dimuat dalam tanda tangan utama.
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 saat ditulis, meskipun tanda tangan akar juga dapat ditulis langsung di shader jika diinginkan. Aset shader yang ada tidak memerlukan perubahan apa pun agar kompatibel dengan tanda tangan root. 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. Signature root yang diatur pada daftar perintah atau bundel juga harus cocok dengan PSO yang saat ini diatur di Draw/Dispatch; jika tidak, perilaku tidak terdefinisi. Ketidakcocokan root signature sementara sebelum Draw/Dispatch tidak masalah - seperti mengatur PSO yang tidak kompatibel sebelum beralih ke root signature yang kompatibel (selama ini kompatibel ketika Draw/Dispatch dipanggil). Mengatur PSO tidak akan mengubah root signature. Aplikasi harus memanggil API khusus untuk mengatur tanda tangan root.
Setelah tanda tangan akar diatur pada daftar perintah, tata letak menentukan kumpulan 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 dalam baris (deskriptor root)
- [1] Tabel deskriptor yang berisi 2 SRV, 1 CBV, dan 1 UAV
- [2] Tabel deskriptor yang berisi 1 sampler
- [3] Koleksi konstanta awal 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 timbunan deskriptor yang berisi (atau akan berisi saat 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 diubah di antara gambar adalah salah satu konstanta di slot [2], hanya itu saja yang perlu diikat ulang oleh aplikasi. Seperti yang dibahas sebelumnya, semua status pengikatan tanda tangan akar pada versi driver/perangkat keras dimodifikasi secara otomatis. Jika tanda tangan akar diubah pada daftar perintah, semua pengikatan tanda tangan akar sebelumnya menjadi kedaluwarsa, dan semua pengikatan yang baru diharapkan harus disetel sebelum Draw/Dispatch; jika tidak, perilaku akan tidak ditentukan. Jika tanda tangan akar dikonfigurasi ulang ke yang sama dengan yang saat ini, pengikatan tanda tangan akar yang ada tidak akan menjadi usang.
Semantik Bundel
Bundel mewarisi pengikatan tanda tangan akar dari 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 signature root menjadi berbeda dari daftar perintah panggilan, ini memiliki efek yang sama seperti mengubah signature root pada daftar perintah yang dijelaskan di atas: semua pengikatan signature root sebelumnya menjadi basi dan pengikatan baru yang diharapkan harus diatur sebelum Draw/Dispatch; kalau tidak, perilaku akan menjadi tidak terdefinisi. Jika bundel tidak perlu mengubah pengikatan tanda tangan root apa pun, maka bundel tidak perlu mengatur tanda tangan root.
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 Grafik bagian Mengelola Status Alur Grafis di Direct3D 12.
Topik terkait