Bagikan melalui


WDDM 1.3 menampilkan tugas driver miniport untuk mendukung tampilan nirkabel Miracast pada Windows 8.1

Catatan

Mulai Windows 10 (WDDM 2.0), sistem operasi dikirim dengan tumpukan Miracast bawaan yang dapat bekerja pada GPU apa pun. Untuk informasi tentang tumpukan Microsoft Miracast dan persyaratan driver dan perangkat keras untuk mendukung tampilan Miracast mulai dari Windows 10, lihat dokumentasi berikut:

Pengembang driver tidak boleh lagi menerapkan tumpukan Miracast kustom. Microsoft mungkin menghapus dukungan untuk tumpukan Miracast kustom di versi Windows yang akan datang.

Untuk mendukung tampilan nirkabel Miracast pada Windows 8.1, driver miniport tampilan WDDM 1.3 yang berjalan dalam mode kernel perlu melakukan tugas-tugas berikut.

Mendukung antarmuka Miracast

Jika driver miniport tampilan WDDM 8.1 mendukung tampilan Miracast, driver harus melaporkan struktur DXGK_MIRACAST_DISPLAY_INTERFACE , yang memiliki penunjuk ke fungsi Miracast yang diimplementasikan driver, ketika subsistem kernel grafis Microsoft DirectX memanggil fungsi DxgkDdiQueryInterface .

Jika subsistem kernel grafis DirectX sistem operasi (Dxgkrnl.sys) tidak memanggil fungsi DxgkDdiQueryInterface untuk mengkueri antarmuka tampilan Miracast, maka tidak mendukung tampilan nirkabel Miracast, dan driver miniport tampilan tidak boleh melaporkan target Miracast apa pun.

Driver tidak boleh melaporkan lebih dari satu target Miracast pada perangkat grafis WDDM penuh, jika tidak, sistem operasi gagal memulai adaptor.

Setelah Dxgkrnl memanggil DxgkDdiQueryInterface untuk mengkueri antarmuka tampilan Miracast, driver kemudian dapat melaporkan jenis target sebagai D3DKMDT_VOT_MIRACAST selama inisialisasi perangkat ketika Dxgkrnl memanggil fungsi DxgkDdiQueryChildRelations .

Target Miracast harus tetap dalam keadaan terputus hingga Dxgkrnl memulai sesi terhubung Miracast. Ketika sesi Miracast dimulai, dan monitor terhubung ke sink Miracast atau driver menerima permintaan I/O dari driver mode pengguna Miracast karena monitor baru telah terhubung ke sink Miracast, driver miniport tampilan harus melaporkan nilai kesadaran deteksi hot-plug kedatangan monitor (HPD) ke sistem operasi dengan memanggil fungsi DxgkCbIndicateChildStatus . Dalam panggilan ini, driver harus mengatur nilai berikut dalam struktur DXGK_CHILD_STATUS :

Anggota Nilai
Jenis Nilai konstanta StatusMiracast dari enumerasi DXGK_CHILD_STATUS_TYPE
Miracast. Terhubung TRUE
Miracast. MiracastMonitorType Nilai yang menunjukkan jenis koneksi. Jika sink Miracast disematkan di monitor atau TV, anggota ini harus diatur ke nilai konstanta D3DKMDT_VOT_MIRACASTenumerasi D3DKMDT_VIDEO_OUTPUT_TECHNOLOGY .

Tabel berikut mencantumkan fungsi Miracast yang diterapkan driver miniport tampilan WDDM 1.3:

Fungsi Deskripsi
DxgkDdiMiracastCreateContext Membuat konteks untuk memulai instans mode kernel dari perangkat tampilan Miracast.
DxgkDdiMiracastDestroyContext Membuat konteks untuk memulai instans mode kernel dari perangkat tampilan Miracast.
DxgkDdiMiracastIoControl Memproses permintaan I/O sinkron yang berasal dari panggilan driver mode pengguna Miracast ke MiracastIoControl.
DxgkDdiMiracastQueryCaps Mengkueri kemampuan Miracast dari adaptor tampilan saat ini.

