다음을 통해 공유


DXGKDDI_SETVIDPNSOURCEADDRESS 콜백 함수(d3dkmddi.h)

DxgkDdiSetVidPnSourceAddress 함수는 특정 비디오 현재 원본과 연결된 기본 표면의 주소를 설정합니다.

구문

DXGKDDI_SETVIDPNSOURCEADDRESS DxgkddiSetvidpnsourceaddress;

NTSTATUS DxgkddiSetvidpnsourceaddress(
  IN_CONST_HANDLE hAdapter,
  IN_CONST_PDXGKARG_SETVIDPNSOURCEADDRESS pSetVidPnSourceAddress
)
{...}

매개 변수

hAdapter

디스플레이 어댑터와 연결된 컨텍스트 블록에 대한 핸들입니다. 디스플레이 미니포트 드라이버는 이전에 DxgkDdiAddDevice 함수의 MiniportDeviceContext 출력 매개 변수에서 DirectX 그래픽 커널 하위 시스템에 이 핸들을 제공했습니다.

pSetVidPnSourceAddress

함수 인수를 포함하는 DXGKARG_SETVIDPNSOURCEADDRESS 구조체에 대한 포인터입니다.

반환 값

DxgkDdiSetVidPnSourceAddress 는 성공하면 STATUS_SUCCESS 반환합니다. 그렇지 않으면 Ntstatus.h에 정의된 오류 코드 중 하나를 반환합니다.

Windows 8 시작해서 표시 미니포트 드라이버는 SharedPrimaryTransition 멤버가 pSetVidPnSourceAddress-Flags>에 설정된 경우 STATUS_INVALID_PARAMETER 반환하는 DxgkDdiSetVidPnSourceAddress 호출에 실패할 수 있습니다. 그러나 CheckDirectFlipSupport 함수의 사용자 모드 드라이버 구현 또는 DWM에 오류가 없는 한 이러한 오류가 예상되지 않습니다. 이러한 오류가 발생하면 운영 체제가 컴퍼지션 모드로 원활하게 장애 복구되지 않으며 프레젠테이션이 올바르지 않습니다.

설명

DxgkDdiSetVidPnSourceAddress 는 현재 커밋된 VidPN(비디오 현재 네트워크) 토폴로지와 일치하는 주 복제본에서만 호출됩니다. 예를 들어 D3DDDIFMT_A8R8G8B8 형식은 D3DDDIFMT_X8R8G8B8 형식으로 커밋된 VidPN과 일치하도록 결정되며 그 반대의 경우도 마찬가지입니다.

DirectX 그래픽 커널 하위 시스템은 DxgkDdiSetVidPnSourceAddress 를 호출하여 디스플레이 모드를 전환하고 MMIO(메모리 매핑 I/O) 기반 대칭 이동 작업을 수행합니다. pSetVidPnSourceAddress 매개 변수가 가리키는 DXGKARG_SETVIDPNSOURCEADDRESS 구조체의 Flags 멤버에 있는 비트 필드 플래그는 수행할 표시 작업의 유형을 나타냅니다. 디스플레이 모드를 전환하기 위해 그래픽 커널 하위 시스템은 DXGKARG_SETVIDPNSOURCEADDRESS ContextCount 멤버를 0으로 설정합니다. 이 경우 DXGKARG_SETVIDPNSOURCEADDRESS 컨텍스트 멤버가 지정하는 배열의 콘텐츠는 정의되지 않습니다. 대칭 이동 작업을 수행하기 위해 그래픽 커널 하위 시스템은 ContextCount 를 컨텍스트 수로 설정하고 Context 를 대칭 이동 작업에 기여하는 컨텍스트에 대한 드라이버 컨텍스트 핸들 배열로 설정합니다.

