다음을 통해 공유


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의 DxgkDdiAddDevice 함수는 이전에 Dxgkrnl이 핸들을 제공했습니다.

[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 함수가 호출될 때 다음 단계를 수행해야 합니다.

  1. 모든 GPU 작업을 취소하거나 GPU를 유휴 상태로 다시 설정합니다.
  2. OS는 TargetId 매개 변수를 통해 비디오가 있는 대상을 나타냅니다. 드라이버는 이 대상과 연결된 디스플레이를 켜고 표시해야 합니다. 드라이버가 디스플레이에 전원을 공급할 수 없는 경우 이 함수에 대한 호출에 실패해야 합니다. 이러한 오류 사례에서 OS는 DxgkDdiResetDevice 호출하여 시스템 버그 검사를 발생시킬 수 있습니다.
  3. 이 대상과 연결된 디스플레이의 연결을 확인합니다. 대상에 연결된 디스플레이가 없는 경우 드라이버는 이 함수에 대한 호출을 완료하고 STATUS_NOT_SUPPORTED 오류 코드를 반환해야 합니다.
  4. 디스플레이 어댑터에 연결된 다른 모든 디스플레이에 신호를 사용하지 않도록 설정합니다. 이것이 가능하지 않은 경우 드라이버는 다른 모든 디스플레이에 빈 이미지를 배치하려고 시도해야 합니다. 이 작업을 수행할 수 없는 경우 드라이버는 화면의 마지막 이미지를 변경하지 않고 그대로 두어야 합니다.
  5. 표시된 대상에 현재 표시 모드를 유지하고 이 함수 호출의 일부로 이 모드를 OS에 다시 제공합니다.
  6. 드라이버가 현재 표시 모드를 유지할 수 없거나 대상이 활성 토폴로지의 일부가 아닌 경우 드라이버는 픽셀당 24비트 형식으로 최소 640 x 480픽셀의 디스플레이 해상도가 가능한 다른 대상에 프레임 버퍼를 설정하려고 시도해야 합니다. 이것이 가능하지 않으면 드라이버가 이 함수 호출에 실패할 수 있으므로 시스템 버그 검사 및 검은색 화면이 표시됩니다.

KMD는 선형 프레임 버퍼 모드를 사용할 필요가 없습니다. 그러나 KMD는 D3DDDIFORMAT 열거형의 D3DDDIFMT_A8R8G8B8 형식이 있는 원본에서 이 프레임 버퍼에 대한 쓰기 작업을 지원해야 합니다.

원본 이미지 제한

KMD가 OS에 디스플레이 기능을 제어한 후 OS는 DxgkDdiSystemDisplayWrite 함수를 호출하여 화면 이미지를 업데이트하고 지정된 원본의 이미지 블록을 DxgkDdiSystemDisplayEnable 함수에 의해 다시 설정된 화면에 쓸 수 있습니다.

DxgkDdiSystemDisplayWrite 드라이버에 원본 이미지의 시작 주소와 보폭, 너비 및 높이를 제공합니다. 원본 이미지의 색 형식은 항상 D3DDDIFMT_X8R8G8B8. OS는 원본 이미지가 페이징되지 않은 메모리에 있음을 보장합니다.

KMD는 DxgkDdiSystemDisplayWrite 함수의 PositionXPositionY 매개 변수로 지정된 위치에서 시작하여 현재 화면에 이 원본 이미지를 작성해야 합니다.

GPU가 알 수 없는 상태에 있는 인스턴스를 반복된 TDR(시간 제한 검색 및 복구)으로 인해 시스템 버그 검사가 발생할 수 있으므로 드라이버가 CPU를 사용하여 원본의 이미지를 프레임 버퍼에 쓰는 것이 좋습니다.

페이징이 아닌 메모리 사용

이 함수가 호출되는 동안에는 Windows 커널 모드 함수를 사용할 수 없습니다.

DxgkDdiSystemDisplayEnable 모든 IRQL에서 호출할 수 있으므로 페이지를 매길 수 없는 메모리에 있어야 합니다. DxgkDdiSystemDisplayEnable 페이징 가능한 메모리에 있는 코드를 호출해서는 안 되며 페이징 가능한 메모리에 있는 데이터를 조작해서는 안 됩니다.

자동 디스플레이 전환

자동 디스플레이 스위치 드라이버의 DxgkDdiSystemDisplayEnable DDI는 호출이 끝날 때 PSR(패널 자체 새로 고침)을 사용하지 않도록 설정해야 합니다. 자세한 내용은 자동 디스플레이 스위치참조하세요.

요구 사항

요구
지원되는 최소 클라이언트 Windows 8(WDDM 1.2)
지원되는 최소 서버 Windows Server 2012
대상 플랫폼 바탕 화면
헤더 dispmprt.h
IRQL 모든 수준(설명 섹션 참조)

참고 항목

D3DDDIFORMAT

DxgkCbAcquirePostDisplayOwnership

DxgkDdiAddDevice

DxgkDdiCommitVidPn

DxgkDdiResetDevice

DxgkDdiStopDeviceAndReleasePostDisplayOwnership

DxgkDdiSystemDisplayWrite