Sub sumber daya (Direct3D 12 Graphics)
Menjelaskan bagaimana sumber daya dibagi menjadi subsumber daya, dan cara mereferensikan satu, beberapa, atau sepotong sub sumber daya.
Contoh sub-sumber daya
Jika sumber daya berisi buffer, maka sumber daya hanya berisi satu subsumber daya dengan indeks 0. Jika sumber daya berisi tekstur (atau array tekstur), maka mereferensikan subsumber daya lebih kompleks.
Beberapa API mengakses seluruh sumber daya (seperti metode ID3D12GraphicsCommandList::CopyResource ), yang lain mengakses sebagian sumber daya (misalnya metode ID3D12Resource::ReadFromSubresource ). Metode yang mengakses sebagian sumber daya umumnya menggunakan deskripsi tampilan (seperti struktur D3D12_TEX2D_ARRAY_SRV ) untuk menentukan sub sumber daya yang akan diakses. Lihat bagian API Subresource untuk daftar lengkapnya.
Pengindeksan sub sumber daya
Untuk mengindeks subsumber daya tertentu, tingkat mip diindeks terlebih dahulu saat setiap entri array diindeks.
Ilis mip
Ikatan mip mencakup satu tingkat mipmap untuk setiap tekstur dalam array, seperti yang ditunjukkan pada gambar berikut.
Iringan array
Mengingat array tekstur, setiap tekstur dengan mipmaps, iringan array menyertakan satu tekstur dan semua tingkat mip-nya, seperti yang ditunjukkan pada gambar berikut.
Ilis bidang
Biasanya format planar tidak digunakan untuk menyimpan data RGBA, tetapi dalam kasus di mana itu (mungkin data RGB 24bpp), satu bidang dapat mewakili gambar merah, satu hijau, dan satu gambar biru. Satu bidang belum tentu satu warna, dua atau lebih warna dapat digabungkan menjadi satu bidang. Data planar yang lebih umum digunakan untuk data YCbCr dan Depth-Stencil sub-sampel. Depth-Stencil adalah satu-satunya format yang sepenuhnya mendukung mipmap, array, dan beberapa bidang (seringkali bidang 0 untuk Kedalaman dan bidang 1 untuk Stensil).
Pengindeksan sub sumber daya untuk array dua gambar Depth-Stencil, masing-masing dengan tiga tingkat mip, ditunjukkan di bawah ini.
YCbCr sub-sampel mendukung array dan memiliki bidang, tetapi tidak mendukung mipmaps. Gambar YCbCr memiliki dua bidang, satu untuk luminance (Y) yang mata manusia paling sensitif, dan satu untuk krominasi (Cb, dan Cr, diselingi) yang mata manusia kurang sensitif. Format ini memungkinkan kompresi nilai krominance untuk memadatkan gambar tanpa memengaruhi luminance, dan merupakan format kompresi video umum karena alasan itu, meskipun digunakan untuk memadatkan gambar diam. Gambar di bawah ini menunjukkan format NV12, mencatat krominasi telah dikompresi hingga seperempat resolusi luminance, yang berarti lebar setiap bidang identik, dan bidang krominance setengah dari ketinggian bidang luminance. Bidang akan diindeks sebagai sub sumber daya dengan cara yang identik dengan contoh Depth-Stencil di atas.
Format planar ada di Direct3D 11, tetapi masing-masing bidang tidak dapat ditangani secara individual, misalnya untuk operasi penyalinan atau pemetaan. Ini diubah di Direct3D 12 sehingga setiap bidang menerima ID sub sumber dayanya sendiri. Bandingkan dua metode berikut untuk menghitung ID sub sumber daya.
Direct3D 11
inline UINT D3D11CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT MipLevels )
{
return MipSlice + (ArraySlice * MipLevels);
}
Direct3D 12
inline UINT D3D12CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT PlaneSlice, UINT MipLevels, UINT ArraySize )
{
return MipSlice + (ArraySlice * MipLevels) + (PlaneSlice * MipLevels * ArraySize);
}
Sebagian besar perangkat keras mengasumsikan bahwa memori untuk plane N selalu segera dialokasikan setelah plane N-1.
Alternatif untuk menggunakan subresources adalah aplikasi dapat mengalokasikan sumber daya yang sepenuhnya terpisah per bidang. Dalam hal ini, aplikasi memahami datanya planar dan menggunakan beberapa sumber daya untuk mewakilinya.
Beberapa sub sumber daya
Tampilan sumber daya shader dapat memilih wilayah subresource persegi panjang apa pun, menggunakan salah satu irisan yang dijelaskan di atas dan penggunaan bidang yang yudisial dalam struktur tampilan (seperti D3D12_TEX2D_ARRAY_SRV), seperti yang ditunjukkan pada gambar.
Tampilan target render hanya dapat menggunakan satu potongan subsumber daya atau mip dan tidak dapat menyertakan subresource dari lebih dari satu potongan mip. Artinya, setiap tekstur dalam tampilan target render harus berukuran sama. Tampilan sumber daya shader dapat memilih wilayah persegi mana pun dari sub sumber daya, seperti yang ditunjukkan pada gambar.
API Subresource
Referensi API berikut dan bekerja dengan sub-sumber daya:
Enumerasi:
Struktur berikut berisi indeks PlaneSlice , sebagian besar berisi indeks MipSlice .
- D3D12_TEX2D_RTV
- D3D12_TEX2D_ARRAY_RTV
- D3D12_TEX2D_SRV
- D3D12_TEX2D_ARRAY_SRV
- D3D12_TEX2D_UAV
- D3D12_TEX2D_ARRAY_UAV
Struktur berikut berisi indeks ArraySlice , sebagian besar berisi indeks MipSlice .
- D3D12_TEX1D_ARRAY_DSV
- D3D12_TEX2D_ARRAY_DSV
- D3D12_TEX2DMS_ARRAY_DSV
- D3D12_TEX1D_ARRAY_RTV
- D3D12_TEX2D_ARRAY_RTV
- D3D12_TEX2DMS_ARRAY_RTV
- D3D12_TEX1D_ARRAY_SRV
- D3D12_TEX2D_ARRAY_SRV
- D3D12_TEX2DMS_ARRAY_SRV
- D3D12_TEX1D_ARRAY_UAV
- D3D12_TEX2D_ARRAY_UAV
Struktur berikut berisi indeks MipSlice , tetapi bukan indeks ArraySlice atau PlaneSlice .
Struktur berikut ini juga mereferensikan sub-sumber daya:
- D3D12_DISCARD_REGION : struktur yang digunakan dalam persiapan untuk membuang sumber daya.
- D3D12_PLACED_SUBRESOURCE_FOOTPRINT : menambahkan offset ke dalam sumber daya ke jejak dasar.
- D3D12_RESOURCE_TRANSITION_BARRIER : menjelaskan transisi subsumber daya antara penggunaan yang berbeda (sumber daya shader, target render, dll.).
- D3D12_SUBRESOURCE_DATA : data sub sumber daya mencakup data itu sendiri, dan pitch baris dan ipotong.
- D3D12_SUBRESOURCE_FOOTPRINT : jejak mencakup format, lebar, tinggi, kedalaman, dan pitch baris subsumber daya.
- D3D12_SUBRESOURCE_INFO : berisi offset, pitch baris, dan pitch kedalaman subsumber daya.
- D3D12_SUBRESOURCE_TILING : menjelaskan volume subresource berjenjang (lihat Sumber Daya Berjenjang Volume).
- D3D12_TEXTURE_COPY_LOCATION : menjelaskan sebagian tekstur untuk tujuan penyalinan.
- D3D12_TILED_RESOURCE_COORDINATE : menjelaskan koordinat sumber daya ubin.
Metode:
- ID3D12Device::GetCopyableFootprints : mendapatkan informasi tentang sumber daya, untuk mengaktifkan salinan yang akan dibuat.
- ID3D12Device::GetResourceTiling : mendapatkan info tentang bagaimana sumber daya ubin dipecah menjadi petak peta.
- ID3D12GraphicsCommandList::ResolveSubresource : menyalin sub sumber daya multi-sampel ke dalam subsumber daya non-multi-sampel.
- ID3D12Resource::Map : mengembalikan pointer ke data yang ditentukan dalam sumber daya, dan menolak akses GPU ke subsumber daya.
- ID3D12Resource::ReadFromSubresource : menyalin data dari subresource, atau wilayah persegi panjang sub sumber daya.
- ID3D12Resource::Unmap : batalkan peta rentang memori yang ditentukan dan batalkan penunjuk ke sumber daya. Menginstal ulang akses GPU ke subsumber daya.
- ID3D12Resource::WriteToSubresource : menyalin data ke subresource, atau wilayah persegi panjang dari subsumber daya.
Tekstur harus dalam status D3D12_RESOURCE_STATE_COMMON untuk akses CPU melalui WriteToSubresource dan ReadFromSubresource menjadi legal; tetapi buffer tidak. Akses CPU ke sumber daya biasanya dilakukan melalui PetaTidak Dipetakan/.
Topik terkait