Freigeben über


PFND3DDDI_LOCKASYNC Rückruffunktion (d3dumddi.h)

Die LockAsync-Funktion sperrt die angegebene Ressource oder eine Oberfläche innerhalb der Ressource.

Syntax

PFND3DDDI_LOCKASYNC Pfnd3dddiLockasync;

HRESULT Pfnd3dddiLockasync(
  HANDLE hDevice,
  D3DDDIARG_LOCKASYNC *unnamedParam2
)
{...}

Parameter

hDevice

Ein Handle für das Anzeigegerät (Grafikkontext).

unnamedParam2

pData [ein, aus]

Ein Zeiger auf eine D3DDDIARG_LOCKASYNC Struktur, die die zu sperrende Ressource oder Oberfläche beschreibt.

Rückgabewert

LockAsync gibt einen der folgenden Werte zurück:

Rückgabecode Beschreibung
S_OK Die Ressource wurde erfolgreich gesperrt.
E_OUTOFMEMORY LockAsync konnte nicht den erforderlichen Arbeitsspeicher zuweisen, damit er vollständig ist.
D3DDDIERR_WASSTILLDRAWING Fehler beim Umbenennen der Zuordnung, die der Ressource entspricht, die die D3DDDIARG_LOCKASYNC-Struktur angibt.
Der Treiber gibt diesen Wert nur zurück, wenn das Bitfeldflag Verwerfen im Flags-Element von D3DDDIARG_LOCKASYNC festgelegt wurde.
E_NOTIMPL Der Benutzermodusanzeigetreiber unterstützt LockAsync für die angegebene Ressource nicht.

Hinweise

Auf Computern mit mehreren Prozessoren ruft die Microsoft Direct3D-Runtime möglicherweise die meisten Funktionen des Benutzermodusanzeigetreibers aus einem Workerthread anstelle des Standard Anwendungsthreads auf. Diese Optimierung mit mehreren Prozessoren ist für den Anzeigetreiber im Benutzermodus transparent. Wenn die Runtime optimierung mit mehreren Prozessoren verwendet, kann sie LockAsync anstelle der Lock-Funktion aufrufen, um eine Ressource zu sperren.

Ein Benutzermodusanzeigetreiber implementiert optional LockAsync; Die Direct3D-Runtime ruft LockAsync nur auf, wenn der Treiber die Funktionen LockAsync, UnlockAsync und Rename implementiert. Ein Benutzermodusanzeigetreiber sollte jedoch LockAsync und die Funktionen UnlockAsync und Rename implementieren, da Anwendungen, die häufig dynamische Ressourcen sperren, eine höhere Leistung erzielen können.

Wenn die Direct3D-Runtime optimierung mit mehreren Prozessoren verwendet, ruft sie die meisten Benutzermodusanzeigetreiberfunktionen aus einem Workerthread auf, den die Laufzeit verwaltet. Die Runtime ruft jedoch LockAsync im Standard Thread der Anwendung auf.

Wenn ein Benutzermodusanzeigetreiber eine DDI-Version von 0x0000000B oder höher verfügbar macht (der Treiber gibt diesen Wert im DriverVersion-Member der D3D10DDIARG_OPENADAPTER-Struktur in einem Aufruf der OpenAdapter-Funktion des Treibers zurück), ruft die Direct3D-Runtime LockAsync erneut auf. Wenn die Runtime LockAsync erneut aufruft, kann ein Thread in LockAsync ausgeführt werden, während ein anderer Thread, der auf dasselbe Anzeigegerät verweist, innerhalb einer anderen Benutzermodusanzeigetreiberfunktion ausgeführt wird. Darüber hinaus ruft die Runtime bei diesem Treibertyp LockAsync für Systemspeicheroberflächen auf. Wenn das Flag "Bitfeld verwerfen" im Flags-Element von D3DDDIARG_LOCKASYNC festgelegt ist, sollte der Treiber versuchen, die Zuordnung umzubenennen, die der Ressource entspricht. Um eine Zuordnung umzubenennen, ruft der Treiber in der Regel die PfnLockCb-Funktion mit dem Zuordnungshandle auf, das der zu sperrenden Ressource entspricht.

