Sinkronisasi Utas dan TDR

Gambar berikut menunjukkan cara kerja sinkronisasi utas untuk driver miniport tampilan di Windows Display Driver Model (WDDM).

Diagram yang memperlihatkan sinkronisasi utas di WDDM.

Jika waktu habis perangkat keras terjadi, proses Deteksi dan Pemulihan Waktu Habis (TDR) dimulai. Penjadwal GPU memanggil fungsi DxgkDdiResetFromTimeout driver, yang mengatur ulang GPU. DxgkDdiResetFromTimeout dipanggil secara sinkron dengan fungsi driver miniport tampilan lainnya, kecuali untuk fungsi manajemen daya runtime DxgkDdiSetPowerComponentFState dan DxgkDdiPowerRuntimeControlRequest. Artinya, tidak ada utas lain yang berjalan di pengemudi saat utas DxgkDdiResetFromTimeout berjalan. Sistem operasi juga menjamin bahwa tidak ada akses ke buffer bingkai yang dapat terjadi dari aplikasi apa pun selama panggilan ke DxgkDdiResetFromTimeout; oleh karena itu, driver dapat mengatur ulang fase pengontrol memori loop terkunci (PLL) dan sebagainya.

Sementara utas pemulihan menjalankan DxgkDdiResetFromTimeout, interupsi dan panggilan prosedur yang ditangguhkan (DPC) dapat terus dipanggil. Fungsi KeSynchronizeExecution dapat digunakan untuk menyinkronkan bagian prosedur reset dengan gangguan perangkat.

Setelah driver kembali dari DxgkDdiResetFromTimeout, sebagian besar fungsi driver dapat kembali dipanggil, dan sistem operasi mulai membersihkan sumber daya yang tidak lagi diperlukan. Selama periode pembersihan, fungsi driver berikut dipanggil karena alasan yang ditunjukkan:

  • Driver dipanggil untuk memberi tahu tentang alokasi yang dikeluarkan.

    Misalnya, jika alokasi dipajang dalam segmen memori, fungsi DxgkDdiBuildPagingBuffer driver dipanggil dengan anggota Operasi dari struktur DXGKARG_BUILDPAGINGBUFFER diatur ke DXGK_OPERATION_TRANSFER dan dengan anggota Transfer.Size diatur ke nol untuk memberi tahu driver tentang pengeluaran. Perhatikan bahwa tidak ada transfer konten yang terlibat karena konten hilang selama reset.

    Jika alokasi dipajang dalam segmen aperture, fungsi DxgkDdiBuildPagingBuffer driver dipanggil dengan anggota Operasi DXGKARG_BUILDPAGINGBUFFER diatur ke DXGK_OPERATION_UNMAP_APERTURE_SEGMENT untuk memberi tahu driver untuk membatalkan alokasi dari bukaan.

  • Fungsi DxgkDdiReleaseSwizzlingRange driver dipanggil untuk melepaskan aperture dan rentang bukaan segmen yang tidak menyibukkan.

Driver tidak boleh mengakses GPU selama panggilan sebelumnya kecuali benar-benar diperlukan.

Setelah periode pembersihan berakhir, sistem operasi memanggil fungsi DxgkDdiRestartFromTimeout driver untuk memberi tahu driver bahwa pembersihan selesai dan bahwa sistem operasi akan dilanjutkan menggunakan adaptor untuk penyajian.