Bagikan melalui


Tanda Tangan Akar Versi 1.1

Tujuan dari Tanda Tangan Akar versi 1.1 adalah untuk mengaktifkan aplikasi untuk menunjukkan kepada driver ketika deskriptor dalam tumpukan deskriptor tidak akan berubah atau pendeskripsi data menunjuk ke tidak akan berubah. Ini memungkinkan opsi bagi driver untuk membuat pengoptimalan yang mungkin mengetahui bahwa deskriptor atau memori yang ditunjukkannya statis untuk beberapa periode waktu.

Gambaran Umum

Root Signature versi 1.0 memungkinkan konten tumpukan deskriptor dan memori yang mereka arahkan untuk diubah secara bebas oleh aplikasi setiap kali perintah mencantumkan / bundel yang mereferensikannya berpotensi dalam penerbangan pada GPU. Namun, sangat sering, aplikasi tidak benar-benar membutuhkan fleksibilitas untuk mengubah deskriptor atau memori setelah perintah yang mereferensikannya telah direkam.

Aplikasi sering kali mampu secara sepele:

  • Siapkan deskriptor (dan kemungkinan memori yang mereka arahkan) sebelum mengikat tabel deskriptor atau deskriptor akar pada daftar perintah atau bundel.
  • Pastikan bahwa deskriptor ini tidak akan berubah sampai daftar perintah /bundel yang mereferensikannya telah selesai dijalankan untuk terakhir kalinya.
  • Pastikan data yang ditunjukkan deskriptor tidak berubah selama durasi penuh yang sama.

Atau, aplikasi mungkin hanya dapat menghormati bahwa data tidak berubah untuk durasi waktu yang lebih singkat. Data tertentu mungkin statis untuk jendela tepat waktu selama eksekusi daftar perintah yang mengikat parameter akar (tabel deskriptor atau deskriptor akar) saat ini menunjuk ke data. Dengan kata lain, aplikasi mungkin ingin melakukan eksekusi pada garis waktu GPU yang memperbarui beberapa data di antara periode waktu di mana aplikasi diatur melalui parameter akar, mengetahui bahwa ketika diatur, itu akan statis.

Jika deskriptor, atau deskriptor data menunjuk ke, tidak akan berubah, maka driver pengoptimalan tertentu mungkin dilakukan vendor perangkat keras khusus, dan yang penting mereka tidak mengubah perilaku selain mungkin meningkatkan performa. Mempertahankan pengetahuan sebanyak mungkin tentang niat aplikasi tidak membebani aplikasi.

Salah satu pengoptimalan adalah bahwa banyak driver dapat menghasilkan akses memori yang lebih efisien oleh shader jika mereka tahu janji yang dapat dibuat aplikasi tentang kelaikan statis deskriptor dan data. Misalnya, driver dapat menghapus tingkat tidak langsung untuk mengakses deskriptor dalam tumpukan dengan mengonversinya menjadi deskriptor akar jika perangkat keras tertentu tidak sensitif terhadap ukuran argumen root.

Tugas tambahan untuk pengembang yang menggunakan Versi 1.1 adalah membuat janji tentang volatilitas dan kelaikan statis data sedapat mungkin, sehingga driver dapat membuat pengoptimalan yang masuk akal. Pengembang tidak perlu membuat janji tentang statis-ness.

Root Signature versi 1.0 terus berfungsi tidak berubah, meskipun aplikasi yang mengkombinasikan ulang tanda tangan akar akan default ke Tanda Tangan Akar 1.1 sekarang (dengan opsi untuk memaksa versi 1.0 jika diinginkan).

Bendera Statis dan Volatil

Bendera berikut adalah bagian dari tanda tangan akar untuk memungkinkan driver memilih strategi tentang cara terbaik menangani argumen akar individu ketika diatur, dan juga menyematkan asumsi yang sama ke dalam Objek Status Alur (PSO) ketika awalnya dikompilasi - karena tanda tangan akar adalah bagian dari PSO.

Bendera berikut diatur oleh aplikasi dan berlaku untuk deskriptor atau data.

