API Sumber Daya Ubin

API yang dijelaskan di bagian ini berfungsi dengan sumber daya ubin dan kumpulan petak peta.

Menetapkan petak peta dari kumpulan petak peta ke sumber daya

ID3D11DeviceContext2::UpdateTileMappings dan ID3D11DeviceContext2::CopyTileMappings API memanipulasi dan mengkueri pemetaan petak peta. Perbarui panggilan hanya memengaruhi petak peta yang diidentifikasi dalam panggilan, dan yang lain dibiarkan seperti yang didefinisikan sebelumnya.

Petak peta tertentu dari kumpulan petak peta dapat dipetakan ke beberapa lokasi dalam sumber daya dan bahkan beberapa sumber daya. Pemetaan ini mencakup petak peta dalam sumber daya yang memiliki tata letak yang dipilih implementasi (pengemasan Mipmap) di mana beberapa mipmap dikemas bersama-sama ke dalam satu petak peta. Tangkapannya adalah bahwa jika data ditulis ke petak peta melalui satu pemetaan, tetapi dibaca melalui pemetaan yang dikonfigurasi secara berbeda, hasilnya tidak ditentukan. Namun, penggunaan yang cermat dari fleksibilitas ini masih dapat berguna untuk aplikasi, seperti berbagi petak peta antara sumber daya yang tidak akan digunakan secara bersamaan, di mana konten petak peta selalu diinisialisasi melalui pemetaan sumber daya yang sama karena kemudian akan dibaca. Demikian pula, petak peta yang dipetakan untuk menahan mipmap yang dikemas dari beberapa sumber daya yang berbeda dengan dimensi permukaan yang sama akan berfungsi dengan baik - data akan muncul sama di kedua pemetaan.

Perubahan pada penetapan petak peta untuk sumber daya dapat dilakukan kapan saja dalam konteks langsung atau ditangguhkan.

Mengkueri petak dan dukungan sumber daya

Untuk mengkueri ubin sumber daya, gunakan ID3D11Device2::GetResourceTiling.

Untuk dukungan ubin sumber daya lainnya, gunakan ID3D11Device2::CheckMultisampleQualityLevels1.

Menyalin data berjenjang

Metode apa pun di Direct3D untuk memindahkan data di sekitar bekerja dengan sumber daya petak peta seolah-olah tidak diurutkan, kecuali bahwa penulisan ke area yang tidak dipetakan dihilangkan dan dibaca dari area yang tidak dipetakan menghasilkan 0. Jika operasi salin melibatkan penulisan ke lokasi memori yang sama beberapa kali karena beberapa lokasi di sumber daya tujuan dipetakan ke memori petak peta yang sama, penulisan yang dihasilkan ke petak peta multi-dipetakan tidak deterministik dan tidak dapat diulang. Artinya, akses terjadi dalam urutan apa pun yang terjadi perangkat keras untuk menjalankan salinan.

Direct3D 11.2 memperkenalkan metode untuk cara tambahan ini untuk menyalin:

  • Salin antara petak peta dalam sumber daya petak peta (pada granularitas petak peta 64KB) dan (ke/dari) buffer dalam memori unit pemrosesan grafis (GPU) (atau sumber daya penahapan) - ID3D11DeviceContext2::CopyTiles
  • Salin dari memori yang disediakan aplikasi ke petak peta dalam sumber daya ubin - ID3D11DeviceContext2::UpdateTiles

Metode ini menggeser/deswizzle sesuai kebutuhan, dan memungkinkan bendera D3D11_TILE_COPY_NO_OVERWRITE ketika pemanggil menjanjikan memori tujuan tidak dirujuk oleh pekerjaan GPU yang sedang dalam penerbangan.

Petak yang terlibat dalam salinan tidak dapat menyertakan petak peta yang berisi mipmap yang dikemas atau yang memiliki hasil yang tidak terdefinisi. Untuk mentransfer data ke/dari mipmap yang dikemas perangkat keras ke dalam satu petak peta, Anda harus menggunakan API Salin/Perbarui standar (khusus non-ubin) atau ID3D11DeviceContext::GenerateMips untuk seluruh rantai mip.

