다음을 통해 공유


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구현하고 UnlockAsync 이름 바꾸기 함수를 경우에만 lockAsync 호출합니다. 그러나 사용자 모드 디스플레이 드라이버는 LockAsync 구현해야 하며 UnlockAsync동적 리소스를 자주 잠그는 애플리케이션은 더 높은 성능을 얻을 수 있으므로 이름 바꾸기 함수를 구현해야 합니다.

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_LOCKFlags 멤버에 설정된 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