typedef enum D3D12_DESCRIPTOR_RANGE_FLAGS
{
    D3D12_DESCRIPTOR_RANGE_FLAG_NONE    = 0,
    D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE    = 0x1,
    D3D12_DESCRIPTOR_RANGE_FLAG_DATA_VOLATILE   = 0x2,
    D3D12_DESCRIPTOR_RANGE_FLAG_DATA_STATIC_WHILE_SET_AT_EXECUTE    = 0x4,
    D3D12_DESCRIPTOR_RANGE_FLAG_DATA_STATIC = 0x8
} D3D12_DESCRIPTOR_RANGE_FLAGS;

typedef enum D3D12_ROOT_DESCRIPTOR_FLAGS
{
    D3D12_ROOT_DESCRIPTOR_FLAG_NONE = 0,
    D3D12_ROOT_DESCRIPTOR_FLAG_DATA_VOLATILE    = 0x2,
    D3D12_ROOT_DESCRIPTOR_FLAG_DATA_STATIC_WHILE_SET_AT_EXECUTE = 0x4,
    D3D12_ROOT_DESCRIPTOR_FLAG_DATA_STATIC  = 0x8
} D3D12_ROOT_DESCRIPTOR_FLAGS;

DESCRIPTORS_VOLATILE

Dengan set bendera ini, deskriptor dalam tumpukan deskriptor yang ditunjukkan oleh tabel deskriptor akar dapat diubah oleh aplikasi kapan saja kecuali sementara daftar perintah / bundel yang mengikat tabel deskriptor telah dikirimkan dan belum selesai dieksekusi. Misalnya, merekam daftar perintah dan kemudian mengubah deskriptor dalam tumpukan deskriptor yang dirujuknya sebelum mengirimkan daftar perintah untuk eksekusi valid. Ini adalah satu-satunya perilaku yang didukung dari Root Signature versi 1.0.

Jika bendera DESCRIPTORS_VOLATILE tidak diatur, maka deskriptor bersifat statis. Tidak ada bendera untuk mode ini. Deskriptor statis berarti deskriptor dalam tumpukan deskriptor yang ditunjukkan oleh tabel deskriptor akar telah diinisialisasi pada saat tabel deskriptor diatur pada daftar perintah / bundel (selama perekaman), dan deskriptor tidak dapat diubah sampai daftar perintah / bundel selesai dijalankan untuk terakhir kalinya. Untuk Root Signature versi 1.1, deskriptor statis adalah asumsi default, dan aplikasi harus menentukan bendera DESCRIPTORS_VOLATILE saat diperlukan.

Untuk bundel yang menggunakan tabel deskriptor dengan deskriptor statis, deskriptor harus siap dimulai pada saat bundel direkam (dibandingkan dengan ketika bundel dipanggil), dan tidak berubah sampai bundel selesai dijalankan untuk terakhir kalinya. Tabel deskriptor yang menunjuk ke deskriptor statis harus diatur selama perekaman bundel dan tidak diwarisi ke dalam bundel. Ini valid untuk daftar perintah untuk menggunakan tabel deskriptor dengan deskriptor statis yang telah diatur dalam bundel dan dikembalikan ke daftar perintah.

Ketika deskriptor statis, ada perubahan perilaku lain yang mengharuskan bendera DESCRIPTORS_VOLATILE diatur. Akses di luar batas ke tampilan Buffer apa pun (dibandingkan dengan tampilan Texture1D/2D/3D/Cube) tidak valid dan menghasilkan hasil yang tidak terdefinisi, termasuk kemungkinan reset perangkat, daripada mengembalikan nilai default untuk baca atau hilangkan tulisan. Tujuan untuk menghapus kemampuan aplikasi untuk bergantung pada perangkat keras di luar pemeriksaan akses terikat adalah untuk memungkinkan driver memilih untuk mempromosikan akses deskriptor statis ke akses deskriptor akar jika dianggap lebih efisien. Deskriptor akar tidak mendukung pemeriksaan di luar batas.