Der Treiber sollte das Flag "Bitfeld verwerfen" im Flags-Member der D3DDDICB_LOCK-Struktur festlegen, wenn der Treiber pfnLockCb aufruft. Der Treiber sollte das NoExistingReference-Bitfeldflag von D3DDDICB_LOCK festlegen, wenn der Treiber pfnLockCb nur dann aufruft, wenn das NoExistingReferences-Bitfeldflag im Flags-Member von D3DDDIARG_LOCKASYNC auf TRUE festgelegt ist und der Treiber keine intern in die Warteschlange stehenden Verweise auf die Ressource aufweist.

Wenn der Treiber die Zuordnung nicht umbenennen kann, sollte die LockAsync-Funktion des Treibers den Fehler an die Laufzeit zurückgeben, und der Treiber sollte seinen Befehlspuffer nicht leeren. Wenn die Umbenennung erfolgreich ist, sollte der Treiber Zeiger auf Ressourcenspeicher, Pitch und Slice pitch sowie ein Handle für die Ressource zurückgeben, das die umbenannte Zuordnung in den Membern von D3DDDIARG_LOCKASYNC darstellt. Der Treiber sollte seine internen Nachverfolgungsstrukturen nicht mit dem neuen Zuordnungshandle aktualisieren, das pfnLockCb zurückgibt. Stattdessen sollte der Treiber warten, bis seine Rename-Funktion aufgerufen wird.

Wenn das NoOverwrite-Bitfeldflag im Flags-Member von D3DDDIARG_LOCKASYNC festgelegt ist, sollte der Treiber die entsprechende Zuordnung mit der Semantik ohne Überschreibung sperren. Der Treiber sollte pfnLockCb aufrufen, wobei das IgnoreSync-Bitfeldflag im Flags-Element von D3DDDICB_LOCK festgelegt ist, und dann Zeiger auf Ressourcenspeicher, Pitch und Slice pitch zur Direct3D-Runtime in den Membern von D3DDDIARG_LOCKASYNC zurückgeben. Wenn der Treiber einen Erfolgreichen (S_OK) von einem Aufruf an lockAsync mit dem NoOverwrite-Bitfeldflag zurückgibt, wird er möglicherweise aufgerufen, mit einer gesperrten Oberfläche zu rendern. Der Treiber sollte den Erfolg eines Aufrufs seiner LockAsync-Instanz mit NoOverwrite nur für Oberflächen zurückgeben, die während der Sperrung gerendert werden können. Der Videospeicher-Manager erfordert, dass die Zuordnungen, die den Oberflächen entsprechen, in AGP- oder Blendensegmenten unterstützt werden müssen. Andernfalls schlagen Aufrufe der PfnRenderCb-Funktion fehl, wenn der Befehlspuffer auf eine gesperrte Zuordnung verweist.

Zusammenfassend kann gesagt werden, dass der Treiber die LockAsync-Funktion nicht aufruft, wenn die Umbenennung fehlschlägt oder wenn keine Überschreibungssemantik für die Ressource unterstützt wird. Die Direct3D-Runtime wird jedoch nach diesen Fehlern wiederhergestellt. In allen anderen Situationen sollten Treiber den Erfolg von LockAsync zurückgeben, um die Leistung auf Computern mit mehreren Prozessoren zu verbessern.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Verfügbar in Windows Vista und höheren Versionen der Windows-Betriebssysteme.
Zielplattform Desktop
Kopfzeile d3dumddi.h (include D3dumddi.h)

Weitere Informationen

CreateResource

D3DDDIARG_CREATERESOURCE

D3DDDIARG_LOCKASYNC

D3DDDICB_LOCK

D3DDDI_DEVICEFUNCS

Sperre

Umbenennen

UnlockAsync

pfnLockCb

pfnRenderCb