Catatan di GenerateMips: Menggunakan ID3D11DeviceContext::GenerateMips pada sumber daya dengan petak peta yang dipetakan sebagian akan menghasilkan hasil yang hanya mengikuti aturan untuk membaca dan menulis NULL yang diterapkan pada algoritma apa pun yang digunakan perangkat keras dan driver tampilan pada GenerateMips. Jadi, tidak terlalu berguna bagi aplikasi untuk repot-repot melakukan ini kecuali entah bagaimana area dengan pemetaan NULL (dan efeknya pada mips lain selama fase pembuatan) tidak akan memiliki konsekuensi pada bagian-bagian permukaan yang dipedulikan aplikasi.

Menyalin data petak peta dari permukaan penahapan atau dari memori aplikasi akan menjadi cara untuk mengunggah petak peta yang mungkin telah dialirkan dari disk, misalnya. Variasi saat streaming off disk mengunggah semacam data terkompresi ke memori GPU lalu pendekodean pada GPU. Target dekode bisa menjadi sumber daya buffer dalam memori GPU, dari mana CopyTiles kemudian menyalin ke sumber daya petak yang sebenarnya. Langkah penyalinan ini memungkinkan GPU berdengung ketika pola gerimis tidak diketahui. Penyimpangan tidak diperlukan jika sumber daya ubin itu sendiri adalah sumber daya buffer (misalnya, dibandingkan dengan Tekstur).

Tata letak memori petak peta di sisi sumber daya buffer non-ubin salinan hanya linier dalam memori dalam petak peta 64KB, yang akan digelindingkan perangkat keras dan driver tampilan per petak peta yang sesuai saat mentransfer ke/dari sumber daya ubin. Untuk permukaan antialias multisample (MSAA), setiap sampel piksel dilalui dalam urutan indeks sampel sebelum berpindah ke piksel berikutnya. Untuk petak peta yang sebagian diisi di sisi kanan (untuk permukaan yang memiliki lebar bukan kelipatan lebar petak dalam piksel), pitch/langkah untuk memindahkan ke bawah baris adalah ukuran penuh dalam byte dari piksel angka yang akan pas di seluruh petak jika petak peta penuh. Jadi, mungkin ada celah antara setiap baris piksel dalam memori. Untuk kesederhanaan spesifikasi, mipmap yang lebih kecil dari petak peta tidak dikemas bersama-sama dalam tata letak linier. Ini tampaknya membuang-buang ruang memori, tetapi seperti yang disebutkan menyalin ke mips bahwa paket perangkat keras bersama-sama tidak diizinkan melalui CopyTiles atau UpdateTiles. Aplikasi hanya dapat menggunakan API UpdateSubresource*() atau CopySubresource*() generik untuk menyalin mips kecil satu per satu, meskipun dalam kasus CopySubresource*() yang berarti memori linier harus dimensi yang sama dengan sumber daya berjenjang - CopySubresource*() tidak dapat menyalin dari sumber daya buffer ke Texture2D misalnya.

Jika swizzle standar perangkat keras didefinisikan, bendera dapat ditambahkan untuk menunjukkan bahwa data dalam buffer akan ditafsirkan dalam format tersebut (tidak ada gerimis yang diperlukan saat transfer), meskipun pendekatan alternatif untuk mengunggah data juga dapat masuk akal dalam hal ini seperti mengizinkan aplikasi akses langsung ke memori kumpulan petak peta.

Operasi penyalinan dapat dilakukan pada konteks langsung atau ditangguhkan.

Mengubah ukuran kumpulan petak peta

Untuk mengubah ukuran kumpulan petak peta, gunakan ID3D11DeviceContext2::ResizeTilePool.

Penghubung sumber daya berjenjang

Untuk menentukan batasan pemesanan akses data antara beberapa sumber daya berjenjang, gunakan ID3D11DeviceContext2::TiledResourceBarrier.

Sumber daya berjenjang