Jika aplikasi bergantung pada perilaku akses memori yang aman di luar batas saat mengakses deskriptor, aplikasi perlu menandai rentang deskriptor yang mengakses deskriptor tersebut sebagai DESCRIPTORS_VOLATILE.

DATA_VOLATILE

Dengan set bendera ini, data yang ditunjukkan oleh deskriptor dapat diubah oleh CPU kapan saja kecuali sementara daftar perintah / bundel yang mengikat tabel deskriptor telah dikirimkan dan belum selesai dieksekusi. Ini adalah satu-satunya perilaku yang didukung dari Root Signature versi 1.0.

Bendera tersedia dalam bendera rentang deskriptor dan bendera deskriptor akar.

DATA_STATIC_WHILE_SET_AT_EXECUTE

Dengan set bendera ini, data yang diarahkan ke oleh deskriptor tidak dapat berubah mulai dari ketika tabel deskriptor akar atau deskriptor yang mendasar diatur pada daftar perintah / bundel selama eksekusi pada garis waktu GPU, dan berakhir ketika gambar/pengiriman berikutnya tidak akan lagi mereferensikan data.

Sebelum tabel deskriptor akar atau deskriptor diatur pada GPU, data ini dapat diubah bahkan dengan daftar perintah / bundel yang sama. Data juga dapat diubah saat deskriptor akar atau tabel deskriptor yang menunjuk ke data masih diatur pada daftar perintah / bundel, selama gambar/pengiriman yang merujuknya telah selesai. Namun, melakukannya mengharuskan tabel deskriptor di-rebound ke daftar perintah lagi sebelum lain kali tabel deskriptor atau deskriptor akar didereferensikan. Ini memungkinkan driver untuk mengetahui bahwa data yang ditunjukkan oleh deskriptor akar atau tabel deskriptor telah berubah.

Perbedaan penting antara DATA_STATIC_WHILE_SET_AT_EXECUTE dan DATA_VOLATILE adalah dengan DATA_VOLATILE driver tidak dapat mengetahui apakah salinan data dalam daftar perintah telah mengubah data yang ditunjukkan oleh deskriptor, tanpa melakukan pelacakan status ekstra. Jadi jika, misalnya, driver dapat menyisipkan segala jenis perintah pra-pengambilan data ke dalam daftar perintah mereka (untuk membuat akses shader ke data yang diketahui lebih efisien, misalnya), DATA_STATIC_WHILE_SET_AT_EXECUTE memungkinkan driver mengetahui bahwa hanya perlu melakukan pra-pengambilan data saat diatur melalui SetGraphicsRootDescriptorTable, SetComputeRootDescriptorTable atau salah satu metode untuk mengatur tampilan buffer konstanta, tampilan sumber daya shader, atau tampilan akses yang tidak diurutkan.

Untuk bundel, janji bahwa data statis saat diatur saat dijalankan berlaku secara unik untuk setiap eksekusi bundel.

Bendera tersedia dalam bendera rentang deskriptor dan bendera deskriptor akar.

DATA_STATIC

Jika bendera ini diatur, data yang ditunjukkan oleh deskriptor telah diinisialisasi pada saat deskriptor akar atau tabel deskriptor yang mereferensikan memori telah diatur pada daftar perintah / bundel selama perekaman, dan data tidak dapat diubah sampai daftar perintah / bundel selesai dijalankan untuk terakhir kalinya.

Untuk bundel, durasi statis dimulai pada pengaturan deskriptor akar atau tabel deskriptor selama perekaman bundel, dibandingkan dengan perekaman daftar perintah panggilan. Selain itu, tabel deskriptor yang menunjuk ke data statis harus diatur dalam bundel dan tidak diwariskan. Ini valid untuk daftar perintah untuk menggunakan tabel deskriptor yang menunjuk ke data statis yang telah diatur dalam bundel dan dikembalikan ke daftar perintah.

Bendera tersedia dalam bendera rentang deskriptor dan bendera deskriptor akar.

Menggabungkan Bendera

Paling banyak salah satu bendera DATA dapat ditentukan pada satu waktu, kecuali untuk rentang deskriptor Sampler yang tidak mendukung bendera DATA sama sekali karena sampler tidak menunjuk ke data.

