Freigeben über


Sperren von Swizzled-Zuordnungen

Der Videospeicher-Manager bietet besondere Unterstützung für direkten CPU-Zugriff auf swizzled-Zuordnungen (d. h. Zuordnungen, bei denen die DxgkDdiCreateAllocation-Funktion des Anzeigeminiporttreibers das Swizzled-Flag im Flags-Element der DXGK_ALLOCATIONINFO-Struktur festlegt).

Wenn der Videospeicher-Manager CPU-barrierefreie Zuordnungen entfernt, die vom Treiber nicht als aus einem Speichersegment markiert sind, muss der Anzeige-Miniporttreiber sie immer in einem linearen Format speichern. Daher können solche Zuordnungen nicht geschwenkt werden, während sie sich in einem Blendensegment befinden, und sie müssen immer von der DxgkDdiBuildPagingBuffer-Funktion des Treibers geschwenkt oder ungewizzt werden.

Andererseits müssen Zuordnungen, die als swizzled gekennzeichnet sind, nicht immer in einem linearen Format gespeichert werden, wenn sie aus einem Speichersegment entfernt werden. Bei solchen Zuordnungen verfolgt der Videospeicher-Manager den Schwenkzustand dieser Zuordnungen und erfordert nur, dass die DxgkDdiBuildPagingBuffer-Funktion des Treibers eine Zuordnung während bestimmter Übertragungsvorgänge aufheben kann.

Nachdem der Anzeigetreiber im Benutzermodus die PfnLockCb-Funktion der Microsoft Direct3D-Runtime aufgerufen hat, verhalten sich der Videospeicher-Manager und der Anzeige-Miniporttreiber je nach Status der Zuordnung wie folgt:

  1. Zuordnung in einem Speichersegment

    Der Videospeicher-Manager versucht, eine CPU-Blende zu erhalten, um linearen Zugriff auf die Zuordnung zu ermöglichen. Wenn der Videospeicher-Manager die Blende nicht abrufen kann, entfernt der Videospeicher-Manager die Zuordnung zurück in den Systemspeicher (es sei denn, der Treiber legt den DonotEvict-Member der D3DDDICB_LOCKFLAGS-Struktur fest). Wenn der Videospeicher-Manager die DxgkDdiBuildPagingBuffer-Funktion des Anzeigeminiporttreibers aufruft, um die Zuordnung zu übertragen, sollte der Anzeige-Miniporttreiber die Zuordnung aufheben.

  2. Zuordnung entfernt (geschwenkt) oder in einem Öffnungssegment

    Die Zuordnung muss aufgehoben werden, bevor die CPU darauf zugreifen kann. Daher versucht der Videospeicher-Manager zuerst, die Zuordnung in ein Speichersegment zu einfügen. Nachdem sich die Zuordnung in einem Speichersegment befindet, verhalten sich der Videospeicher-Manager und der Anzeige-Miniporttreiber wie in Nummer 1.

  3. Zuweisung entfernt (unwizzled)

    Wenn die Zuordnung zum Systemspeicher bereits aufgehoben wurde, gibt der Videospeicher-Manager den vorhandenen Zuordnungszeiger ohne weitere Verarbeitung zurück.

    Damit die GPU eine Zuordnung verwendet, die zuvor nicht zugeordnet wurde, muss die Zuordnung neu festgelegt werden, bevor die GPU sie verwendet. Daher verhalten sich bei einem Surface-Fehler der Videospeicher-Manager und der Anzeige-Miniporttreiber wie folgt:

    • Zuordnung in einem Speichersegment (bei bedarfslos durch die CPU-Blende nicht verfügbar)

      Die Zuordnung erfolgt bereits in einem swizzled-Format, das die GPU verarbeiten kann. Daher ist keine weitere Verarbeitung durch den Videospeicher-Manager erforderlich.

    • Zuordnung zum Systemarbeitsspeicher entfernt (nicht verregt)

      Die Seiten der Zuordnung enthalten ungewizzte Daten und können nicht einem Blendensegment zugeordnet werden. Daher muss die Zuordnung in einem Speichersegment ausgelagert werden. Wenn der Videospeicher-Manager die DxgkDdiBuildPagingBuffer-Funktion des Anzeigeminiporttreibers aufruft, um in der Zuordnung zu sehen, fordert der Videospeicher-Manager an, dass der Anzeige-Miniporttreiber die Zuordnung schwenkt.

Hinweis Nachdem eine swizzled-Zuordnung über eine CPU-Blende unter CPU-Zugriff steht, kann sie dennoch entfernt werden, bevor der Benutzermodusanzeigetreiber den CPU-Zugriff beendet. Dieser Fall wird wie in Nummer 2 behandelt. Die Entfernung erfolgt so, dass sie für die Anwendung und den Anzeigetreiber im Benutzermodus unsichtbar ist. Außerdem ist eine Sperre ohne Überschreibung (d. h. eine Sperre, die durch Festlegen des IgnoreSync-Elements von D3DDDICB_LOCKFLAGS abgerufen wird) für eine swizzled-Zuordnung nicht zulässig. Nur die CPU oder die GPU kann jederzeit auf eine solche Zuordnung zugreifen.