Bagikan melalui


Direct3D 11 pada 12

D3D11On12 adalah mekanisme di mana pengembang dapat menggunakan antarmuka dan objek D3D11 untuk mendorong API D3D12. D3D11on12 memungkinkan komponen yang ditulis menggunakan D3D11 (misalnya, teks D2D dan UI) untuk bekerja sama dengan komponen yang ditulis yang menargetkan API D3D12. D3D11on12 juga memungkinkan porting bertahap aplikasi dari D3D11 ke D3D12, dengan mengaktifkan bagian aplikasi untuk terus menargetkan D3D11 untuk kesederhanaan sementara yang lain menargetkan D3D12 untuk performa, sambil selalu memiliki penyajian yang lengkap dan benar. D3D11On12 membuatnya lebih sederhana daripada menggunakan teknik interop untuk berbagi sumber daya dan menyinkronkan pekerjaan antara kedua API.

Menginisialisasi D3D11On12

Untuk mulai menggunakan D3D11On12, langkah pertama adalah membuat perangkat D3D12 dan antrean perintah. Objek-objek ini disediakan sebagai input ke metode inisialisasi D3D11On12CreateDevice. Anda dapat menganggap metode ini sebagai membuat perangkat D3D11 dengan jenis driver imajiner D3D_DRIVER_TYPE_11ON12, di mana driver D3D11 bertanggung jawab untuk membuat objek dan mengirimkan daftar perintah ke API D3D12.

Setelah Anda memiliki perangkat D3D11 dan konteks langsung, Anda dapat QueryInterface menonaktifkan perangkat untuk antarmuka ID3D11On12Device . Ini adalah antarmuka utama yang digunakan untuk interop antara D3D11 dan D3D12. Untuk memiliki konteks perangkat D3D11 dan daftar perintah D3D12 yang beroperasi pada sumber daya yang sama, perlu untuk membuat "sumber daya yang dibungkus" menggunakan API CreateWrappedResource . Metode ini "mempromosikan" sumber daya D3D12 agar dapat dimengerti di D3D11. Sumber daya yang dibungkus dimulai dalam status "diperoleh", properti yang dimanipulasi oleh metode AcquireWrappedResources dan ReleaseWrappedResources .

Contoh Penggunaan

Penggunaan umum D3D11On12 adalah menggunakan D2D untuk merender teks atau gambar di atas buffer belakang D3D12. Lihat sampel D3D11On12 misalnya kode. Berikut adalah garis besar kasar dari langkah-langkah yang harus diambil untuk melakukannya:

  • Buat perangkat D3D12 (D3D12CreateDevice) dan rantai pertukaran D3D12 (CreateSwapChain dengan ID3D12CommandQueue sebagai input).
  • Buat perangkat D3D11On12 menggunakan perangkat D3D12 dan antrean perintah yang sama dengan input.
  • Ambil buffer kembali rantai pertukaran, dan buat sumber daya yang dibungkus D3D11 untuk masing-masing. Status input yang digunakan harus menjadi cara terakhir D3D12 menggunakannya (misalnya RENDER_TARGET) dan status output harus menjadi cara D3D12 akan menggunakannya setelah D3D11 selesai (misalnya PRESENT).
  • Inisialisasi D2D, dan berikan sumber daya yang dibungkus D3D11 ke D2D untuk mempersiapkan penyajian.

Kemudian, pada setiap bingkai, lakukan hal berikut:

Background

D3D11On12 bekerja secara sistematis. Setiap panggilan API D3D11 melewati validasi runtime umum dan membuat jalan ke driver. Pada lapisan driver, driver 11on12 khusus mencatat status dan masalah merender operasi ke daftar perintah D3D12. Daftar perintah ini dikirimkan seperlunya (misalnya, kueri GetData atau sumber daya Map mungkin memerlukan perintah untuk dihapus) atau seperti yang diminta oleh Flush. Membuat objek D3D11 biasanya menghasilkan objek D3D12 yang sesuai yang dibuat. Beberapa operasi render fungsi tetap di D3D11 seperti GenerateMips atau DrawAuto tidak didukung di D3D12, sehingga D3D11On12 menirunya menggunakan shader dan sumber daya tambahan.

