Bagikan melalui


Menggunakan deskriptor langsung di tanda tangan akar

Untuk menghindari kebutuhan untuk melalui tumpukan deskriptor, Anda dapat memasukkan deskriptor langsung ke tanda tangan root. Deskriptor ini mengambil banyak ruang di tanda tangan akar (lihat Batas tanda tangan akar), jadi kami sarankan Anda menggunakannya dengan hemat.

Contoh penggunaan adalah menempatkan di tata letak akar tampilan buffer konstanta (CBV) yang berubah per gambar. Itu sehingga ruang heap deskriptor tidak harus dialokasikan oleh aplikasi per gambar (dan menyimpan menunjuk tabel deskriptor di lokasi baru di tumpuk deskriptor). Dengan memasukkan sesuatu ke dalam tanda tangan root, aplikasi hanya menyerahkan tanggung jawab penerapan versi kepada driver; tapi itu infrastruktur yang sudah dimiliki driver.

Untuk penyajian yang menggunakan sumber daya yang sangat sedikit, penggunaan tabel/tumpukan deskriptor mungkin tidak diperlukan sama sekali jika semua deskriptor yang diperlukan dapat ditempatkan langsung di tanda tangan akar.

Ini adalah satu-satunya jenis deskriptor yang didukung dalam tanda tangan akar.

  • Tampilan buffer konstan (CBV).
  • Tampilan sumber daya shader (SRV) / tampilan akses tidak berurutan (UAV) sumber daya buffer di mana konversi format tidak diperlukan (buffer yang tidak diketik). Beberapa contoh buffer yang tidak diketik yang dapat diikat dengan deskriptor akar termasuk StructuredBuffer<type>, , RWStructuredBuffer<type>ByteAddressBuffer dan RWByteAddressBuffer. Buffer yang diketik seperti Buffer<uint> dan Buffer<float2> tidak bisa.
  • SRV struktur akselerasi raytracing, dalam tanda tangan akar lokal atau global.

UAV di root tidak dapat memiliki penghitung yang terkait dengannya. Deskriptor dalam tanda tangan akar muncul masing-masing sebagai deskriptor terpisah individu—mereka tidak dapat diindeks secara dinamis.

struct SceneData
{
   uint foo;
   float bar[2];
   int moo;
};
ConstantBuffer<SceneData> mySceneData : register(b6);

Dalam contoh di atas, mySceneData tidak dapat dinyatakan sebagai array, seperti jika akan dipetakan cbuffer mySceneData[2] ke deskriptor dalam tanda tangan akar. Itu karena pengindeksan di seluruh deskriptor tidak didukung dalam tanda tangan akar. Jika diinginkan, Anda dapat menentukan buffer konstanta individual terpisah, dan mendefinisikannya masing-masing sebagai entri terpisah dalam tanda tangan akar. Perhatikan bahwa dalam mySceneData di atas, ada array bar[2]. Pengindeksan dinamis dalam buffer konstanta valid—deskriptor dalam tanda tangan akar bertingkah seperti deskriptor yang sama akan bertingkah jika diakses melalui tumpuk deskriptor. Ini berbeda dengan konstanta inlining langsung di tanda tangan akar, yang juga muncul seperti buffer konstanta, kecuali dengan batasan bahwa pengindeksan dinamis dalam konstanta sebaris tidak diizinkan, jadi bar[2] tidak akan diizinkan di sana.

API ini (dari antarmuka ID3D12GraphicsCommandList ) adalah untuk mengatur deskriptor langsung pada tanda tangan root.

Catatan

Tidak ada konsep array deskriptor akar di Direct3D 12. Array deskriptor hanya didukung dalam timbunan deskriptor.