Ada banyak pekerjaan yang diperlukan pada CPU untuk mengatur bingkai untuk GPU, dan sebagian besar pekerjaan itu ada di dalam driver grafis. Sebelum DX12 / Vulkan, pekerjaan driver grafis itu pada dasarnya dipaksa untuk single-threaded oleh desain API.
Harapannya adalah bahwa DX12 / Vulkan mengangkat pembatasan itu, yang memungkinkan pekerjaan pengemudi dilakukan secara paralel pada beberapa utas CPU dalam sebuah bingkai. Ini akan memungkinkan penggunaan multicore CPU yang lebih efisien, memungkinkan mesin game untuk mendorong adegan yang lebih kompleks tanpa menjadi terikat CPU. Itulah harapan — apakah itu akan diwujudkan dalam praktik adalah sesuatu yang harus kita tunggu untuk melihat selama beberapa tahun ke depan.
Untuk menguraikan sedikit: output dari mesin renderer permainan adalah aliran panggilan API DX / GL yang menggambarkan urutan operasi untuk membuat bingkai. Namun, ada jarak yang sangat jauh antara aliran panggilan API dan buffer perintah biner aktual yang dikonsumsi perangkat keras GPU. Pengemudi harus "mengkompilasi" panggilan API ke dalam bahasa mesin GPU, jadi untuk berbicara. Itu bukan proses yang sepele — ini melibatkan banyak penerjemahan konsep API ke dalam realitas perangkat keras tingkat rendah, validasi untuk memastikan GPU tidak pernah disetel ke keadaan tidak valid, mengacaukan alokasi memori dan data, melacak perubahan status untuk mengeluarkan perbaiki perintah tingkat rendah, dan seterusnya. Driver grafis bertanggung jawab untuk semua hal ini.
Di DX11 / GL4 dan API sebelumnya, pekerjaan ini biasanya dilakukan oleh utas driver tunggal. Bahkan jika Anda memanggil API dari banyak utas (yang dapat Anda lakukan menggunakan daftar perintah yang ditangguhkan DX11, misalnya), itu hanya menambahkan beberapa pekerjaan ke antrian agar utas pengandar dapat dikunyah nanti. Satu alasan besar untuk ini adalah pelacakan negara yang saya sebutkan sebelumnya. Banyak detail konfigurasi GPU tingkat perangkat keras yang memerlukan pengetahuan tentang keadaan jalur pipa grafis saat ini, jadi tidak ada cara yang baik untuk memecah daftar perintah menjadi potongan-potongan yang dapat diproses secara paralel — setiap potongan harus tahu persis apa yang harus dimulai. dengan, meskipun potongan sebelumnya belum diproses.
Itu salah satu hal besar yang berubah di DX12 / Vulkan. Untuk satu hal, mereka menggabungkan hampir semua keadaan pipa grafis ke dalam satu objek, dan untuk yang lain (setidaknya dalam DX12) ketika Anda mulai membuat daftar perintah Anda harus memberikan keadaan pipa awal; negara tidak diwarisi dari satu daftar perintah ke yang berikutnya. Pada prinsipnya, ini memungkinkan pengemudi untuk tidak perlu tahu apa-apa tentang daftar perintah sebelumnya sebelum dapat mulai mengkompilasi — dan yang pada gilirannya memungkinkan aplikasi untuk memecah render menjadi potongan paralel, menghasilkan daftar perintah yang sepenuhnya dikompilasi, yang kemudian dapat digabungkan bersama-sama dan dikirim ke GPU dengan sedikit keributan.
Tentu saja, ada banyak perubahan lain di API baru, tetapi sejauh multithreading berjalan, itulah bagian terpenting.