Bagikan melalui


Gambaran Umum Tumpuk Deskriptor

Tumpukan deskriptor berisi banyak jenis objek yang bukan bagian dari Objek Status Alur (PSO), seperti Tampilan Sumber Daya Shader (SRV), Tampilan Akses Tidak Berurut (UAV), Tampilan Buffer Konstan (CBV), dan Sampler.

Tujuan Tumpukan Deskriptor

Tujuan utama tumpukan deskriptor adalah untuk mencakup sebagian besar alokasi memori yang diperlukan untuk menyimpan spesifikasi deskriptor jenis objek yang direferensikan shader untuk sebesar jendela penyajian mungkin (idealnya seluruh bingkai penyajian atau lebih). Jika aplikasi beralih tekstur mana yang dilihat alur dengan cepat dari API, harus ada ruang dalam tumpuk deskriptor untuk menentukan tabel deskriptor dengan cepat untuk setiap set status yang diperlukan. Aplikasi dapat memilih untuk menggunakan kembali definisi jika sumber daya digunakan lagi di objek lain, misalnya, atau hanya menetapkan ruang tumpukan secara berurutan saat mengalihkan berbagai jenis objek.

Timbunan deskriptor juga memungkinkan komponen perangkat lunak individual untuk mengelola penyimpanan deskriptor secara terpisah satu sama lain.

Semua timbunan terlihat oleh CPU. Aplikasi ini juga dapat meminta properti akses CPU mana yang harus dimiliki timbunan deskriptor (jika ada) - tulis gabungan, tulis balik, dan sebagainya. Aplikasi dapat membuat tumpukan deskriptor sebanyak yang diinginkan dengan properti apa pun yang diinginkan. Aplikasi selalu memiliki opsi untuk membuat tumpukan deskriptor yang murni untuk tujuan penahapan yang berukuran tidak dibatasi, dan menyalin ke tumpukan deskriptor yang digunakan untuk penyajian seperlunya.

Ada beberapa batasan dalam apa yang dapat terjadi dalam tumpukan deskriptor yang sama. Entri CBV, UAV, dan SRV dapat berada dalam tumpukan deskriptor yang sama. Namun, entri Samplers tidak dapat berbagi tumpukan dengan entri CBV, UAV, atau SRV. Biasanya, ada dua set timbunan deskriptor, satu untuk sumber daya umum dan yang kedua untuk Sampler.

Penggunaan tumpukan deskriptor oleh Direct3D 12 mencerminkan apa yang dilakukan sebagian besar perangkat keras GPU, yaitu mengharuskan deskriptor hanya hidup dalam tumpukan deskriptor, atau hanya sedikit bit alamat yang diperlukan jika tumpukan ini digunakan. Direct3D 12 memang memerlukan penggunaan tumpukan deskriptor, tidak ada opsi untuk menempatkan deskriptor di mana saja dalam memori.

Timbunan deskriptor hanya dapat segera diedit oleh CPU, tidak ada opsi untuk mengedit timbunan deskriptor oleh GPU.

Sinkronisasi

Konten tumpukan deskriptor dapat diubah sebelum, selama, dan setelah merekam daftar perintah yang mereferensikannya. Namun, deskriptor tidak dapat diubah saat daftar perintah yang dikirimkan untuk eksekusi mungkin mereferensikan lokasi tersebut, karena ini dapat memanggil kondisi balapan.

Pengikatan

Paling banyak satu heap gabungan CBV/SRV/UAV dan satu heap Sampler dapat diikat kapan saja. Tumpukan ini dibagi antara grafik dan alur komputasi (dijelaskan dalam PSO mereka).

Beralih timbunan

Dapat diterima bagi aplikasi untuk beralih timbunan dalam daftar perintah yang sama atau di yang berbeda menggunakan API SetDescriptorHeaps dan Reset . Pada beberapa perangkat keras, ini bisa menjadi operasi yang mahal, membutuhkan kios GPU untuk membersihkan semua pekerjaan yang tergantung pada tumpukan deskriptor yang saat ini terikat. Akibatnya, jika tumpukan deskriptor harus diubah, aplikasi harus mencoba melakukannya ketika beban kerja GPU relatif ringan, mungkin membatasi perubahan pada awal daftar perintah.

Bundel

Dengan bundel hanya boleh ada satu panggilan ke metode SetDescriptorHeaps , dan kumpulan tumpukan deskriptor harus sama persis dengan yang ada di daftar perintah yang memanggil bundel. Jika bundel tidak mengubah tabel deskriptor, bundel tidak perlu mengatur tumpukan deskriptor.

Untuk daftar panggilan API yang tidak dapat digunakan dengan bundel, lihat Membuat dan Merekam Daftar Perintah dan Bundel.

Pengelolaan

Untuk merender semua objek dalam adegan, banyak deskriptor akan diperlukan, dan ada beberapa strategi manajemen berbeda yang dapat diikuti.

Strategi paling mendasar adalah mengisi area baru tumpukan deskriptor dengan semua persyaratan untuk panggilan gambar berikutnya. Jadi, tepat sebelum mengeluarkan panggilan gambar pada daftar perintah, penunjuk tabel deskriptor akan diatur ke awal tabel yang baru diisi. Yang terbalik adalah bahwa tidak perlu merekam di mana deskriptor tertentu berada di tumpukan.

Kelemahan dari strategi ini adalah bahwa mungkin ada banyak pengulangan deskriptor dalam tumpukan deskriptor, terutama ketika adegan yang sangat mirip sedang dirender, dan ruang tumpukan deskriptor akan digunakan dengan cepat. Tumpukan deskriptor terpisah untuk yang dirender pada GPU dan bagi mereka yang direkam oleh CPU, mungkin perlu untuk menghindari konflik. Atau, sistem sub-alokasi dapat digunakan.

Selain itu, sistem dasar dapat dioptimalkan lebih lanjut dengan menggunakan tabel deskriptor yang tumpang tindih dengan cermat dari satu panggilan gambar ke panggilan berikutnya, sehingga hanya deskriptor baru yang diperlukan yang ditambahkan.

Strategi yang lebih efisien daripada yang dasar adalah melakukan pra-isi tumpuk deskriptor dengan deskriptor yang diperlukan untuk objek (atau bahan) yang diketahui menjadi bagian dari adegan. Idenya di sini adalah bahwa hanya perlu untuk mengatur tabel deskriptor pada waktu gambar, karena tumpuk deskriptor diisi sebelumnya.

Variasi strategi pra-pengisian adalah memperlakukan tumpukan deskriptor sebagai satu array besar, yang berisi semua deskriptor yang diperlukan di lokasi tetap yang diketahui. Kemudian panggilan gambar hanya perlu menerima sekumpulan konstanta yang merupakan indeks ke dalam array tempat deskriptor yang perlu digunakan.

Pengoptimalan lebih lanjut adalah memastikan konstanta akar dan deskriptor akar berisi konstanta yang paling sering berubah, daripada menempatkan konstanta dalam tumpukan deskriptor. Untuk sebagian besar perangkat keras, ini adalah cara yang efisien untuk menangani konstanta.

Dalam praktiknya, mesin grafis mungkin menggunakan strategi yang berbeda dalam situasi yang berbeda, dan menggabungkan elemen dari setiap strategi agar sesuai dengan persyaratan gambar tertentu.

Tumpuk Deskriptor