Memulai sesi Miracast

Ketika sesi Miracast telah dimulai, sistem operasi memanggil fungsi DxgkDdiQueryChildStatus . Driver miniport tampilan harus diatur DXGK_CHILD_STATUS. Ketik ke nilai StatusMiracast dan harus menggunakan struktur anak Miracast dalam DXGK_CHILD_STATUS. Jika monitor terhubung ke sink Miracast, driver harus mengatur Miracast. Tersambung ke D3DKMDT_VOT_MIRACAST.

Driver harus menentukan nilai D3DKMDT_VIDEO_SIGNAL_INFO. VsyncFreqDivider, yang merupakan rasio laju VSync monitor yang ditampilkan melalui sesi terhubung Miracast ke tingkat VSync sink Miracast. Misalnya, jika kecepatan refresh vertikal sink Miracast adalah 240 Hz dan frekuensi interupsi VSync dari tampilan yang terhubung adalah 30 Hz, driver harus mengatur VsyncFreqDivider ke 8.

Menangani gangguan untuk potongan pengodean yang selesai

Data untuk satu bingkai yang dikirimkan melalui koneksi Miracast nirkabel dapat dipecah menjadi satu atau beberapa gugus pengodean. Setiap kali GPU selesai mengodekan salah satu gugus ini, GPU harus menghasilkan gangguan. Menanggapi gangguan ini, driver miniport tampilan harus memanggil fungsi DxgkCbNotifyInterrupt dan menyelesaikan struktur anak MiracastEncodeChunkCompleted dalam struktur DXGKARGCB_NOTIFY_INTERRUPT_DATA , termasuk mengatur jenis gangguan DXGK_INTERRUPT_TYPE ke DXGK_INTERRUPT_MICACAST_CHUNK_PROCESSING_COMPLETE.

Sebagai bagian dari penanganan gangguan, driver dapat secara opsional menentukan MiracastEncodeChunkCompleted. Anggota pPrivateDriverData dan PrivateDataDriverSize dalam struktur DXGKARGCB_NOTIFY_INTERRUPT_DATA . Driver mode pengguna dapat mengakses data driver privat ini di MIRACAST_CHUNK_DATA. Anggota PrivateDriverData .

Jika, selama jangka waktu tertentu, driver miniport tampilan menghasilkan lebih banyak paket dengan data gugus daripada yang digunakan driver tampilan mode pengguna, maka ruang memori kosong yang tersedia untuk potongan baru dapat habis. Dalam hal ini driver miniport tampilan mengembalikan STATUS_NO_MEMORY di MiracastEncodeChunkCompleted. Status, dan harus memanggil fungsi DxgkCbNotifyDpc untuk memberi tahu penjadwal GPU sistem operasi tentang kondisi kesalahan. Panggilan ke fungsi GetNextChunkData akan mengembalikan kode status STATUS_CONNECTION_RESET , dan panggilan berikutnya akan mulai menerima potongan yang dikirimkan setelah operasi reset. Karena beberapa gugus hilang, driver harus menghasilkan dan mengirimkan I-frame baru.

Pembatasan mode sumber

Untuk menangani batasan alur piksel, driver miniport tampilan WDDM 1.3 biasanya membatasi mode sumber yang terekspos ke sistem operasi. Driver melakukannya dengan hanya mengisi daftar mode sumber dengan mode yang diekspos oleh monitor yang juga didukung alur piksel. Misalnya, driver tidak memodifikasi EDID berdasarkan batasan alur piksel.

Demikian pula, untuk Miracast menampilkan driver miniport tampilan membatasi set mode sumber yang terekspos ke sistem operasi ketika menghitung set mode sumber dan target. Untuk Miracast menampilkan kemampuan enkode GPU, properti jaringan, dan kemampuan dekode sink dapat mengurangi jumlah mode sumber yang dapat didukung oleh alur piksel Miracast.

Jika driver miniport tampilan memanggil fungsi DXGK_VIDPNSOURCEMODESET_INTERFACE::p fnAddMode untuk mencoba menambahkan mode stereo 3-D ke sumber yang tersambung ke target Miracast, panggilan fungsi gagal.

