DXGKDDI_SYSTEM_DISPLAY_ENABLE 콜백 함수(dispmprt.h)
OS는 KMD(커널 모드 디스플레이 드라이버) DxgkddiSystemDisplayEnable 함수를 호출하여 KMD가 현재 디스플레이 디바이스를 지정된 상태로 다시 설정하도록 요청합니다.
통사론
DXGKDDI_SYSTEM_DISPLAY_ENABLE DxgkddiSystemDisplayEnable;
NTSTATUS DxgkddiSystemDisplayEnable(
[in] PVOID MiniportDeviceContext,
[in] D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId,
[in] PDXGKARG_SYSTEM_DISPLAY_ENABLE_FLAGS Flags,
[out] UINT *Width,
[out] UINT *Height,
[out] D3DDDIFORMAT *ColorFormat
)
{...}
매개 변수
[in] MiniportDeviceContext
디스플레이 어댑터와 연결된 컨텍스트 블록에 대한 핸들입니다. KMD의
[in] TargetId
디스플레이 디바이스가 연결된 디스플레이 어댑터에 있는 비디오 대상의 식별자를 지정하는 D3DDDI_VIDEO_PRESENT_TARGET_ID 값입니다. 이 식별자는 DxgkDdiCommitVidPn대한 이전 호출 중에 현재 VidPn(비디오 제공 네트워크) 상태에 남아 있는 대상에 대한 것일 수 있습니다.
[in] Flags
비트 OR 플래그가 들어 있는 DXGKARG_SYSTEM_DISPLAY_ENABLE_FLAGS 값에 대한 포인터입니다. 이 멤버는 OS에서 예약됩니다.
[out] Width
지정된 디바이스의 표시 모드 너비(픽셀)입니다.
[out] Height
지정된 디바이스의 표시 모드 높이(픽셀)입니다.
[out] ColorFormat
표시 장치의 색 형식을 지정하는 D3DDDIFORMAT 값에 대한 포인터입니다.
반환 값
DxgkDdiSystemDisplayEnable 성공하면 STATUS_SUCCESS 반환합니다. TargetId 매개 변수로 지정된 대상이 디스플레이 디바이스에 연결되지 않은 경우 함수는 STATUS_NOT_SUPPORTED 반환합니다. 그렇지 않으면 Ntstatus.h정의된 오류 코드 중 하나를 반환합니다.
발언
OS는 시스템 중지 오류 후 버그 검사 작업 중에 DxgkddiSystemDisplayEnable 호출합니다.
KMD별 필수 단계
KMD는 DxgkDdiSystemDisplayEnable 함수가 호출될 때 다음 단계를 수행해야 합니다.
- 모든 GPU 작업을 취소하거나 GPU를 유휴 상태로 다시 설정합니다.
- OS는 TargetId 매개 변수를 통해 비디오가 있는 대상을 나타냅니다. 드라이버는 이 대상과 연결된 디스플레이를 켜고 표시해야 합니다. 드라이버가 디스플레이에 전원을 공급할 수 없는 경우 이 함수에 대한 호출에 실패해야 합니다. 이러한 오류 사례에서 OS는 DxgkDdiResetDevice 호출하여 시스템 버그 검사를 발생시킬 수 있습니다.
- 이 대상과 연결된 디스플레이의 연결을 확인합니다. 대상에 연결된 디스플레이가 없는 경우 드라이버는 이 함수에 대한 호출을 완료하고 STATUS_NOT_SUPPORTED 오류 코드를 반환해야 합니다.
- 디스플레이 어댑터에 연결된 다른 모든 디스플레이에 신호를 사용하지 않도록 설정합니다. 이것이 가능하지 않은 경우 드라이버는 다른 모든 디스플레이에 빈 이미지를 배치하려고 시도해야 합니다. 이 작업을 수행할 수 없는 경우 드라이버는 화면의 마지막 이미지를 변경하지 않고 그대로 두어야 합니다.
- 표시된 대상에 현재 표시 모드를 유지하고 이 함수 호출의 일부로 이 모드를 OS에 다시 제공합니다.
- 드라이버가 현재 표시 모드를 유지할 수 없거나 대상이 활성 토폴로지의 일부가 아닌 경우 드라이버는 픽셀당 24비트 형식으로 최소 640 x 480픽셀의 디스플레이 해상도가 가능한 다른 대상에 프레임 버퍼를 설정하려고 시도해야 합니다. 이것이 가능하지 않으면 드라이버가 이 함수 호출에 실패할 수 있으므로 시스템 버그 검사 및 검은색 화면이 표시됩니다.
KMD는 선형 프레임 버퍼 모드를 사용할 필요가 없습니다. 그러나 KMD는 D3DDDIFORMAT 열거형의 D3DDDIFMT_A8R8G8B8 형식이 있는 원본에서 이 프레임 버퍼에 대한 쓰기 작업을 지원해야 합니다.
원본 이미지 제한
KMD가 OS에 디스플레이 기능을 제어한 후 OS는 DxgkDdiSystemDisplayWrite 함수를 호출하여 화면 이미지를 업데이트하고 지정된 원본의 이미지 블록을 DxgkDdiSystemDisplayEnable 함수에 의해 다시 설정된 화면에 쓸 수 있습니다.
DxgkDdiSystemDisplayWrite 드라이버에 원본 이미지의 시작 주소와 보폭, 너비 및 높이를 제공합니다. 원본 이미지의 색 형식은 항상 D3DDDIFMT_X8R8G8B8. OS는 원본 이미지가 페이징되지 않은 메모리에 있음을 보장합니다.
KMD는 DxgkDdiSystemDisplayWrite 함수의 PositionX 및 PositionY 매개 변수로 지정된 위치에서 시작하여 현재 화면에 이 원본 이미지를 작성해야 합니다.
GPU가 알 수 없는 상태에 있는 인스턴스를 반복된
페이징이 아닌 메모리 사용
이 함수가 호출되는 동안에는 Windows 커널 모드 함수를 사용할 수 없습니다.
DxgkDdiSystemDisplayEnable 모든 IRQL에서 호출할 수 있으므로 페이지를 매길 수 없는 메모리에 있어야 합니다. DxgkDdiSystemDisplayEnable 페이징 가능한 메모리에 있는 코드를 호출해서는 안 되며 페이징 가능한 메모리에 있는 데이터를 조작해서는 안 됩니다.
자동 디스플레이 전환
자동 디스플레이 스위치 드라이버의 DxgkDdiSystemDisplayEnable DDI는 호출이 끝날 때 PSR(패널 자체 새로 고침)을 사용하지 않도록 설정해야 합니다. 자세한 내용은 자동 디스플레이 스위치
요구 사항
요구 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 8(WDDM 1.2) |
지원되는 최소 서버 | Windows Server 2012 |
대상 플랫폼 | 바탕 화면 |
헤더 | dispmprt.h |
IRQL |
모든 수준(설명 섹션 참조) |
참고 항목
DxgkCbAcquirePostDisplayOwnership