Condividi tramite


PFND3DDDI_UNLOCKCB funzione di callback (d3dumddi.h)

La funzione pfnUnlockCb sblocca un'allocazione bloccata da una chiamata alla funzione pfnLockCb .

Sintassi

PFND3DDDI_UNLOCKCB Pfnd3dddiUnlockcb;

HRESULT Pfnd3dddiUnlockcb(
  HANDLE hDevice,
  const D3DDDICB_UNLOCK *unnamedParam2
)
{...}

Parametri

hDevice

Handle per il dispositivo di visualizzazione (contesto grafico).

unnamedParam2

pData [in]

Puntatore a una struttura D3DDDICB_UNLOCK che descrive l'allocazione da sbloccare.

Valore restituito

pfnUnlockCb restituisce uno dei valori seguenti:

Codice restituito Descrizione
S_OK L'allocazione è stata sbloccata correttamente.
E_OUTOFMEMORY PfnUnlockCb non è riuscito a completare a causa di memoria insufficiente. Questo errore si verifica quando il sistema si trova in una situazione di memoria estremamente bassa e non è disponibile spazio sufficiente per allocare la matrice di pagine.
E_INVALIDARG I parametri sono stati convalidati e sono stati determinati come non corretti.

Questa funzione potrebbe anche restituire altri valori HRESULT.

Commenti

Il driver di visualizzazione in modalità utente deve chiamare la funzione pfnUnlockCb per sbloccare un'allocazione precedentemente bloccata in una chiamata alla funzione pfnLockCb . Se il driver non chiama pfnUnlockCb, il coordinamento tra il runtime di Microsoft Direct3D, il driver di visualizzazione in modalità utente e il driver miniport di visualizzazione vengono persi.

Il driver di visualizzazione in modalità utente chiama in genere pfnUnlockCb in risposta a una chiamata alla relativa funzione Unlock o ResourceUnmap (o altre varianti di ResourceUnmap , ad esempio DynamicIABufferUnmap) per sbloccare una risorsa o una superficie all'interno della risorsa. Prima di tornare dalla chiamata Unlock o ResourceUnmap , il driver di visualizzazione in modalità utente deve prima eseguire il mapping della risorsa o della superficie all'allocazione appropriata e quindi chiamare pfnUnlockCb per sbloccare l'allocazione.

Il driver di visualizzazione in modalità utente può anche chiamare pfnUnlockCb in risposta a una chiamata alla funzione DestroyDevice o DestroyDevice(D3D10) per liberare tutte le risorse allocate per il dispositivo. Nella durata di un dispositivo, ogni chiamata a pfnLockCb per bloccare un'allocazione deve essere associata a una chiamata alla funzione pfnUnlockCb per sbloccare l'allocazione.

Il driver di visualizzazione in modalità utente può sbloccare più allocazioni in una chiamata a pfnUnlockCb impostando il membro NumAllocations della struttura D3DDDICB_UNLOCK sul numero di allocazioni nella matrice specificata dal membro phAllocations di D3DDDICB_UNLOCK.

Il driver di visualizzazione in modalità utente deve chiamare pfnUnlockCb per sbloccare tutte le allocazioni a cui viene fatto riferimento nel flusso di comandi prima di chiamare la funzione pfnRenderCb . Il driver potrebbe avere allocazioni bloccate per il supporto, ad esempio il flag di campo di bit NoOverwrite . Se il driver non sblocca tutte queste allocazioni, la gestione memoria video potrebbe essere necessaria per inserire queste allocazioni nella memoria AGP.

Il driver di visualizzazione in modalità utente non deve chiamare pfnUnlockCb per sbloccare un'allocazione che potrebbe essere usata da un'applicazione. Il driver riceve una notifica che l'applicazione non sta più leggendo o scrivendo nell'allocazione quando il driver riceve una chiamata alla relativa funzione Unlock o ResourceUnmap sulla risorsa corrispondente.

Esempio

Nell'esempio di codice seguente viene illustrato come sbloccare un'allocazione.

HRESULT CD3DContext::SyncEnginesUsingLock(VOID) {
    HRESULT hr;
    D3DDDICB_LOCK   lockCB;
    D3DDDICB_UNLOCK Unlock;

    memset(&lockCB, 0, sizeof(D3DDDICB_LOCK));
    lockCB.hAllocation = m_HandleUsedInLastSubmit;
    lockCB.PrivateDriverData = 0;                       
    hr = m_d3dCallbacks.pfnLockCb(m_hD3D, &lockCB);
    if (FAILED(hr)) {
        DBG_BREAK;
        return hr;
    }
    Unlock.NumAllocations = 1;
    Unlock.phAllocations = &m_HandleUsedInLastSubmit;
    m_d3dCallbacks.pfnUnlockCb(m_hD3D, &Unlock);   
    return hr;
}

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

D3DDDICB_UNLOCK

D3DDDI_DEVICECALLBACKS

DestroyDevice

DestroyDevice(D3D10)

ResourceUnmap

Unlock

pfnLockCb

pfnRenderCb