Tidak adanya bendera DATA untuk rentang deskriptor SRV dan CBV berarti default perilaku DATA_STATIC_WHILE_SET_AT_EXECUTE diasumsikan. Alasan default ini dipilih daripada DATA_STATIC adalah bahwa DATA_STATIC_WHILE_SET_AT_EXECUTE jauh lebih mungkin menjadi default yang aman untuk sebagian besar kasus, sambil tetap menghasilkan beberapa peluang pengoptimalan lebih baik daripada default ke DATA_VOLATILE.

Tidak adanya bendera DATA untuk rentang deskriptor UAV berarti default perilaku DATA_VOLATILE diasumsikan, mengingat biasanya UAV ditulis.

DESCRIPTORS_VOLATILE tidak dapat digabungkan dengan DATA_STATIC, tetapi dapat digabungkan dengan bendera DATA lainnya. Alasan DESCRIPTORS_VOLATILE dapat dikombinasikan dengan DATA_STATIC_WHILE_SET_AT_EXECUTE adalah bahwa deskriptor volatil masih mengharuskan deskriptor siap selama eksekusi daftar perintah / bundel, dan DATA_STATIC_WHILE_SET_AT_EXECUTE hanya membuat janji tentang kelaikan statis dalam subset daftar perintah / eksekusi bundel.

Ringkasan Bendera

Tabel berikut ini meringkas kombinasi bendera yang mungkin digunakan.

Pengaturan D3D12_DESCRIPTOR_RANGE_FLAGS yang valid Deskripsi
Tidak ada bendera yang ditetapkan Deskriptor bersifat statis (default). Asumsi default untuk data: untuk SRV/CBV: DATA_STATIC_WHILE_SET_AT_EXECUTE, dan untuk UAV: DATA_VOLATILE. Default untuk SRV/CBV ini akan dengan aman sesuai dengan pola penggunaan untuk sebagian besar tanda tangan akar.
DATA_STATIC Baik deskriptor maupun data bersifat statis. Ini memaksimalkan potensi pengoptimalan driver.
DATA_VOLATILE Deskriptor bersifat statis dan datanya mudah menguap.
DATA_STATIC_WHILE_SET_AT_EXECUTE Deskriptor bersifat statis dan data statis saat diatur saat dijalankan.
DESCRIPTORS_VOLATILE Deskriptor volatil, dan asumsi default dibuat tentang data: untuk SRV/CBV: DATA_STATIC_WHILE_SET_AT_EXECUTE, dan untuk UAV: DATA_VOLATILE.
DESCRIPTORS_VOLATILE | DATA_VOLATILE Baik deskriptor maupun data tidak stabil, setara dengan Tanda Tangan Akar 1.0.
DESCRIPTORS_VOLATILE | DATA_STATIC_WHILE_SET_AT_EXECUTE Deskriptor volatil, tetapi perhatikan bahwa masih tidak memungkinkannya untuk berubah selama eksekusi daftar perintah. Jadi valid untuk menggabungkan deklarasi tambahan bahwa data statis saat diatur melalui tabel deskriptor akar selama eksekusi - deskriptor yang mendasar secara efektif statis lebih lama dari data yang dijanjikan menjadi statis.

 

Pengaturan D3D12_ROOT_DESCRIPTOR_FLAGS yang valid Deskripsi
Tidak ada bendera yang ditetapkan Asumsi default untuk data: untuk SRV/CBV: DATA_STATIC_WHILE_SET_AT_EXECUTE, dan untuk UAV: DATA_VOLATILE. Default untuk SRV/CBV ini akan dengan aman sesuai dengan pola penggunaan untuk sebagian besar tanda tangan akar.
DATA_STATIC Data statis, potensi terbaik untuk pengoptimalan driver.
DATA_STATIC_WHILE_SET_AT_EXECUTE Data statis saat diatur saat dijalankan.
DATA_VOLATILE Setara dengan Tanda Tangan Akar 1.0.

 

