다음을 통해 공유


PFND3DDDI_UNLOCKCB 콜백 함수(d3dumddi.h)

pfnUnlockCb 함수는 pfnLockCb 함수에 대한 호출로 잠긴 할당의 잠금을 해제합니다.

구문

PFND3DDDI_UNLOCKCB Pfnd3dddiUnlockcb;

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

매개 변수

hDevice

디스플레이 디바이스(그래픽 컨텍스트)에 대한 핸들입니다.

unnamedParam2

pData [in]

잠금 해제할 할당을 설명하는 D3DDDICB_UNLOCK 구조체에 대한 포인터입니다.

반환 값

pfnUnlockCb 는 다음 값 중 하나를 반환합니다.

반환 코드 설명
S_OK 할당이 성공적으로 잠금 해제되었습니다.
E_OUTOFMEMORY pfnUnlockCb는 메모리 부족으로 인해 완료할 수 없습니다. (이 오류는 시스템이 메모리가 매우 부족하고 페이지 배열을 할당할 공간이 충분하지 않은 경우에 발생합니다.)
E_INVALIDARG 매개 변수의 유효성이 검사되었고 잘못된 것으로 확인되었습니다.

이 함수는 다른 HRESULT 값을 반환할 수도 있습니다.

설명

사용자 모드 표시 드라이버는 pfnUnlockCb 함수를 호출하여 이전에 pfnLockCb 함수에 대한 호출에서 잠긴 할당의 잠금을 해제해야 합니다. 드라이버가 pfnUnlockCb를 호출하지 않으면 Microsoft Direct3D 런타임, 사용자 모드 디스플레이 드라이버 및 디스플레이 미니포트 드라이버 간의 조정이 손실됩니다.

사용자 모드 디스플레이 드라이버는 일반적으로 해당 Unlock 또는 ResourceUnmap 함수(또는 ResourceUnmap의 다른 변형(예: DynamicIABufferUnmap)에 대한 호출에 대한 응답으로 pfnUnlockCb를 호출하여 리소스 내의 리소스 또는 표면의 잠금을 해제합니다. Unlock 또는 ResourceUnmap 호출에서 반환하기 전에 사용자 모드 표시 드라이버는 먼저 리소스 또는 표면을 적절한 할당에 매핑한 다음 pfnUnlockCb를 호출하여 할당의 잠금을 해제해야 합니다.

사용자 모드 디스플레이 드라이버는 DestroyDevice 또는 DestroyDevice(D3D10) 함수 호출에 대한 응답으로 pfnUnlockCb를 호출하여 디바이스에 할당된 모든 리소스를 해제할 수도 있습니다. 디바이스의 수명 동안 할당을 잠그기 위해 pfnLockCb 를 호출할 때마다 pfnUnlockCb 함수에 대한 호출과 쌍을 이겨 할당의 잠금을 해제해야 합니다.

사용자 모드 표시 드라이버는 D3DDDICB_UNLOCK 구조체의 NumAllocations 멤버를 D3DDDICB_UNLOCKphAllocations 멤버가 지정한 배열의 할당 수로 설정하여 pfnUnlockCb에 대한 한 번의 호출에서 여러 할당의 잠금을 해제할 수 있습니다.

사용자 모드 표시 드라이버는 pfnRenderCb 함수를 호출하기 전에 pfnUnlockCb를 호출하여 명령 스트림에서 참조되는 모든 할당의 잠금을 해제해야 합니다. 드라이버에 지원하도록 잠긴 할당이 있을 수 있습니다(예: NoOverwrite 비트 필드 플래그). 드라이버가 이러한 할당을 모두 잠금 해제하지 않는 경우 비디오 메모리 관리자는 이러한 할당을 AGP 메모리에 배치해야 할 수 있습니다.

사용자 모드 표시 드라이버는 pfnUnlockCb 를 호출하여 애플리케이션에서 사용할 수 있는 할당의 잠금을 해제해서는 안 됩니다. 드라이버가 해당 리소스에서 Unlock 또는 ResourceUnmap 함수에 대한 호출을 수신할 때 애플리케이션이 할당에서 더 이상 읽거나 쓰지 않는다는 알림이 드라이버에 표시됩니다.

예제

다음 코드 예제에서는 할당의 잠금을 해제하는 방법을 보여 있습니다.

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;
}

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Vista 이상 버전의 Windows 운영 체제에서 사용할 수 있습니다.
대상 플랫폼 데스크톱
머리글 d3dumddi.h(D3dumddi.h 포함)

추가 정보

D3DDDICB_UNLOCK

D3DDDI_DEVICECALLBACKS

DestroyDevice

DestroyDevice(D3D10)

ResourceUnmap

Unlock

pfnLockCb

pfnRenderCb