TDR di Windows 8 dan yang lebih baru

Dimulai dengan Windows 8, perilaku deteksi dan pemulihan batas waktu GPU (TDR) memungkinkan bagian-bagian adaptor fisik individual untuk diatur ulang, alih-alih memerlukan reset di seluruh adaptor.

Lihat Deteksi dan pemulihan batas waktu (TDR) untuk informasi selengkapnya tentang TDR.

Persyaratan

  • Versi WDDM minimum: 1.2
  • Versi Windows minimum: 8
  • Implementasi driver—Hanya grafis lengkap dan Render: Wajib
  • Persyaratan dan pengujian WHLK : Device.Graphics... TDRResiliency

Antarmuka driver perangkat (DDI) TDR

Untuk mengakomodasi perubahan perilaku ini, tampilkan driver miniport menerapkan fungsi-fungsi ini:

Driver miniport tampilan menunjukkan dukungan untuk fungsi-fungsi ini dengan mengatur DXGK_DRIVERCAPS. Anggota SupportPerEngineTDR , dalam hal ini harus menerapkan semua fungsi di atas.

Catatan

Driver yang mendukung fungsi-fungsi ini juga harus mendukung sinkronisasi tingkat nol untuk fungsi DxgkDdiCollectDbgInfo . Hal ini untuk memastikan bahwa tingkat nol panggilan miniport yang tidak terpengaruh oleh operasi reset dapat dilanjutkan. Lihat Keterangan DxgkDdiCollectDbgInfo.

Struktur berikut dikaitkan dengan fungsi di atas:

Node

Seperti yang digunakan dalam fungsi TDR di atas, simpul adalah salah satu dari beberapa bagian adaptor fisik tunggal yang dapat dijadwalkan secara independen. Misalnya, node 3-D, simpul pendekodean video, dan node salinan semuanya dapat ada di adaptor fisik yang sama, dan masing-masing dapat diberi nilai ordinal simpul terpisah dalam DXGKARG_QUERYDEPENDENTENGINEGROUP. Anggota NodeOrdinal dalam panggilan ke DxgkDdiQueryDependentEngineGroup.

Jumlah simpul dalam adaptor fisik dilaporkan oleh driver miniport tampilan di anggota NbAsymetricProcessingNodesDXGK_DRIVERCAPS. GpuEngineTopology.

Nilai ordinal simpul diteruskan dalam anggota NodeOrdinal dari struktur DXGKARG_CREATECONTEXT saat konteks dibuat.

Mesin

Seperti yang digunakan dalam fungsi TDR di atas, mesin adalah salah satu dari beberapa adaptor fisik (atau GPU) yang bersama-sama bertindak sebagai satu adaptor logis. Subsistem kernel grafis DirectX mendukung konfigurasi tersebut tetapi mengharuskan setiap mesin harus memiliki jumlah simpul yang sama.

Sebagai contoh, penjadwal GPU menganggap mesin 0 sesuai dengan adaptor fisik 0. Mesin 0 harus memiliki jumlah simpul yang sama dengan mesin 1, yang sesuai dengan adaptor 1.

Nilai ordinal mesin pada pembuatan konteks

Saat konteks dibuat, satu bit yang sesuai dengan nilai ordinal mesin diatur dalam anggota EngineAffinity dari struktur DXGKARG_CREATECONTEXT . Anggota EngineOrdinal ini dan struktur terkait penjadwal lainnya adalah indeks berbasis nol. Nilai EngineAffinity adalah 1 <<EngineOrdinal, dan EngineOrdinal adalah posisi bit tertinggi di EngineAffinity.

Paket tidak terpengaruh oleh reset mesin

Driver mungkin diminta oleh penjadwal GPU untuk mengirim ulang paket yang dikirimkan terlambat ke antrean perangkat keras mesin untuk diproses sepenuhnya sebelum reset mesin selesai. Driver harus mengikuti panduan ini untuk mengirim ulang paket tersebut:

  • Paket penomoran: Driver akan diminta oleh penjadwal GPU untuk mengirim ulang paket penomoran dengan ID pagar asli mereka, dan dalam urutan yang sama seperti yang awalnya dikirimkan. Paket tersebut akan dikirim ulang sebelum paket baru ditambahkan ke antrean perangkat keras.
  • Merender paket: Penjadwal GPU akan menetapkan ID pagar baru paket render lalu mengirimkannya kembali.

Urutan panggilan untuk mengatur ulang mesin

Ketika DxgkDdiResetEngine berhasil, penjadwal GPU memastikan bahwa nilai LastAbortedFenceId yang dikembalikan dari panggilan reset mesin sesuai dengan ID pagar yang ada dalam antrean perangkat keras, atau ke ID pagar terakhir yang selesai pada GPU. Situasi terakhir dapat terjadi ketika antrean perangkat keras bermunculan setelah batas waktu GPU terdeteksi, tetapi sebelum panggilan balik reset mesin dipanggil.