Ringkasan API Versi 1.1

Panggilan API berikut mengaktifkan versi 1.1.

Enum

Enumerasi ini berisi bendera kunci untuk menentukan deskriptor dan volatilitas data.

Struktur

Struktur yang diperbarui (dari versi 1.0) berisi referensi ke volatilitas/bendera statis.

Fungsi

Metode yang tercantum di sini menggantikan fungsi D3D12SerializeRootSignature asli dan D3D12CreateRootSignatureDeserializer , karena dirancang untuk mengerjakan versi tanda tangan root apa pun. Formulir berseri adalah apa yang diteruskan ke API CreateRootSignature . Jika shader telah ditulis dengan tanda tangan akar di dalamnya, shader yang dikompilasi akan berisi tanda tangan akar berseri di dalamnya.

Metode

Antarmuka ID3D12VersionedRootSignatureDeserializer dibuat untuk mendeserialisasi struktur data tanda tangan akar.

Struktur pembantu

Struktur pembantu telah ditambahkan untuk membantu dalam inisialisasi beberapa struktur versi 1.1.

  • CD3DX12_DESCRIPTOR_RANGE1
  • CD3DX12_ROOT_PARAMETER1
  • CD3DX12_STATIC_SAMPLER1
  • CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC

Lihat Struktur dan Fungsi Pembantu untuk D3D12.

Konsekuensi melanggar bendera statis-ness

Deskriptor dan bendera data yang dijelaskan di atas (serta default yang tersirat oleh tidak adanya bendera tertentu) mendefinisikan janji oleh aplikasi kepada driver tentang bagaimana perilakunya. Jika aplikasi melanggar janji, ini adalah perilaku yang tidak valid: hasil tidak terdefinisi dan mungkin berbeda di berbagai driver dan perangkat keras.

Lapisan debug memiliki opsi untuk memvalidasi bahwa aplikasi mematuhi janji mereka, termasuk janji default yang disertakan dengan menggunakan Tanda Tangan Akar versi 1.1 tanpa mengatur bendera apa pun.

Manajemen versi

Saat mengkompilasi tanda tangan akar yang dilampirkan ke shader, pengkompilasi HLSL yang lebih baru akan default untuk mengkompilasi tanda tangan akar pada versi 1.1, sedangkan kompilator HLSL lama hanya mendukung 1.0. Perhatikan bahwa tanda tangan akar 1.1 tidak akan berfungsi pada OS yang tidak mendukung tanda tangan akar 1.1.

Versi tanda tangan akar yang dikompilasi dengan shader dapat dipaksa ke versi tertentu menggunakan /force_rootsig_ver <version>. Memaksa versi akan berhasil jika pengkompilasi dapat mempertahankan perilaku tanda tangan akar yang dikompilasi pada versi paksa, misalnya dengan menghilangkan bendera yang tidak didukung di tanda tangan akar yang hanya berfungsi untuk tujuan pengoptimalan tetapi tidak memengaruhi perilaku.

Dengan cara ini aplikasi dapat, misalnya, mengkompilasi tanda tangan akar 1.1 ke 1.0 dan 1.1 saat membangun aplikasi dan memilih versi yang sesuai pada runtime tergantung pada tingkat dukungan OS. Namun, sebagian besar ruang akan efisien bagi aplikasi untuk mengkompilasi tanda tangan akar satu per satu (terutama jika beberapa versi diperlukan), secara terpisah dari shader. Bahkan jika shader awalnya tidak dikompilasi dengan tanda tangan akar yang terpasang, manfaat validasi kompilator kompatibilitas tanda tangan akar dengan shader dapat dipertahankan dengan menggunakan /verifyrootsignature opsi kompilator. Nantinya pada runtime, PSO dapat dibuat menggunakan shader yang tidak memiliki tanda tangan akar di dalamnya sambil meneruskan tanda tangan akar yang diinginkan (mungkin versi yang sesuai didukung oleh OS) sebagai parameter terpisah.

Membuat Tanda Tangan Akar

Tanda Tangan Akar

Menentukan Tanda Tangan Akar di HLSL