Memanggil fungsi panggilan balik yang disediakan sistem operasi

Sistem operasi menyediakan fungsi panggilan balik mode kernel Miracast berikut:

Fungsi Deskripsi
DxgkCbMiracastSendMessage Mengirim pesan asinkron ke driver tampilan mode pengguna.
DxgkCbMiracastSendMessageCallback Digunakan dalam panggilan ke DxgkCbMiracastSendMessage untuk menentukan struktur IO_STATUS_BLOCK untuk IRP yang telah selesai.
DxgkCbReportChunkInfo
Melaporkan info tentang potongan enkode.

Mengirim pesan secara asinkron dari mode kernel ke mode pengguna

Setiap pesan yang dikirim driver miniport tampilan ke driver mode pengguna terkait melalui panggilan DxgkCbMiracastSendMessage tidak dikirimkan sampai sesi terhubung Miracast dimulai. Oleh karena itu, jika fungsi StartMiracastSession driver mode pengguna belum dipanggil, pesan terkirim akan ditangguhkan hingga StartMiracastSession kembali. Jika pesan dikirim setelah fungsi StopMiracastSession dipanggil, maka pesan dihilangkan oleh sistem operasi, dan fungsi DxgkCbMiracastSendMessageCallback dipanggil dengan status kesalahan yang diatur dalam pIoStatusBlock-Status>.

Memodifikasi driver miniport tampilan yang ada untuk mendukung tampilan Miracast

Ketika fungsi DxgkDdiStartDevice dipanggil, driver miniport tampilan perlu menambahkan target Miracast baru dan harus menandai nilai kesadaran deteksi hot-plug (HPD) target sebagai HpdAwarenessInterruptible sehingga sistem operasi tidak melakukan polling target ini. Selain itu, ketika fungsi DxgkDdiQueryChildRelations dipanggil, driver harus melaporkan D3DKMDT_VOT_MIRACAST sebagai jenis koneksinya.

Driver tidak boleh melaporkan lebih dari satu target Miracast pada perangkat grafis WDDM lengkap. Jika driver melaporkan lebih dari satu target Miracast, sistem operasi gagal memulai adaptor. Driver juga tidak boleh melaporkan monitor apa pun pada target ini jika sesi terhubung Miracast tidak dimulai.

Driver juga perlu melaporkan struktur DXGK_MIRACAST_DISPLAY_INTERFACE yang benar, dengan pointer ke fungsi yang berada di ruang alamat mode kernel, ketika subsistem kernel grafis DirectX memanggil fungsi DxgkDdiQueryInterface .

Saat sesi Miracast dimulai, dan monitor terhubung ke sink Miracast, driver miniport tampilan harus mengatur DXGK_CHILD_STATUS. Ketik anggota ke nilai konstanta StatusMiracast , dan juga harus mengatur DXGK_CHILD_STATUS. Miracast. Terhubung ke TRUE, untuk melaporkan HPD kedatangan monitor ke sistem operasi. Driver harus mengatur DXGK_CHILD_STATUS. Miracast. Anggota MiracastMonitorType ke jenis monitor yang benar yang terhubung ke sink. Jika sink adalah bagian dari monitor, anggota ini harus diatur ke D3DKMDT_VOT_MIRACAST.

Jika driver mengetahui EDID monitor, driver harus melaporkan EDID ini ketika sistem operasi memanggil fungsi DxgkDdiQueryDeviceDescriptor .

Bergantung pada kemampuan perangkat keras, daftar mode sink Miracast, dan bandwidth jaringan, driver harus melaporkan mode sumber, mode target, mode rotasi, dan mode penskalaan yang benar. Untuk mode target, driver harus melaporkan nilai anggota VSyncFreqDivider yang benar dalam D3DKMDT_VIDEO_SIGNAL_INFO. Sistem operasi cocok dengan mode target terhadap mode monitor dan memangkas mode apa pun yang tidak didukung monitor.