리소스 만들기 및 소멸 처리

Microsoft DirectX 그래픽 커널 하위 시스템이 리소스 수명을 올바르게 추적하고 운영 체제에서 메모리 누수 방지를 위해 사용자 모드 디스플레이 드라이버가 리소스를 올바르게 만들고 삭제해야 합니다.

Microsoft Direct3D 런타임은 다음 사용자 모드 표시 드라이버 함수를 호출하여 사용자 모드 리소스를 만듭니다.

  • CreateResource 는 새 공유 또는 공유되지 않은 리소스를 만듭니다.

  • OpenResource 는 기존 공유 리소스에 대한 보기를 엽니다.

두 호출 모두에서 Direct3D 런타임은 사용자 모드 표시 드라이버가 런타임 에 다시 호출하는 데 사용하는 고유한 사용자 모드 런타임 리소스 핸들을 전달합니다. CreateResource 또는 OpenResource가 성공적으로 반환되면 사용자 모드 표시 드라이버는 리소스를 나타내는 고유한 사용자 모드 핸들을 반환합니다. 이 핸들은 사용자 모드 드라이버 리소스 핸들입니다. 런타임은 후속 드라이버 호출에서 사용자 모드 드라이버 리소스 핸들을 사용합니다.

사용자 모드 런타임 리소스 핸들과 사용자 모드 드라이버 리소스 핸들 간에 일대일 대응이 존재합니다. Direct3D 런타임 및 사용자 모드 표시 드라이버는 D3DDDIARG_CREATERESOURCE 및 D3DDDIARG_OPENRESOURCE구조의hResource 멤버를 통해 사용자 모드 런타임 및 드라이버 리소스 핸들을 교환합니다.

사용자 모드 표시 드라이버가 Direct3D 런타임의 pfnAllocateCb 함수를 호출하여 사용자 모드 리소스에 대한 할당을 만드는 경우 드라이버는 pData 매개 변수가 가리키는 D3DDDICB_ALLOCATE 구조의 hResource 멤버에서 사용자 모드 런타임 리소스 핸들을 지정해야 합니다. Direct3D 런타임은 리소스에 고유한 커널 모드 핸들을 생성하고 D3DDDICB_ALLOCATE hKMResource 멤버의 사용자 모드 표시 드라이버에 다시 전달합니다. 사용자 모드 표시 드라이버는 나중에 사용할 디스플레이 미니포트 드라이버의 명령 스트림에 커널 모드 리소스 핸들을 삽입할 수 있습니다.

참고 사용자 모드 리소스 핸들은 항상 각 사용자 모드 리소스 만들기에 대해 고유하지만 커널 모드 리소스 핸들이 항상 고유하지는 않습니다. Direct3D 런타임이 사용자 모드 표시 드라이버의 OpenResource 함수를 호출하여 기존 공유 리소스에 대한 보기를 열면 런타임은 pResource 매개 변수가 가리키는 D3DDDIARG_OPENRESOURCE 구조체의 hKMResource 멤버에 있는 리소스의 커널 모드 핸들을 전달합니다. 런타임이 사용자 모드 표시 드라이버의 CreateResource 함수라고 하는 런타임 이후에 이전에 이 커널 모드 핸들을 만들었습니다.

CreateResource 또는 OpenResource에서 만든 사용자 모드 리소스를 삭제하기 위해 Direct3D 런타임은 사용자 모드 표시 드라이버의 DestroyResource 함수 호출에서 hResource 매개 변수의 사용자 모드 드라이버 리소스 핸들을 전달합니다. 커널 모드 리소스 핸들과 사용자 모드 리소스와 연결된 모든 할당을 해제하기 위해 사용자 모드 표시 드라이버는 pData 매개 변수가 pfnDeallocateCb 함수를 호출할 때 가리키는 D3DDDICB_DEALLOCATE 구조체의 hResource 멤버에서 사용자 모드 런타임 리소스 핸들을 전달합니다.

사용자 모드 표시 드라이버가 리소스를 만들고 삭제할 때 다음 항목을 고려합니다.

  • 공유 리소스에 대한 응답으로 사용자 모드 표시 드라이버가 만드는 할당의 경우(즉, D3DDDIARG_CREATERESOURCE Flags 멤버에 설정된 SharedResource 비트 필드 플래그가 있는 CreateResource 호출에 대한 응답으로) 드라이버는 nULL이 아닌 값을 D3DDDICB_ALLOCATEhResource 멤버에 할당해야 합니다.

  • 공유되지 않은 리소스에 대한 응답으로 사용자 모드 표시 드라이버가 만드는 할당의 경우 드라이버는 nULL 이 아닌 값을 D3DDDICB_ALLOCATE hResource 멤버에 할당할 필요가 없습니다. 드라이버가 hResourceNULL을 할당하는 경우 할당은 특정 리소스(및 커널 모드 리소스 핸들)가 아닌 디바이스와 연결됩니다. 그러나 할당이 실제로 리소스와 관련된 경우 드라이버는 할당을 해당 리소스와 연결해야 합니다. 참고 커널 모드 리소스 핸들은 사용자 모드 표시 드라이버가 D3DDDICB_ALLOCATE hResource 멤버를 CreateResource 호출에서 D3DDDIARG_CREATERESOURCE 구조의hResource 멤버로부터 받은 사용자 모드 런타임 리소스 핸들로 설정하는 경우에만 만들어집니다.

  • 공유되지 않은 사용자 모드 리소스를 삭제하기 위해 DestroyResource가 호출되면 사용자 모드 표시 드라이버는 드라이버가 리소스와 할당을 연결하지 않은 경우에만 nULL로 설정된 D3DDDICB_DEALLOCATEhResource 멤버를 사용하여 pfnDeallocateCb를 호출할 수 있습니다. 사용자 모드에서 드라이버가 리소스와 연결된 할당을 표시하는 경우 드라이버는 nULL이 아닌 값으로 설정된 D3DDDICB_DEALLOCATE hResource 멤버를 사용하여 pfnDeallocateCb를 호출해야 합니다. 그렇지 않으면 메모리 누수가 발생합니다.