Unterstützen von Videoaufnahmen und anderen untergeordneten Geräten
Ein Display-Miniporttreiber und der Treiber für ein Videoaufnahmegerät oder ein anderes untergeordnetes Gerät können gegenseitig eine private Schnittstelle definieren, die der untergeordnete Treiber für die Kommunikation mit seinem Gerät über den übergeordneten Miniporttreiber verwenden kann. Ein untergeordneter Videoaufnahmetreiber muss eng mit dem übergeordneten Display-Miniporttreiber verbunden sein. Tatsächlich könnte die Videoaufnahme möglicherweise als Teil des Display-Miniport-Treibers implementiert werden. Ein Videoaufnahmetreiber kann die private Schnittstelle mit dem Display-Miniporttreiber verwenden, um auf den I2C-Bus und für andere Zwecke zuzugreifen.
Um die private Schnittstelle zu initialisieren, sendet der Videoaufnahmetreiber eine IRP_MN_QUERY_INTERFACE-Anforderung an den Anzeigeporttreiber (Teil vonDxgkrnl.sys) für den Display-Miniporttreiber. Nachdem der Anzeigeporttreiber eine solche Anforderung empfangen hat, ruft er die DxgkDdiQueryInterface-Funktion des Miniporttreibers auf und übergibt einen Zeiger auf eine QUERY_INTERFACE Struktur, die Informationen zum Initialisieren der privaten Schnittstelle enthält.
Hinweis Wenn die Videoaufnahme als Teil des Anzeigeminiporttreibers implementiert ist, ruft die Videoaufnahme möglicherweise DxgkDdiQueryInterface direkt auf.
Jeder Treiber eines untergeordneten Geräts (einschließlich Videoaufnahmegeräten) muss die Adapter-GUID zurückgeben, die die Hardware angibt, der das Gerät zugeordnet ist. Die Adapter-GUID wird für den Anzeige-Miniporttreiber im AdapterGuid-Member der DXGK_START_INFO-Struktur bereitgestellt, auf die der DxgkStartInfo-Parameter der DxgkDdiStartDevice-Funktion verweist, die beim Initialisieren des Adapters gesendet wird. Benutzermoduserfassungskomponenten können diese Adapter-GUID anschließend einem Grafikkarte zuordnen.
Im Microsoft Windows 2000-Anzeigetreibermodell senden Videoaufnahmeanwendungen Systemspeichererfassungspuffer in den Kernelmodus. Der Kernelmodus beschreibt dann die Systemspeicherpuffer mithilfe von MDL-Strukturen (Memory Descriptor List) und sendet die MDLs an den Videoaufnahmetreiber. Zusätzlich zur Unterstützung der Erfassung im Systemspeicher unterstützt das Windows Vista-Anzeigetreibermodell die Erfassung im Videospeicher. Die Direct3D-Runtime ruft Funktionen vom Typ DirectX Video Acceleration 2.0 auf, um die GPU anweisen, nach der Verarbeitung von Aufzeichnungsdaten zu verarbeiten. Anstatt MDLs zu senden, um die Videospeicherpuffer zu beschreiben, sendet der Benutzermodusanzeigetreiber D3DKMT_HANDLE-Typwerte, die Handles sind, um Pufferzuordnungen zu erfassen. Daher kann die Kombination aus Videoaufnahmetreiber und Anzeige-Miniporttreibern vorhandene Rückruffunktionen wie DxgkCbGetHandleData verwenden, um auf private Daten zu verweisen, die den Erfassungspuffer beschreiben. Die Treiberkombination kann auch die DxgkCbGetCaptureAddress-Rückruffunktion verwenden, um die physische Adresse des Erfassungspuffers zurückzugeben.
Videoaufnahmeanwendungen rufen die Direct3D-Runtime auf, um Erfassungspuffer zu erstellen. Die Runtime ruft anschließend den Anzeigetreiber für den Benutzermodus auf. Die Runtime ruft die CreateResource-Funktion des Anzeigetreibers im Benutzermodus auf, wobei das CaptureBuffer-Bitfeldflag im Flags-Member der D3DDDIARG_CREATERESOURCE-Struktur festgelegt ist, um Erfassungspuffer zu erstellen. Der Anzeige-Miniporttreiber muss auch das Capture-Bitfeldflag für den Videospeicher-Manager angeben, wenn der Speicher-Manager die DxgkDdiCreateAllocation-Funktion des Anzeigeminiporttreibers aufruft, um Zuordnungen für die Erfassungspuffer zu erstellen. Wenn Erfassungspuffer erstellt werden, werden sie sofort im Arbeitsspeicher angeheftet und erst wieder entfernt, wenn sie freigegeben werden. Da der Erfassungsstapel Kernelmoduszuordnungshandles für Erfassungspuffer an den Erfassungstreiber senden muss, ruft die Runtime die GetCaptureAllocationHandle-Funktion des Benutzermodusanzeigetreibers auf, um jedes Ressourcenhandle dem Kernelmoduszuordnungshandle für diese Ressource zuzuordnen.
Der Erfassungstreiber kann melden, ob er die Erfassung direkt im Systemspeicher unterstützt. Wenn der Erfassungstreiber die direkte Erfassung im Systemspeicher unterstützt, werden MDLs zu diesem Zweck an den Erfassungstreiber gesendet. Wenn der Aufzeichnungstreiber keine direkte Erfassung im Systemspeicher unterstützt, erstellt die Runtime Videospeicheraufnahmepuffer, die vom Aufzeichnungstreiber gefüllt werden müssen. Die CaptureToSysMem-Funktion des Benutzermodus-Anzeigetreibers wird aufgerufen, um den Inhalt eines Erfassungspuffers auf eine Systemspeicheroberfläche zu kopieren. Die Runtime kann CaptureToSysMem anstelle der Blt-Funktion verwenden, um spezielle Hardware für Bitblockübertragungen (Bitblt) zu nutzen, für die nicht erforderlich ist, dass der Benutzermodusanzeigetreiber die pfnRenderCb-Funktion aufruft.
Da AVStream die Videoaufnahme steuert, ist das DirectX-Grafikkernsubsystem nicht darüber informiert, wann die Videoaufnahme erfolgt. Das Grafikkernsubsystem kennt jedoch die Zuordnungen, die als Erfassungspuffer verwendet werden. Wenn ein Erfassungspuffer zerstört werden soll, ruft das Grafikkernsubsystem die DxgkDdiStopCapture-Funktion des Anzeigeminiporttreibers auf, um anzugeben, dass der Erfassungsvorgang die Verwendung einer Zuordnung als Erfassungspuffer sofort beenden muss. Wenn der Erfassungsvorgang bereits über den Erfassungsstapel beendet wurde, kann der Treiber den Aufruf problemlos ignorieren.