Bagikan melalui


Menjalankan dan Menyinkronkan Daftar Perintah

Di Microsoft Direct3D 12, mode langsung dari versi sebelumnya tidak lagi ada. Sebagai gantinya, aplikasi membuat daftar perintah dan bundel lalu merekam kumpulan perintah GPU. Antrean perintah digunakan untuk mengirimkan daftar perintah yang akan dijalankan. Model ini memungkinkan pengembang untuk memiliki kontrol lebih besar atas penggunaan unit pemrosesan grafis (GPU) dan CPU yang efisien.

Gambaran umum antrean perintah

Antrean perintah Direct3D 12 menggantikan runtime dan sinkronisasi driver dari pengiriman kerja mode langsung, yang sebelumnya tidak diekspos ke pengembang, dengan API untuk secara eksplisit mengelola konkurensi, paralelisme, dan sinkronisasi. Antrean perintah menyediakan peningkatan berikut untuk pengembang:

  • Memungkinkan pengembang untuk menghindari inefisiensi yang tidak disengaja yang disebabkan oleh sinkronisasi yang tidak terduga.
  • Memungkinkan pengembang untuk memperkenalkan sinkronisasi pada tingkat yang lebih tinggi di mana sinkronisasi yang diperlukan dapat ditentukan dengan lebih efisien dan akurat. Ini berarti runtime dan driver grafis akan menghabiskan lebih sedikit waktu secara rekayasa paralelisme.
  • Membuat operasi yang mahal lebih eksplisit.

Peningkatan ini mengaktifkan atau meningkatkan skenario berikut:

  • Peningkatan paralelisme - Aplikasi dapat menggunakan antrean yang lebih dalam untuk beban kerja latar belakang, seperti pendekodean video, ketika mereka memiliki antrean terpisah untuk pekerjaan latar depan.
  • Pekerjaan GPU asinkron dan berprioritas rendah - Model antrean perintah memungkinkan eksekusi bersamaan dari pekerjaan GPU berprioritas rendah dan operasi atomik yang memungkinkan satu utas GPU untuk mengonsumsi hasil utas lain yang tidak disinkronkan tanpa memblokir.
  • Pekerjaan komputasi berprioritas tinggi - Desain ini memungkinkan skenario yang memerlukan gangguan penyajian 3D untuk melakukan sejumlah kecil pekerjaan komputasi berprioritas tinggi sehingga hasilnya dapat diperoleh lebih awal untuk pemrosesan tambahan pada CPU.

Menginisialisasi antrean perintah

Antrean perintah dapat dibuat dengan memanggil ID3D12Device::CreateCommandQueue. Metode ini mengambil D3D12_COMMAND_LIST_TYPE menunjukkan jenis antrean apa yang harus dibuat, dan oleh karena itu, jenis perintah apa yang dapat dikirimkan ke antrean tersebut. Ingat bahwa bundel hanya dapat dipanggil dari daftar perintah langsung dan tidak dapat dikirimkan langsung ke antrean. Jenis antrean yang didukung adalah:

Secara umum, antrean DIRECT dan daftar perintah menerima perintah apa pun, antrean COMPUTE dan daftar perintah menerima perintah terkait komputasi dan salin, dan antrean COPY dan daftar perintah hanya menerima perintah salin.

Menjalankan daftar perintah

Setelah Anda merekam daftar perintah dan mengambil antrean perintah default atau membuat yang baru, Anda menjalankan daftar perintah dengan memanggil ID3D12CommandQueue::ExecuteCommandLists.

Aplikasi dapat mengirimkan daftar perintah ke antrean perintah apa pun dari beberapa utas. Runtime akan melakukan pekerjaan serialisasi permintaan ini dalam urutan pengiriman.

Runtime akan memvalidasi daftar perintah yang dikirimkan dan akan menghilangkan panggilan ke ExecuteCommandLists jika salah satu batasan dilanggar. Panggilan akan dihentikan karena alasan berikut:

Mengakses sumber daya dari beberapa antrean perintah

