다음을 통해 공유


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 함수가 호출된 후 운영 체제는 해당 버퍼가 렌더링되기 전에 시나리오 변경이 발생하지 않도록 보장합니다.

드라이버에서 다음 추상화가 지원되는 한 디스플레이 미니포트 드라이버는 이전 시나리오의 세부 사항을 인식할 필요가 없습니다.

  • 비디오 메모리 원본에서 기본 비디오 또는 시스템 메모리 대상으로의 복사 작업, 화면 외 시스템 메모리 원본에서 기본 대상으로의 복사본, 기본 원본에서 기본으로의 복사본 또는 오프스크림 시스템 메모리 대상으로의 복사본에서 원본은 pAllocationList[DXGK_PRESENT_SOURCE_INDEX] pAllocationList[DXGK_PRESENT_SOURCE_INDEX] 배열 요소 DXGKARG_PRESENThDeviceSpecificAllocation 멤버에 의해 지정됩니다. DxgkDdiPresent가 가리키는 매개 변수입니다. 디바이스의 현재 기본 또는 오프스크림 시스템 메모리 할당인 대상은 DXGKARG_PRESENT pAllocationList[DXGK_PRESENT_DESTINATION_INDEX] 배열 요소의 hDeviceSpecificAllocation 멤버에 의해 지정됩니다. 대상이 원본(즉, destination == source)과 같으면 복사 작업은 화면 대 화면 비트 블록 전송(bitblt)입니다. 따라서 그래픽 하위 시스템은 원본 및 대상을 다음 값으로 설정합니다.
    • 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 형식입니다. 그러나 기본 형식이 Palettized RGB인 경우 Color 에는 색상표 인덱스가 포함됩니다. 따라서 그래픽 하위 시스템은 원본 및 대상을 다음 값으로 설정합니다.
    • destination != NULL (즉, destination == nonNULL)
    • source == NULL
모든 DxgkDdiPresent 시나리오가 올바르게 작동하려면 디스플레이 미니포트 드라이버의 DxgkDdiCreateDevice 함수는 DXGK_DEVICEINFO 구조체의 DmaBufferSize 멤버를 디스플레이 또는 오프스크린 대상에 하나 이상의 RECT 사각형을 표시하는 데 필요한 하드웨어 명령을 보유할 수 있을 만큼 크게 설정해야 합니다. 그러나 드라이버의 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 버퍼를 제대로 생성하기 위해 사전 패치 정보를 사용해야 합니다. pAllocationListDXGKARG_PRESENT 배열의 N번째 요소에 대한 SegmentId 멤버가 0이 아닌 경우 요소 N에 대해 사전 패치된 정보가 제공됩니다.

참고 드라이버의 DxgkDdiPresent 함수가 DMA 버퍼를 사전 패치하더라도 드라이버는 pPatchLocationListOut 멤버가 지정하는 출력 패치 위치 목록에 할당에 대한 모든 참조를 삽입해야 DXGKARG_PRESENT . DMA 버퍼가 GPU에 제출되기 전에 할당 주소가 변경될 수 있으므로 드라이버는 이러한 참조를 삽입해야 합니다. 따라서 DirectX 그래픽 커널 하위 시스템은 DxgkDdiPatch 함수를 호출하여 DMA 버퍼를 다시 일치합니다.
 
드라이버가 회전을 지원하는 경우(즉, 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로 설정된 pDmaBuffer 멤버를 DXGKARG_PRESENT 사용하여 호출됩니다. MMIO 기반 대칭 이동에는 GPU에서 DMA 버퍼를 실행할 필요가 없기 때문입니다. 대신 드라이버의 DxgkDdiPresent 함수는 필요에 따라 원본 표면 및 프로그램 대칭 이동 하드웨어의 유효성을 검사해야 합니다. DirectX 그래픽 커널 하위 시스템은 드라이버의 DxgkDdiSetVidPnSourceAddress 함수를 호출하여 이러한 유형의 대칭 이동을 실행합니다.

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

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Vista
대상 플랫폼 데스크톱
머리글 d3dkmddi.h
IRQL PASSIVE_LEVEL

추가 정보

D3DDDIFORMAT

DXGKARG_CREATECONTEXT

DXGKARG_PRESENT

DXGK_DEVICEINFO

DXGK_DRIVERCAPS

DXGK_PRESENTFLAGS

DxgkDdiCommitVidPn

DxgkDdiCreateContext

DxgkDdiCreateDevice

DxgkDdiEnumVidPnCofuncModality

DxgkDdiPatch

DxgkDdiQueryAdapterInfo