DXGKDDI_PRESENT 콜백 함수(d3dkmddi.h)

DxgkDdiPresent 함수는 원본 할당의 콘텐츠를 기본 화면(때로는 화면 외 시스템 메모리 할당)으로 복사합니다.

구문

DXGKDDI_PRESENT DxgkddiPresent;

NTSTATUS DxgkddiPresent(
  [in]     IN_CONST_HANDLE hContext,
  [in/out] INOUT_PDXGKARG_PRESENT pPresent
)
{...}

매개 변수

[in] hContext

복사 정보에 대한 디바이스 컨텍스트에 대한 핸들입니다. 디스플레이 미니포트 드라이버의 DxgkDdiCreateContext 함수는 이전에 DxgkDdiCreateContextpCreateContext 매개 변수가 가리키는 DXGKARG_CREATECONTEXT 구조체의 hContext 멤버에서 이 핸들을 반환했습니다.

드라이버가 컨텍스트 생성을 지원하지 않는 경우 Microsoft DirectX 그래픽 커널 하위 시스템은 컨텍스트에 대한 핸들을 디바이스에 대한 핸들로 바꿉니다. 디스플레이 미니포트 드라이버의 DxgkDdiCreateDevice 함수는 이전에 DxgkDdiCreateDevicepCreateDevice 매개 변수가 가리키는 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 작업을 클리핑할 수 있습니다.
이전 시나리오는 비동기적으로 변경될 수 있으므로 사용자 모드 표시 드라이버는 디스플레이 미니포트 드라이버의 DxgkDdiPresent 함수에 대한 하드웨어 지침을 미리 컴파일할 수 없습니다. 디스플레이 미니포트 드라이버는 실제 DxgkDdiPresent 작업에 대한 하드웨어 명령을 만들어야 하며 출력 DMA 버퍼에 배치해야 합니다. DMA 버퍼를 생성하기 위해 디스플레이 미니포트 드라이버의 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
모든 DxgkDdiPresent 시나리오가 올바르게 작동하려면 디스플레이 미니포트 드라이버의 DxgkDdiCreateDevice 함수는 디스플레이 또는 오프스크린 대상에 하나 이상의 RECT 직사각형을 표시하는 데 필요한 하드웨어 명령을 보유할 수 있을 만큼 DXGK_DEVICEINFO 구조체의 DmaBufferSize 멤버를 충분히 크게 설정해야 합니다. 그러나 드라이버의 DxgkDdiPresent 함수는 DxgkDdiPresent 시나리오의 하위 사각형 수가 현재 DMA 버퍼를 고갈시키고 드라이버가 다른 DMA 버퍼를 계속해야 하는 경우 STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER 반환할 수 있습니다.

그런 다음 그래픽 하위 시스템은 새 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에 대해 미리 패치된 정보가 제공됩니다.

참고 드라이버의 DxgkDdiPresent 함수가 DMA 버퍼를 미리 패치하더라도 드라이버는 여전히 할당에 대한 모든 참조를 pPatchLocationListOut 멤버가 지정하는 출력 패치 위치 목록에 삽입해야 DXGKARG_PRESENT . DMA 버퍼가 GPU에 제출되기 전에 할당 주소가 변경될 수 있으므로 드라이버에서 이러한 참조를 삽입해야 합니다. 따라서 DirectX 그래픽 커널 하위 시스템은 DMA 버퍼를 다시 일치하도록 DxgkDdiPatch 함수를 호출합니다.
드라이버가 회전을 지원하는 경우(즉, DxgkDdiEnumVidPnCofuncModality 함수에 대한 호출에서 D3DKMDT_VIDPN_PRESENT_PATH_TRANSFORMATION 구조체의 RotationSupport 멤버에서 회전 모드에 대한 지원을 보고하는 경우) 드라이버는 원본에서 대상으로 회전된 비트 블록 전송(비트블렛)을 수행할 수 있어야 합니다. DXGKARG_PRESENT Flags 멤버에 대한 DXGK_PRESENTFLAGS 구조에 회전 비트 필드 플래그를 지정하면 드라이버는 회전하지 않는 표면에서 현재 소스의 최종 방향으로 가는 것처럼 회전을 적용해야 합니다.

원본의 기본 할당은 DxgkDdiCommitVidPn 함수에 지정됩니다. 지정된 원본(복제 모드)에서 여러 경로가 시작되는 경우 디스플레이 미니포트 드라이버는 다른 대상에 대한 경로 회전 모드를 고려할 때 출력이 올바르게 회전되는지 확인해야 합니다. DxgkDdiPresent에 제공되는 모든 매개 변수는 회전에 구애받지 않습니다. 원본 및 대상 사각형은 모두 클라이언트가 인식할 때 전체 화면일 수 있습니다(예: 768 x 1024).

참고 이 상황은 회전 모드에서 전체 화면 Direct3D 애플리케이션을 해결하지 않습니다.
디스플레이 미니포트 드라이버가 이전에 표시된 경우 DxgkDdiQueryAdapterInfo 함수에 대한 호출에서 메모리 매핑된 I/O(MMIO) 기반 대칭 이동(DXGK_DRIVERCAPS 구조체의 FlipCaps 멤버에서 FlipOnVSyncMmIo 비트 필드 플래그를 TRUE로 설정)을 지원하는 경우 드라이버의 DxgkDdiPresent 함수는 이후에 nULL로 설정된 DXGKARG_PRESENT pDmaBuffer 멤버를 사용하여 호출됩니다. MMIO 기반 대칭 이동은 GPU에서 실행하기 위해 DMA 버퍼가 필요하지 않기 때문입니다. 대신 드라이버의 DxgkDdiPresent 함수는 필요에 따라 원본 표면 및 프로그램 대칭 이동 하드웨어의 유효성을 검사해야 합니다. DirectX 그래픽 커널 하위 시스템은 드라이버의 DxgkDdiSetVidPnSourceAddress 함수를 호출하여 이러한 유형의 대칭을 실행합니다.

DxgkDdiPresent를 페이징 가능으로 만들어야 합니다.

요구 사항

   
지원되는 최소 클라이언트 Windows Vista 이상 버전의 Windows 운영 체제에서 사용할 수 있습니다.
대상 플랫폼 데스크톱
헤더 d3dkmddi.h
IRQL PASSIVE_LEVEL

참고 항목

D3DDDIFORMAT

DXGKARG_CREATECONTEXT

DXGKARG_PRESENT

DXGK_DEVICEINFO

DXGK_DRIVERCAPS

DXGK_PRESENTFLAGS

DxgkDdiCommitVidPn

DxgkDdiCreateContext

DxgkDdiCreateDevice

DxgkDdiEnumVidPnCofuncModality

DxgkDdiPatch

DxgkDdiQueryAdapterInfo