DXGKDDI_QUERYCURRENTFENCE fungsi panggilan balik (d3dkmddi.h)
Fungsi DxgkDdiQueryCurrentFence mengkueri tentang pengidentifikasi pagar pengiriman terbaru yang telah selesai di unit eksekusi perintah perangkat keras.
Sintaks
DXGKDDI_QUERYCURRENTFENCE DxgkddiQuerycurrentfence;
NTSTATUS DxgkddiQuerycurrentfence(
[in] IN_CONST_HANDLE hAdapter,
[in/out] INOUT_PDXGKARG_QUERYCURRENTFENCE pCurrentFence
)
{...}
Parameter
[in] hAdapter
Handel ke blok konteks yang terkait dengan adaptor tampilan. Driver miniport tampilan sebelumnya menyediakan handel ini ke subsistem kernel grafis Microsoft DirectX dalam parameter output MiniportDeviceContext dari fungsi DxgkDdiAddDevice .
[in/out] pCurrentFence
Penunjuk ke struktur DXGKARG_QUERYCURRENTFENCE yang berisi informasi tentang data pagar saat ini.
Menampilkan nilai
DxgkDdiQueryCurrentFence mengembalikan STATUS_SUCCESS, atau hasil kesalahan yang sesuai jika data pagar tidak berhasil diambil.
Keterangan
Pagar adalah instruksi yang berisi 64 bit data dan alamat. Driver miniport tampilan dapat memasukkan pagar di aliran akses memori langsung (DMA) yang dikirim ke unit pemrosesan grafis (GPU). Ketika GPU membaca pagar, GPU menulis data pagar di alamat pagar yang ditentukan. Namun, sebelum GPU dapat menulis data pagar ke memori, GPU harus memastikan bahwa semua piksel dari primitif yang mendahului instruksi pagar dihentikan dan ditulis dengan benar ke memori.
- Pagar reguler adalah pagar yang dapat dimasukkan dalam buffer DMA yang dibuat dalam mode pengguna. Karena konten buffer DMA dari mode pengguna tidak tepercaya, pagar dalam buffer DMA tersebut harus merujuk ke alamat virtual di ruang alamat konteks GPU dan bukan ke alamat fisik. Akses ke alamat virtual tersebut terikat oleh mekanisme validasi memori yang sama dengan alamat virtual lain yang diakses GPU.
-
Pagar istimewa adalah pagar yang hanya dapat dimasukkan dalam buffer DMA yang dibuat (dan hanya dapat diakses) dalam mode kernel. Pagar dalam buffer DMA seperti itu mengacu pada alamat fisik dalam memori.
Perhatikan bahwa jika alamat target pagar dapat diakses dalam mode pengguna, perangkat lunak berbahaya dapat melakukan operasi grafis di atas lokasi memori untuk pagar dan karena itu mengambil alih konten dari apa yang diharapkan kernel untuk menerima.
Jika driver miniport layar melewatkan pagar terakhir buffer DMA, fungsi DxgkDdiQueryCurrentFence driver mungkin dipanggil untuk melaporkan pagar yang terlewat. Misalnya, jika perangkat keras menghasilkan pagar ke memori, fungsi DxgkDdiInterruptRoutine driver dipicu untuk membaca memori. Namun, jika data pagar tidak tersedia ketika pengemudi mencoba membaca data (misalnya, jika ada chipset yang rusak), pagar biasanya dilaporkan pada gangguan berikutnya, kecuali gangguan dihentikan. Jika interupsi dihentikan dan subsistem kernel grafis DirectX menunggu terlalu lama untuk pagar, subsistem memanggil fungsi DxgkDdiQueryCurrentFence driver untuk memverifikasi pagar saat ini dan menentukan pagar tertunda yang mungkin terlewatkan.
Sebelum driver miniport tampilan kembali dari panggilan ke DxgkDdiQueryCurrentFence, jika pengidentifikasi pagar pengiriman yang diselesaikan perangkat keras terbaru belum dilaporkan, pengemudi harus memanggil fungsi DxgkCbNotifyInterrupt untuk melaporkan pagar. Untuk mengimplementasikan fungsionalitas ini, driver:
- Melacak pagar mana yang terakhir dilaporkan ke sistem operasi.
- Meningkatkan IRQL ke interupsi perangkat. Untuk meningkatkan IRQL ke tingkat interupsi, driver dapat memanggil fungsi DxgkCbSynchronizeExecution untuk disinkronkan dengan fungsi DxgkDdiInterruptRoutine-nya .
- Pada perangkat, interupsi IRQL, bandingkan pagar terakhir yang dilaporkan dengan pagar perangkat keras terbaru yang selesai.
- Pada IRQL interupsi perangkat, panggilan DxgkCbNotifyInterrupt hanya ketika perangkat keras terbaru selesai pagar lebih baru dari pagar terakhir yang dilaporkan.
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Windows Vista |
Target Platform | Desktop |
Header | d3dkmddi.h (termasuk D3dkmddi.h) |
IRQL | PASSIVE_LEVEL |