Ada beberapa aturan yang diberlakukan oleh runtime yang membatasi akses sumber daya dari beberapa antrean perintah. Aturan ini adalah sebagai berikut:

  1. Sumber daya tidak dapat ditulis ke dari beberapa antrean perintah secara bersamaan. Ketika sumber daya telah beralih ke status yang dapat ditulis pada antrean, sumber daya dianggap dimiliki secara eksklusif oleh antrean tersebut, dan harus beralih ke status baca atau COMMON (lihat D3D12_RESOURCE_STATES) sebelum dapat diakses oleh antrean lain.

  2. Saat dalam status baca, sumber daya dapat dibaca dari beberapa antrean perintah secara bersamaan, termasuk di seluruh proses, berdasarkan status bacanya.

Untuk informasi selengkapnya tentang pembatasan akses sumber daya dan menggunakan penghalang sumber daya untuk menyinkronkan akses ke sumber daya, lihat Menggunakan penghalang sumber daya untuk menyinkronkan status sumber daya.

Menyinkronkan eksekusi daftar perintah menggunakan pagar antrean perintah

Dukungan untuk beberapa antrean perintah paralel di Direct3D 12 memberi Anda lebih banyak fleksibilitas dan kontrol atas prioritas pekerjaan asinkron pada GPU. Desain ini juga berarti bahwa aplikasi perlu secara eksplisit mengelola sinkronisasi pekerjaan, terutama ketika perintah mencantumkan dalam satu antrean tergantung pada sumber daya yang sedang dioperasikan oleh antrean perintah lain. Beberapa contohnya termasuk menunggu operasi pada antrean komputasi selesai sehingga hasilnya dapat digunakan untuk operasi penyajian pada antrean 3D, dan menunggu operasi 3D selesai sehingga operasi pada antrean komputasi dapat mengakses sumber daya untuk menulis. Untuk mengaktifkan sinkronisasi pekerjaan antar antrean, Direct3D 12 menggunakan konsep pagar, yang diwakili dalam API oleh antarmuka ID3D12Fence .

Pagar adalah bilangan bulat yang mewakili unit kerja saat ini yang sedang diproses. Saat aplikasi memajukan pagar, dengan memanggil ID3D12CommandQueue::Signal, bilangan bulat diperbarui. Aplikasi dapat memeriksa nilai pagar dan menentukan apakah unit pekerjaan telah selesai untuk memutuskan apakah operasi berikutnya dapat dimulai.

Menyinkronkan sumber daya yang diakses oleh antrean perintah

Di Direct3D 12, menyinkronkan status beberapa sumber daya diimplementasikan dengan hambatan sumber daya. Di setiap hambatan sumber daya, aplikasi mendeklarasikan status sumber daya sebelum dan sesudah. Contoh umumnya adalah agar sumber daya beralih antara tampilan sumber daya shader ke tampilan target render. Sebagian besar, hambatan sumber daya ini dikelola dalam daftar perintah. Ketika lapisan debug diaktifkan, sistem memberlakukan bahwa status sebelum dan sesudah semua sumber daya cocok, menjamin bahwa sumber daya berada dalam status yang benar untuk operasi tertentu pada transisi pembatas.

Untuk informasi selengkapnya tentang menyinkronkan status sumber daya, lihat Menggunakan penghalang sumber daya untuk menyinkronkan status sumber daya.

Dukungan antrean perintah untuk sumber daya ubin

Metode untuk mengelola sumber daya petak peta, yang diekspos melalui antarmuka ID3D11DeviceContext2 di Direct3D 11, disediakan oleh antarmuka ID3D12CommandQueue di Direct3D 12. Metode ini meliputi:

Metode Deskripsi
CopyTileMappings Menyalin pemetaan dari sumber daya petak sumber ke sumber daya ubin tujuan.
UpdateTileMappings Updates pemetaan lokasi petak peta di sumber daya ubin ke lokasi memori dalam tumpukan sumber daya.

Untuk informasi selengkapnya tentang menggunakan sumber daya ubin di aplikasi Direct3D 12, lihat Sumber Daya Berjenjang Direct3D11.

Pengiriman Kerja di Direct3D 12