Nilai ID pagar terakhir yang diselesaikan pada GPU harus dipertahankan oleh driver setiap saat karena juga diperlukan untuk mengatur anggota DmaPreempted.LastCompletedFenceId dari struktur pemberitahuan gangguan DXGKARGCB_NOTIFY_INTERRUPT_DATA preemption. ID pagar terakhir yang selesai harus dimajukan hanya dalam situasi ini:

  • Ketika paket selesai (tidak didahului), ID pagar terakhir yang selesai harus diatur ke ID pagar paket yang telah selesai.
  • Ketika DxgkDdiResetEngine berhasil, ID pagar terakhir yang diselesaikan harus diatur ke nilai anggota LastCompletedFenceId yang dikembalikan oleh panggilan reset mesin.
  • Untuk reset di seluruh adaptor, ID pagar terakhir yang diselesaikan pada semua simpul harus dimajukan ke ID pagar terakhir yang dikirimkan pada saat reset.

Berikut adalah urutan kronologis dari reset mesin yang berhasil, seperti yang terlihat oleh penjadwal GPU:

  1. Upaya pemisahan dikeluarkan.

  2. Batas waktu GPU terdeteksi.

  3. Rekam jepret ID pagar terakhir yang dikirimkan dan selesai diambil oleh penjadwal GPU, dan gangguan dari mesin waktu habis diabaikan. Ini adalah salah satu operasi atomik pada tingkat interupsi perangkat.

  4. Jika tidak ada paket dalam antrean perangkat keras pada saat ini, keluar. Ini dapat terjadi jika paket selesai di jendela waktu antara langkah 2 dan 3.

  5. Semua DPC antrean dibersihkan.

  6. Bersiap untuk reset mesin.

  7. Hubungi DxgkDdiResetEngine.

  8. Jika anggota LastAbortedFenceId kurang dari ID pagar terakhir yang diselesaikan atau lebih besar dari ID pagar terakhir yang dikirimkan, subsistem kernel grafis DirectX menyebabkan terjadinya bugcheck sistem. Dalam file crash dump, kesalahan dicatat oleh pesan BugCheck 0x119, yang memiliki empat parameter ini:

    • 0xA, artinya driver telah melaporkan ID pagar yang dibatalkan tidak valid
    • Nilai LastAbortedFenceId yang dikembalikan oleh driver
    • ID pagar terakhir selesai
    • Parameter sistem operasi internal
  9. Jika nilai LastAbortedFenceId valid, lanjutkan dengan pemulihan reset mesin sebagai berikut. Jika paket paging dipengaruhi oleh reset mesin, penjadwal GPU mengikuti reset mesin dengan reset di seluruh adaptor. Semua perangkat yang memiliki alokasi yang dirujuk oleh paket halaman tersebut juga dimasukkan ke dalam status kesalahan. Namun, perangkat sistem itu sendiri tidak dimasukkan ke dalam status kesalahan, dan melanjutkan eksekusi setelah reset selesai.

Kasus khusus

Situasi khusus dapat terjadi ketika paket selesai pada GPU antara langkah 3 dan 7 yang dijelaskan di atas. Dalam hal ini, LastAbortedFenceId harus diatur oleh driver ke ID pagar dari paket terakhir yang selesai jika tidak ada paket dalam antrean perangkat keras dari sudut pandang driver. Dari sudut pandang penjadwal, akan muncul bahwa paket seperti itu dibatalkan, dan perangkat yang sesuai akan dimasukkan ke dalam status kesalahan meskipun paket akhirnya selesai.

Jika pengandar tidak dapat melakukan operasi reset karena perangkat keras dalam keadaan tidak valid, atau karena perangkat keras tidak dapat mengatur ulang simpul, driver harus mengembalikan kode status kegagalan. Jika penjadwal GPU menerima kode status kegagalan, penjadwal tersebut melakukan reset di seluruh adaptor dan memulai ulang operasi mengikuti perilaku TDR sebelum Windows 8.

Bahkan jika driver telah memilih Windows 8 dan perilaku TDR nantinya, akan ada kasus ketika penjadwal GPU meminta reset dan memulai ulang seluruh adaptor logis. Oleh karena itu driver masih harus mengimplementasikan fungsi DxgkDdiResetFromTimeout dan DxgkDdiRestartFromTimeout, dan semantiknya tetap sama seperti sebelum Windows 8. Ketika upaya untuk mereset adaptor fisik dengan DxgkDdiResetEngine mengarah ke reset adaptor logis, perintah !analyze debugger Windows menunjukkan bahwa nilai TdrReason dari konteks pemulihan TDR diatur ke nilai baru TdrEngineTimeoutPromotedToAdapterReset = 9.