Bagikan melalui


Gambaran Umum Deskripsi

Deskriptor dibuat oleh panggilan API dan mengidentifikasi sumber daya.

Data penjelas

Deskriptor adalah blok data yang relatif kecil yang sepenuhnya menjelaskan objek ke GPU, dalam format buram khusus GPU. Ada beberapa jenis deskriptor yang berbeda—tampilan target render (RTV), tampilan stensil kedalaman (DSV), tampilan sumber daya shader (SRV), tampilan akses tanpa urutan (UAV), tampilan buffer konstan (CBV), dan sampler.

Deskriptor bervariasi dalam ukuran, tergantung pada perangkat keras GPU. Anda dapat menanyakan ukuran SRV, UAV, atau CBV dengan memanggil ID3D12Device::GetDescriptorHandleIncrementSize. Deskriptor ditampilkan dalam dokumentasi ini sebagai unit yang tidak dapat dibagi; berikut adalah contohnya.

srv, cbv, uav, dan sampler

Deskriptor dibuat oleh panggilan API, dan akan menyertakan informasi seperti sumber daya dan peta mip yang Anda inginkan untuk dimuat oleh deskriptor.

Driver tidak melacak atau menyimpan referensi ke deskriptor, terserah aplikasi untuk memastikan jenis deskriptor yang benar sedang digunakan, dan bahwa informasi tersebut terkini. Ada satu pengecualian kecil untuk ini; driver memang memeriksa ikatan target render untuk memastikan swap chain berfungsi dengan benar.

Deskriptor objek tidak perlu dibebaskan atau dirilis. Driver tidak melampirkan alokasi apa pun ke pembuatan deskriptor. Namun, deskriptor dapat mengacu pada alokasi lain yang masa pakainya dikelola oleh aplikasi. Misalnya, deskriptor untuk SRV harus berisi alamat virtual sumber daya D3D (misalnya tekstur) yang dirujuk SRV. Adalah tanggung jawab aplikasi untuk memastikan bahwa tidak menggunakan deskriptor SRV ketika sumber daya D3D mendasar yang menjadi dasar aplikasinya telah dihancurkan atau sedang dimodifikasi (seperti dinyatakan sebagai tidak-residen).

Cara utama untuk menggunakan deskriptor adalah dengan menempatkannya dalam heap deskriptor, yang merupakan memori pendukung untuk deskriptor.

Pegangan deskriptor

Handle deskriptor adalah alamat unik deskriptor. Ini mirip dengan pointer, tetapi buram karena implementasinya spesifik untuk perangkat keras. Penunjuk ini unik di seluruh kumpulan deskriptor, jadi, misalnya, sebuah array penunjuk dapat mereferensikan deskriptor dalam beberapa kumpulan.

Handle CPU digunakan untuk penggunaan segera, misalnya penyalinan di mana sumber dan tujuan perlu diidentifikasi. Segera setelah digunakan (misalnya, panggilan ke ID3D12GraphicsCommandList::OMSetRenderTargets), mereka dapat digunakan kembali, atau tumpukan dasarnya dapat dibebaskan.

Pegangan GPU bukan untuk penggunaan segera—pegangan GPU mengidentifikasi lokasi dari daftar perintah, untuk digunakan saat eksekusi GPU. Mereka harus tetap dipertahankan hingga setiap daftar perintah yang merujuknya telah sepenuhnya dijalankan.

Untuk membuat handle deskriptor untuk awal heap, setelah membuat heap deskriptor itu sendiri, panggil salah satu metode berikut:

Metode ini mengembalikan struktur berikut:

Karena ukuran deskriptor bervariasi menurut perangkat keras, untuk mendapatkan kenaikan antara setiap deskriptor dalam sebuah heap, gunakan:

Aman untuk meng-offset lokasi awal dengan sejumlah kenaikan, menyalin handle, dan memasukkan handle ke dalam panggilan API. Tidak aman untuk mendereferensikan handel seolah-olah merupakan penunjuk CPU yang valid, ataupun melakukan analisis bit dalam handel.

Beberapa struktur pembantu telah ditambahkan, dengan anggota inisialisasi, untuk membuat pengelolaan handle menjadi sedikit lebih mudah.

Deskriptor null

Saat membuat deskriptor menggunakan panggilan API, aplikasi meneruskan NULL untuk penunjuk sumber daya dalam definisi deskriptor untuk mencapai efek tidak ada yang terikat saat diakses oleh shader.

Deskriptor lainnya harus diisi sebanyak mungkin. Misalnya, dalam kasus Tampilan Sumber Daya Shader (SRV), deskriptor dapat digunakan untuk membedakan jenis tampilannya (Texture1D, Texture2D, dan sebagainya). Parameter numerik dalam deskriptor tampilan, seperti jumlah mipmap, semuanya harus diatur ke nilai yang valid untuk sumber daya.

Dalam banyak kasus, ada perilaku yang ditentukan untuk mengakses sumber daya yang tidak terikat, seperti SRV yang mengembalikan nilai default. Hal tersebut akan dihormati saat mengakses deskriptor NULL selama jenis akses shader kompatibel dengan jenis deskriptor. Misalnya, jika shader mengharapkan Texture2D SRV dan mengakses NULL SRV yang didefinisikan sebagai Texture1D, perilaku tersebut tidak terdefinisi dan dapat mengakibatkan reset perangkat.

Singkatnya, untuk membuat deskriptor null, teruskan null untuk parameter pResource saat membuat tampilan dengan metode seperti CreateShaderResourceView. Untuk parameter deskripsi tampilan pDesc, atur konfigurasi yang akan berfungsi jika sumber daya tidak null (jika tidak, crash dapat terjadi pada beberapa perangkat keras).

Namun, deskriptor root tidak boleh diatur ke null.

Pada perangkat keras Tier1 (lihat Tingkat Perangkat Keras, semua deskriptor yang terikat (melalui tabel deskriptor) harus diinisialisasi, baik sebagai deskriptor nyata atau deskriptor null, bahkan jika tidak diakses oleh perangkat keras, jika tidak, perilaku tidak terdefinisi.

Pada perangkat keras Tier2, ini berlaku untuk deskriptor CBV dan UAV terikat, tetapi tidak untuk deskriptor SRV.

Pada perangkat keras Tier3, tidak ada batasan tentang hal ini, asalkan deskriptor yang tidak diinisialisasi tidak pernah diakses.

Deskriptor default

Untuk membuat deskriptor default untuk tampilan tertentu, berikan parameter pResource yang valid ke metode pembuatan tampilan (seperti CreateShaderResourceView), tetapi berikan NULL untuk parameter pDesc. Misalnya, jika sumber daya berisi 14 mips, tampilan akan berisi 14 mips. Kasus default mencakup pemetaan sumber daya yang paling jelas ke tampilan. Ini memang mengharuskan sumber daya dialokasikan dalam format nama yang lengkap dan spesifik (seperti DXGI_FORMAT_R8G8B8A8_UNORM_SRGB daripada DXGI_FORMAT_R8G8B8A8_TYPELESS).

Deskriptor bawaan tidak dapat digunakan dengan tampilan struktur akselerasi raytracing, karena parameter pResource yang disediakan harus NULL, dan lokasi harus diteruskan melalui D3D12_RAYTRACING_ACCELERATION_STRUCTURE_SRV.

Deskriptor