Untuk interop, penting untuk memahami bagaimana D3D11On12 berinteraksi dengan objek D3D12 yang telah dibuat dan disediakan aplikasi. Untuk memastikan bahwa pekerjaan terjadi dalam urutan yang benar, konteks langsung D3D11 harus dibersihkan sebelum pekerjaan D3D12 tambahan dapat dikirimkan ke antrean tersebut. Penting juga untuk memastikan bahwa antrean yang diberikan kepada D3D11On12 harus dapat dikosongkan setiap saat. Itu berarti bahwa setiap penantian pada antrean pada akhirnya harus dipenuhi, bahkan jika blok utas render D3D11 tidak terbatas. Berhati-hatilah untuk tidak mengambil dependensi pada ketika D3D11On12 menyisipkan flush atau menunggu, karena ini dapat berubah dengan rilis mendatang. Selain itu, D3D11On12 melacak dan memanipulasi status sumber daya sendiri. Satu-satunya cara untuk memastikan koherensi transisi status adalah dengan menggunakan API acquire/release untuk memanipulasi pelacakan status agar sesuai dengan kebutuhan aplikasi.

Membersihkan

Untuk merilis sumber daya yang dibungkus D3D11On12, dua hal perlu terjadi dalam urutan ini:

  • Semua referensi ke sumber daya, termasuk tampilan sumber daya apa pun, perlu dirilis.
  • Pemrosesan penghancuran yang ditangguhkan harus dilakukan. Cara paling sederhana untuk memastikan hal ini terjadi adalah dengan memanggil API konteks Flush langsung.

Setelah kedua langkah tersebut selesai, referensi apa pun yang diambil oleh sumber daya yang dibungkus harus dirilis, dan sumber daya D3D12 menjadi dimiliki secara eksklusif oleh komponen D3D12. Ketahuilah bahwa D3D12 masih memerlukan menunggu penyelesaian GPU sebelum sepenuhnya merilis sumber daya, jadi pastikan untuk menyimpan referensi pada sumber daya sebelum melakukan dua langkah di atas, kecuali Anda telah mengonfirmasi bahwa GPU tidak lagi menggunakan sumber daya.

Semua sumber daya atau objek lain yang dibuat oleh D3D11On12 akan dibersihkan pada waktu yang tepat, ketika GPU telah selesai menggunakannya, menggunakan mekanisme penghancuran D3D11 yang ditangguhkan. Namun jika Anda mencoba merilis perangkat D3D11On12 itu sendiri saat GPU masih dijalankan, penghancuran dapat memblokir hingga GPU selesai.

Batasan

Lapisan D3D11On12 mengimplementasikan subset API D3D11 yang sangat besar, tetapi ada beberapa celah yang diketahui (selain bug dalam implementasi yang dapat menyebabkan penyajian yang salah).

Pada Windows 10, versi 1809 (10.0; Build 17763), selama D3D11On12 berjalan pada driver yang mendukung Shader Model 6.0 atau yang lebih baru, maka dapat menjalankan shader yang menggunakan antarmuka. Di versi Windows sebelumnya, fitur antarmuka shader tidak diimplementasikan di D3D11On12, dan mencoba menggunakan fitur ini akan menyebabkan kesalahan dan pesan debug.

Pada Windows 10, versi 1803 (10.0; Build 17134), rantai pertukaran didukung pada perangkat D3D11On12. Di versi Windows yang lebih lama, versi tersebut tidak.

D3D11On12 belum dioptimalkan untuk performa. Kemungkinan akan ada overhead CPU sedang dibandingkan dengan driver D3D11 standar, overhead GPU minimal, dan diketahui ada overhead memori yang signifikan. Oleh karena itu tidak disarankan untuk menggunakan D3D11On12 untuk adegan 3D yang rumit, dan sebaliknya direkomendasikan untuk adegan sederhana, atau penyajian 2D.

API

API yang membentuk lapisan 11on12 dijelaskan dalam Referensi 11on12.

D2D menggunakan panduan D3D11on12

Memahami Direct3D 12

Bekerja dengan Direct3D 11, Direct3D 10 dan Direct2D