PFND3DDDI_LOCKASYNC 콜백 함수(d3dumddi.h)

LockAsync 함수는 지정된 리소스 또는 리소스 내의 표면을 잠급니다.

구문

PFND3DDDI_LOCKASYNC Pfnd3dddiLockasync;

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

매개 변수

hDevice

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

unnamedParam2

pData [in, out]

잠글 리소스 내의 리소스 또는 표면을 설명하는 D3DDDIARG_LOCKASYNC 구조체에 대한 포인터입니다.

반환 값

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

반환 코드 설명
S_OK 리소스가 성공적으로 잠겼습니다.
E_OUTOFMEMORY LockAsync가 완료하는 데 필요한 메모리를 할당할 수 없습니다.
D3DDDIERR_WASSTILLDRAWING D3DDDIARG_LOCKASYNC 구조체가 지정하지 못한 리소스에 해당하는 할당의 이름을 바꿉니다.
드라이버는 삭제 비트 필드 플래그가 D3DDDIARG_LOCKASYNC Flags 멤버에 설정된 경우에만 이 값을 반환합니다.
E_NOTIMPL 사용자 모드 표시 드라이버는 지정된 리소스에 대해 LockAsync를 지원하지 않습니다.

설명

다중 프로세서 컴퓨터에서 Microsoft Direct3D 런타임은 기본 애플리케이션 스레드 대신 작업자 스레드에서 사용자 모드 표시 드라이버의 대부분의 함수를 호출할 수 있습니다. 이 다중 프로세서 최적화는 사용자 모드 디스플레이 드라이버에 투명합니다. 런타임에서 다중 프로세서 최적화를 사용하는 경우 Lock 함수가 아닌 LockAsync를 호출하여 리소스를 잠글 수 있습니다.

사용자 모드 표시 드라이버는 필요에 따라 LockAsync를 구현합니다. Direct3D 런타임은 드라이버가 LockAsync, UnlockAsyncRename 함수를 구현하는 경우에만 LockAsync를 호출합니다. 그러나 사용자 모드 표시 드라이버는 동적 리소스를 자주 잠그는 애플리케이션이 더 높은 성능을 얻을 수 있기 때문에 LockAsyncUnlockAsyncRename 함수를 구현해야 합니다.

Direct3D 런타임에서 다중 프로세서 최적화를 사용하는 경우 런타임이 관리하는 작업자 스레드에서 대부분의 사용자 모드 표시 드라이버 함수를 호출합니다. 그러나 런타임은 애플리케이션의 기본 스레드에서 LockAsync를 호출합니다.

사용자 모드 표시 드라이버가 DDI 버전의 0x0000000B 이상을 노출하는 경우(드라이버는 드라이버의 OpenAdapter 함수 호출에서 D3D10DDIARG_OPENADAPTER 구조체의 DriverVersion 멤버에서 이 값을 반환함) Direct3D 런타임은 다시 들여쓰기 방식으로 LockAsync를 호출합니다. 런타임이 다시 활성화된 방식으로 LockAsync를 호출하면 한 스레드가 LockAsync 내에서 실행되며 동일한 디스플레이 디바이스를 참조하는 다른 스레드는 다른 사용자 모드 표시 드라이버 함수 내에서 실행됩니다. 또한 이러한 유형의 드라이버에서 런타임은 시스템 메모리 표면에 대해 LockAsync를 호출합니다. 삭제 비트 필드 플래그가 D3DDDIARG_LOCKASYNCFlags 멤버에 설정된 경우 드라이버는 리소스에 해당하는 할당의 이름을 바꾸려고 시도해야 합니다. 일반적으로 할당 이름을 바꾸려면 드라이버는 잠글 리소스에 해당하는 할당 핸들을 사용하여 pfnLockCb 함수를 호출합니다.

드라이버는 드라이버가 pfnLockCb를 호출할 때 D3DDDICB_LOCK 구조체의 Flags 멤버에서 삭제 비트 필드 플래그를 설정해야 합니다. 드라이버는 D3DDDIARG_LOCKASYNC Flags 멤버에서NoExistingReferences 비트 필드 플래그가 TRUE로 설정되고 드라이버에 리소스에 대한 내부적으로 큐에 대기된 참조가 없는 경우에만 드라이버가 pfnLockCb를 호출할 때 D3DDDICB_LOCK NoExistingReference 비트 필드 플래그를 설정해야 합니다.

드라이버가 할당 이름을 바꾸는 데 실패하면 드라이버의 LockAsync 함수는 오류를 런타임으로 다시 반환해야 하며 드라이버는 명령 버퍼를 플러시하지 않아야 합니다. 이름 바꾸기에 성공하면 드라이버는 리소스 메모리, 피치 및 조각 피치에 대한 포인터와 D3DDDIARG_LOCKASYNC 멤버의 이름이 변경된 할당을 나타내는 리소스에 대한 핸들을 반환해야 합니다. 드라이버는 pfnLockCb 에서 반환하는 새 할당 핸들로 내부 추적 구조를 업데이트해서는 안 됩니다. 대신 드라이버는 Rename 함수가 호출될 때까지 기다려야 합니다.

noOverwrite 비트 필드 플래그가 D3DDDIARG_LOCKASYNC Flags 멤버에 설정된 경우 드라이버는 덮어쓰지 않는 의미 체계로 해당 할당을 잠급니다. 드라이버는 D3DDDICB_LOCK Flags 멤버에 설정된 IgnoreSync 비트 필드 플래그를 사용하여 pfnLockCb을 호출한 다음, 리소스 메모리, 피치 및 슬라이스 피치에 대한 포인터를 D3DDDIARG_LOCKASYNC 멤버의 Direct3D 런타임에 반환해야 합니다. 드라이버가 NoOverwrite 비트 필드 플래그가 설정된 LockAsync 호출에서 성공(S_OK)을 반환하는 경우 잠긴 표면으로 렌더링하도록 호출될 수 있습니다. 드라이버는 잠금 상태에서 렌더링할 수 있는 표면에 대해서만 NoOverwrite가 설정된 LockAsync 호출에서 성공을 반환해야 합니다. 비디오 메모리 관리자는 표면에 해당하는 할당을 AGP 또는 조리개 세그먼트에서 지원해야 합니다. 그렇지 않으면 명령 버퍼가 잠긴 할당을 참조할 때 pfnRenderCb 함수에 대한 호출이 실패합니다.

요약하자면, 이름 바꾸기가 실패하거나 리소스에 대해 덮어쓰지 않는 의미 체계가 지원되지 않는 경우 드라이버는 LockAsync 함수에 대한 호출을 실패해야 합니다. 그러나 Direct3D 런타임은 이러한 오류에서 복구됩니다. 다른 모든 상황에서 드라이버는 다중 프로세서 컴퓨터의 성능을 향상시키기 위해 LockAsync 에서 성공을 반환해야 합니다.

요구 사항

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

추가 정보

CreateResource

D3DDDIARG_CREATERESOURCE

D3DDDIARG_LOCKASYNC

D3DDDICB_LOCK

D3DDDI_DEVICEFUNCS

잠금

이름 바꾸기

UnlockAsync

pfnLockCb

pfnRenderCb