디스플레이 미니포트 드라이버가 이전에 표시된 경우 DxgkDdiQueryAdapterInfo 함수를 호출할 때 MMIO 기반 대칭 이동(DXGK_DRIVERCAPS 구조의 FlipCaps 멤버에서 FlipOnVSyncMmIo 비트 필드 플래그를 TRUE로 설정)을 지원하는 경우 드라이버의 DxgkDdiSetVidPnSourceAddress 함수는 이후에 대칭 이동 목적으로 디바이스 인터럽트 요청 수준(DIRQL)에서 호출됩니다. 드라이버의 DxgkDdiSetVidPnSourceAddress 함수는 DAC를 프로그래밍하고 다음 세로 동기화에서 주소가 DXGKARG_SETVIDPNSOURCEADDRESS PrimaryAddress 멤버에 지정된 기본 표면에서 검사를 시작해야 합니다. 또한 드라이버는 유효 검사 주소를 보고하기 위해 DxgkCbNotifyInterrupt 함수에 대한 호출에서 InterruptType 매개 변수의 DXGK_INTERRUPT_CRTC_VSYNC 인터럽트 형식을 전달해야 합니다. 드라이버는 DxgkCbNotifyDpc 함수를 호출하여 DxgkCbNotifyInterrupt 호출을 따라야 합니다.

DxgkDdiSetVidPnSourceAddress 는 페이징할 수 없는 메모리에 있어야 합니다. DxgkDdiSetVidPnSourceAddress 는 페이징 가능한 메모리에 있는 코드를 호출해서는 안 되며 페이징 가능한 메모리에 있는 데이터를 조작해서는 안 됩니다.

Clone-View 상황

복제 보기 상황에서 디스플레이 미니포트 드라이버는 이 섹션에 설명된 대로 대칭 이동 작업을 적절하게 처리해야 합니다.

DWM이 실행 중일 때 DirectX 그래픽 커널 하위 시스템은 수직 동기화가 발생할 때 대칭 이동 동기화됩니다. 그러나 DirectX 그래픽 커널 하위 시스템은 단일 그래픽 어댑터 출력 신호의 수직 동기화가 발생하는 경우에만 동기화할 수 있습니다. DirectX 그래픽 커널 하위 시스템은 찢어지는 것을 방지하기 위해 다른 그래픽 어댑터 출력 신호를 즉시 대칭 이동해야 합니다.

GPU 스케줄러는 단일 세로 동기화를 감지하고 첫 번째 모니터 대칭 이동이 발생하는 즉시 대칭 이동된 표면을 사용할 수 있는지 확인합니다. 따라서 디스플레이 미니포트 드라이버가 두 번째 모니터가 여전히 표시되는 표면으로 렌더링될 수 있습니다.

비디오 애플리케이션(예: Windows 미디어 플레이어)은 복제 보기 상황을 인식하지 못하며 예측 가능한 수직 동기화 간격이 있을 것으로 예상합니다. GPU 스케줄러가 두 모니터의 수직 동기화를 감지한 경우 수직 동기화 간격(따라서 대칭 이동)은 예측할 수 없으며 시간이 지남에 따라 드리프트되므로 DWM 및 비디오 애플리케이션이 제대로 작동하지 않습니다.

복제 보기 상황의 경우 디스플레이 미니포트 드라이버는 기본 모니터에서 수직 동기화 대칭 이동 및 보조 모니터에서 MMIO 기반 즉시 대칭 이동을 수행해야 합니다.

디스플레이 미니포트 드라이버의 DxgkDdiSetVidPnSourceAddress 함수는 그래픽 어댑터 개체에서 대칭 이동되는 주소를 기록해야 합니다.

디스플레이 미니포트 드라이버가 보조 모니터의 다음 세로 추적을 기다리지 않도록 지시하기 위해 DirectX 그래픽 커널 하위 시스템은 드라이버의 DxgkDdiSetVidPnSourceAddress 함수를 호출할 때 FlipImmediate 비트 필드 플래그를 TRUE로 설정합니다.

다중 평면 오버레이 VidPN 프레젠테이션에서 다중 평면 오버레이를 사용하여 이 함수를 호출하는 데 대한 요구 사항을 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Vista
머리글 d3dkmddi.h
IRQL PASSIVE_LEVEL. 드라이버가 MMIO 기반 대칭 이동을 지원하는 경우 DIRQL에서 호출됩니다.

추가 정보

DXGK_DRIVERCAPS

DXGKARG_SETVIDPNSOURCEADDRESS

DxgkCbNotifyDpc

DxgkCbNotifyInterrupt

DxgkDdiAddDevice

DxgkDdiSetVidPnSourceVisibility

DxgkDdiQueryAdapterInfo