DXGKDDI_PRESENT 콜백 함수(d3dkmddi.h)
DxgkDdiPresent 함수는 원본 할당의 콘텐츠를 기본 화면(때로는 화면 외 시스템 메모리 할당)으로 복사합니다.
구문
DXGKDDI_PRESENT DxgkddiPresent;
NTSTATUS DxgkddiPresent(
[in] IN_CONST_HANDLE hContext,
[in/out] INOUT_PDXGKARG_PRESENT pPresent
)
{...}
매개 변수
[in] hContext
복사 정보에 대한 디바이스 컨텍스트에 대한 핸들입니다. 디스플레이 미니포트 드라이버의 DxgkDdiCreateContext 함수는 이전에 DxgkDdiCreateContext의 pCreateContext 매개 변수가 가리키는 DXGKARG_CREATECONTEXT 구조체의 hContext 멤버에서 이 핸들을 반환했습니다.
드라이버가 컨텍스트 생성을 지원하지 않는 경우 Microsoft DirectX 그래픽 커널 하위 시스템은 컨텍스트에 대한 핸들을 디바이스에 대한 핸들로 바꿉니다. 디스플레이 미니포트 드라이버의 DxgkDdiCreateDevice 함수는 이전에 DxgkDdiCreateDevice의 pCreateDevice 매개 변수가 가리키는 DXGKARG_CREATEDEVICE 구조체의 hDevice 멤버에서 디바이스 핸들을 반환했습니다.
[in/out] pPresent
복사 작업에 대한 정보를 포함하는 DXGKARG_PRESENT 구조체에 대한 포인터입니다.
반환 값
DxgkDdiPresent는 다음 값 중 하나를 반환합니다.
| 반환 코드 | 설명 |
|---|---|
| STATUS_SUCCESS | DxgkDdiPresent가 콘텐츠를 성공적으로 복사했습니다. |
| STATUS_NO_MEMORY 또는 STATUS_INSUFFICIENT_RESOURCES | DxgkDdiPresent가 완료하는 데 필요한 메모리를 할당할 수 없습니다. |
| STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER | 현재 DMA(직접 메모리 액세스) 버퍼가 고갈되었습니다. |
| STATUS_GRAPHICS_CANNOTCOLORCONVERT | 디스플레이 미니포트 드라이버는 디바이스에서 수행할 수 없는 색 변환을 위해 비트 블록 전송(비트블렛)을 감지했습니다. Microsoft Direct3D 런타임은 애플리케이션이 계속되지 않도록 방지하고 애플리케이션에서 콘텐츠를 복사하는 데 실패합니다. |
| STATUS_PRIVILEGED_INSTRUCTION | DxgkDdiPresent는 권한 없는 명령(즉, 현재 중앙 처리 장치 [CPU] 프로세스의 권한 이상으로 메모리에 액세스하는 지침)을 검색했습니다. |
| STATUS_ILLEGAL_INSTRUCTION | DxgkDdiPresent는 그래픽 하드웨어에서 지원할 수 없는 지침을 검색했습니다. |
| STATUS_INVALID_HANDLE | DxgkDdiPresent가 명령 버퍼에서 잘못된 핸들을 검색했습니다. |
| STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE | 디스플레이 미니포트 드라이버가 DMA 스트림에서 오류를 감지했습니다. 드라이버가 이 오류 코드를 반환하면 그래픽 컨텍스트 디바이스가 손실된 상태로 배치됩니다. |
설명
DirectX 그래픽 커널 하위 시스템은 디스플레이 미니포트 드라이버의 DxgkDdiPresent 함수를 호출하여 일반적으로 원본 할당에서 기본 화면으로 콘텐츠를 복사합니다. (이 함수는 화면 외 시스템 메모리 할당에 콘텐츠를 복사할 수도 있습니다.) 기본 표면이 느슨하게 정의되므로 다음 시나리오에 대해 DxgkDdiPresent 를 구현할 수 있습니다.
- 창의 위치에 따라 DxgkDdiPresent 함수는 동일한 어댑터 또는 다른 어댑터에 있을 수 있는 여러 주 복제본에서 수행해야 합니다.
- 주 서버는 원격 모니터에 있으며 터미널 서비스 클라이언트 또는 Microsoft NetMeeting을 통해 액세스됩니다.
- 최근에 모드 전환이 발생했으며 기본 형식이 원본 형식과 다르므로 색 변환이 필요합니다. 또한 창 클리핑 및 순서 지정으로 인해 DxgkDdiPresent 작업을 클리핑할 수 있습니다.
드라이버에서 다음 추상화가 지원되는 한 디스플레이 미니포트 드라이버는 이전 시나리오의 세부 사항을 인식할 필요가 없습니다.
- 비디오 메모리 원본에서 기본 비디오 또는 시스템 메모리 대상으로 복사 작업, 화면 외 시스템 메모리 원본에서 기본 대상으로 복사, 기본 원본에서 기본 원본으로의 복사본 또는 화면 외 시스템 메모리 대상으로의 복사본에서 원본은 pPreent인 DXGKARG_PRESENT 구조의 pAllocationList[DXGK_PRESENT_SOURCE_INDEX] 배열 요소의 hDeviceSpecificAllocation 멤버에 의해 지정됩니다. DxgkDdiPresent가 가리키는 매개 변수입니다. 디바이스의 현재 기본 또는 오프스크림 시스템 메모리 할당인 대상은 DXGKARG_PRESENT pAllocationList[DXGK_PRESENT_DESTINATION_INDEX] 배열 요소의 hDeviceSpecificAllocation 멤버에 의해 지정됩니다. 대상이 원본(즉, destination == source)과 같으면 복사 작업은 화면 대 화면 비트 블록 전송(비트블렛)입니다. 따라서 그래픽 하위 시스템은 원본 및 대상을 다음 값으로 설정합니다.
- destination != NULL (즉, destination == nonNULL)
- source != NULL (즉, source == nonNULL)
- 현재 할당에서 다른 할당으로 이동하는 비디오 메모리에서 원본을 운영 체제에서 지정하고 DXGKARG_PRESENT pAllocationList[DXGK_PRESENT_SOURCE_INDEX] 배열 요소의 hDeviceSpecificAllocation 멤버에 설정할 수 있습니다. 그래픽 하위 시스템은 원본 및 대상을 다음 값으로 설정합니다.
- destination == NULL
- source != NULL (즉, source == nonNULL)
참고 no-op 대칭 이동은 현재 검사된 할당과 동일한 원본 할당에서 수행할 수 있습니다. no-op 대칭 이동은 렌더링 스트림에서 세로 공백에 대한 대기 대기를 삽입하는 데 사용됩니다. 디스플레이 미니포트 드라이버는 다른 할당으로 대칭 이동하는 것처럼 하드웨어 대칭 이동 명령을 삽입해야 합니다. - 기본 화면에 대한 색 채우기 작업에서는 원본 할당이 필요하지 않으며 대상은 DXGKARG_PRESENT pAllocationList[DXGK_PRESENT_DESTINATION_INDEX] 배열 요소의 hDeviceSpecificAllocation 멤버에 의해 지정된 기본 할당 핸들입니다. DXGKARG_PRESENT Color 멤버는 일반적으로 D3DDDIFORMAT 열거형 형식의 D3DDDIFMT_A8R8G8B8 형식입니다. 그러나 기본 형식이 팔레트 RGB인 경우 Color 에는 색상표 인덱스가 포함됩니다. 따라서 그래픽 하위 시스템은 원본 및 대상을 다음 값으로 설정합니다.
- destination != NULL (즉, destination == nonNULL)
- source == NULL
그런 다음 그래픽 하위 시스템은 새 DMA 버퍼를 획득하고 이전 DxgkDdiPresent 호출과 동일한 RECT 구조 목록을 사용하여 드라이버의 DxgkDdiPresent 함수를 다시 호출합니다. 드라이버는 pPresent가 가리키는 DXGKARG_PRESENT 구조체의 MultipassOffset 멤버를 사용하여 DxgkDdiPresent에 대한 이전 호출에서 RECT 목록을 완료할 때 수행된 진행률을 기록하여 드라이버가 새 DMA 버퍼로 중지된 위치에서 계속할 수 있도록 해야 합니다. 드라이버의 DxgkDdiPresent 함수가 RECT 구조 목록을 완료하면 STATUS_SUCCESS 반환합니다.
DMA 버퍼를 생성하는 것 외에도 디스플레이 미니포트 드라이버는 할당에 대한 실제 주소가 알려질 때 나중에 패치해야 하는 DMA 버퍼 내의 다양한 오프셋을 나타내는 패치 위치 목록을 생성해야 합니다. 경우에 따라 비디오 메모리 관리자는 할당 목록에서 미리 패치된 정보(즉, 원본 및 대상에 대한 마지막으로 알고 있는 실제 주소)를 드라이버에 제공합니다.
비디오 메모리 관리자가 이 정보를 제공하는 경우 드라이버는 이러한 물리적 주소가 DirectX 그래픽 커널 하위 시스템에서 제공하는 최종 주소인지 확인하여 DMA 버퍼를 생성해야 합니다. 그래픽 하위 시스템은 나중에 다시 패치하기 위해 DMA 버퍼에서 DxgkDdiPatch 함수를 호출하지 않을 수 있습니다. 따라서 드라이버는 사전 패치 정보를 사용하여 DMA 버퍼를 제대로 생성해야 합니다. pAllocationList 배열의 Nth 요소에 대한 SegmentId 멤버가 0이 아닌 DXGKARG_PRESENT 경우 요소 N에 대해 미리 패치된 정보가 제공됩니다.
원본의 기본 할당은 DxgkDdiCommitVidPn 함수에 지정됩니다. 지정된 원본(복제 모드)에서 여러 경로가 시작되는 경우 디스플레이 미니포트 드라이버는 다른 대상에 대한 경로 회전 모드를 고려할 때 출력이 올바르게 회전되는지 확인해야 합니다. DxgkDdiPresent에 제공되는 모든 매개 변수는 회전에 구애받지 않습니다. 원본 및 대상 사각형은 모두 클라이언트가 인식할 때 전체 화면일 수 있습니다(예: 768 x 1024).
DxgkDdiPresent를 페이징 가능으로 만들어야 합니다.
요구 사항
| 지원되는 최소 클라이언트 | Windows Vista 이상 버전의 Windows 운영 체제에서 사용할 수 있습니다. |
| 대상 플랫폼 | 데스크톱 |
| 헤더 | d3dkmddi.h |
| IRQL | PASSIVE_LEVEL |
참고 항목
DXGKARG_PRESENT
피드백
다음에 대한 사용자 의견 제출 및 보기