PFND3DDDI_LOCKASYNC funzione di callback (d3dumddi.h)

La funzione LockAsync blocca la risorsa specificata o una superficie all'interno della risorsa.

Sintassi

PFND3DDDI_LOCKASYNC Pfnd3dddiLockasync;

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

Parametri

hDevice

Handle per il dispositivo di visualizzazione (contesto grafico).

unnamedParam2

pData [in, out]

Puntatore a una struttura D3DDDIARG_LOCKASYNC che descrive la risorsa o la superficie all'interno della risorsa da bloccare.

Valore restituito

LockAsync restituisce uno dei valori seguenti:

Codice restituito Descrizione
S_OK La risorsa è bloccata correttamente.
E_OUTOFMEMORY LockAsync non è riuscito ad allocare la memoria necessaria per il completamento.
D3DDDIERR_WASSTILLDRAWING Ridenominazione dell'allocazione corrispondente alla risorsa specificata dalla struttura D3DDDIARG_LOCKASYNC non riuscita.
Il driver restituisce questo valore solo se il flag di campo di bit Discard è stato impostato nel membro Flags di D3DDDIARG_LOCKASYNC.
E_NOTIMPL Il driver di visualizzazione in modalità utente non supporta LockAsync per la risorsa specificata.

Commenti

Nei computer con più processori, il runtime di Microsoft Direct3D potrebbe chiamare la maggior parte delle funzioni del driver di visualizzazione in modalità utente da un thread di lavoro anziché dal thread dell'applicazione principale. Questa ottimizzazione a più processori è trasparente per il driver di visualizzazione in modalità utente. Quando il runtime usa l'ottimizzazione a più processori, potrebbe chiamare LockAsync anziché la funzione Lock per bloccare una risorsa.

Un driver di visualizzazione in modalità utente implementa facoltativamente LockAsync; Il runtime Direct3D chiama LockAsync solo se il driver implementa le funzioni LockAsync, UnlockAsync e Rename . Tuttavia, un driver di visualizzazione in modalità utente deve implementare le funzioni LockAsync e UnlockAsync e Rename perché le applicazioni che bloccano frequentemente le risorse dinamiche possono quindi ottenere prestazioni più elevate.

Quando il runtime Direct3D usa l'ottimizzazione a più processori, chiama la maggior parte delle funzioni del driver di visualizzazione in modalità utente da un thread di lavoro gestito dal runtime; Tuttavia, il runtime chiama LockAsync nel thread principale dell'applicazione.

Se un driver di visualizzazione in modalità utente espone una versione DDI di 0x0000000B o superiore (il driver restituisce questo valore nel membro DriverVersion della struttura D3D10DDIARG_OPENADAPTER in una chiamata alla funzione OpenAdapter del driver), il runtime Direct3D chiamerà LockAsync in modo ricorsivo. Quando il runtime chiama LockAsync in modo reentrant, un thread può essere eseguito all'interno di LockAsync mentre un altro thread che fa riferimento allo stesso dispositivo di visualizzazione viene eseguito all'interno di un'altra funzione driver di visualizzazione in modalità utente. Inoltre, in questo tipo di driver, il runtime chiamerà LockAsync per le superfici di memoria di sistema. Se il flag di campo di bit Discard è impostato nel membro Flags di D3DDDIARG_LOCKASYNC, il driver deve tentare di rinominare l'allocazione corrispondente alla risorsa. In genere, per rinominare un'allocazione, il driver chiama la funzione pfnLockCb con l'handle di allocazione che corrisponde alla risorsa da bloccare.

Il driver deve impostare il flag di campo di bit Discard nel membro Flags della struttura D3DDDICB_LOCK quando il driver chiama pfnLockCb. Il driver deve impostare il flag di campo di bit NoExistingReference di D3DDDICB_LOCK quando il driver chiama pfnLockCb solo se il flag di campo di bit NoExistingReferences è impostato su TRUE nel membro Flags di D3DDDIARG_LOCKASYNC e il driver non ha riferimenti accodati internamente alla risorsa.

Se il driver non riesce a rinominare l'allocazione, la funzione LockAsync del driver deve restituire l'errore al runtime e il driver non deve scaricare il buffer dei comandi. Se la ridenominazione ha esito positivo, il driver deve restituire puntatori alla memoria delle risorse, all'inclinazione e alla sezione e un handle alla risorsa che rappresenta l'allocazione rinominata nei membri di D3DDDIARG_LOCKASYNC. Il driver non deve aggiornare le strutture di rilevamento interne con il nuovo handle di allocazione restituito da pfnLockCb . Al contrario, il driver deve attendere fino a quando non viene chiamata la funzione Rename .

Se il flag di campo di bit NoOverwrite è impostato nel membro Flags di D3DDDIARG_LOCKASYNC, il driver deve bloccare l'allocazione corrispondente senza sovrascrivere semantica. Il driver deve chiamare pfnLockCb con il flag di campo di bit IgnoreSync impostato nel membro Flags di D3DDDICB_LOCK e deve quindi restituire puntatori alla memoria delle risorse, all'inclinazione e all'inclinazione delle sezioni al runtime Direct3D nei membri di D3DDDIARG_LOCKASYNC. Se il driver restituisce l'esito positivo (S_OK) da una chiamata a LockAsync con il flag di campo di bit NoOverwrite impostato, potrebbe essere chiamato per eseguire il rendering con una superficie bloccata. Il driver deve restituire l'esito positivo di una chiamata a LockAsync con Il set NoOverwrite solo per le superfici di cui è possibile eseguire il rendering durante il blocco. Il gestore della memoria video richiede che le allocazioni che corrispondono alle superfici devono essere supportate nei segmenti AGP o aperture; in caso contrario, le chiamate alla funzione pfnRenderCb hanno esito negativo quando il buffer dei comandi fa riferimento a un'allocazione bloccata.

In sintesi, il driver deve non eseguire chiamate alla relativa funzione LockAsync se la ridenominazione non riesce o se la semantica di sovrascrittura non è supportata per la risorsa. Tuttavia, il runtime Direct3D verrà ripristinato da questi errori. Per tutte le altre situazioni, i driver devono restituire l'esito positivo di LockAsync per migliorare le prestazioni nei computer con più processori.

Requisiti

Requisito Valore
Client minimo supportato Disponibile in Windows Vista e versioni successive dei sistemi operativi Windows.
Piattaforma di destinazione Desktop
Intestazione d3dumddi.h (include D3dumddi.h)

Vedi anche

CreateResource

D3DDDIARG_CREATERESOURCE

D3DDDIARG_LOCKASYNC

D3DDDICB_LOCK

D3DDDI_DEVICEFUNCS

Lock

Rinominare

UnlockAsync

pfnLockCb

pfnRenderCb