D3DKMTPresent 함수(d3dkmthk.h)

D3DKMTPresent 함수는 현재 명령을 Microsoft DirectX 그래픽 커널 하위 시스템(Dxgkrnl.sys)에 제출합니다.

구문

NTSTATUS D3DKMTPresent(
  [in] D3DKMT_PRESENT *unnamedParam1
);

매개 변수

[in] unnamedParam1

pData: 표시를 위한 매개 변수를 설명하는 D3DKMT_PRESENT 구조체에 대한 포인터입니다.

반환 값

D3DKMTPresent 는 다음 값 중 하나와 같은 NTSTATUS 값을 반환합니다.

반환 코드 설명
STATUS_SUCCESS 현재가 성공적으로 수행되었습니다.
STATUS_DEVICE_REMOVED 그래픽 어댑터가 중지되었거나 디스플레이 컨텍스트가 다시 설정되었습니다.
STATUS_INVALID_PARAMETER 매개 변수의 유효성이 검사되었고 잘못된 것으로 확인되었습니다.
STATUS_NO_MEMORY 메모리가 부족하여 D3DKMTPresent를 완료할 수 없습니다.
STATUS_GRAPHICS_ALLOCATION_INVALID 디스플레이 모드 변경으로 인해 기본 표면 핸들이 무효화되었습니다. OpenGL 설치 가능 클라이언트 드라이버(ICD)가 이 오류 코드를 수신하는 경우 기본 핸들을 다시 열거나 다시 만들고 명령 버퍼의 모든 참조를 이전 핸들로 바꾼 다음 버퍼를 다시 제출해야 합니다.
STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE D3DKMT_PRESENThContext 멤버가 지정하는 렌더링 디바이스 컨텍스트에서 오류가 발생했습니다.

참고

STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE 오류 코드는 TDR(시간 제한 검색 및 복구) 프로세스의 시작 또는 GPU가 응답을 중지했음을 나타내지 않습니다. 예를 들어 디스플레이 미니포트 드라이버가 이 디바이스에서 제출된 DMA 버퍼에 오류가 발생했음을 나타내거나 비디오 메모리 관리자가 DMA 버퍼를 분할한 후에도 DMA 버퍼에 필요한 모든 할당을 페이지 인할 수 없는 경우 DirectX 그래픽 커널 하위 시스템은 디바이스를 오류 상태로 만듭니다. 디바이스가 오류 상태에 있으면 더 이상 작업을 수행할 수 없으며 제거한 후 다시 만들어야 합니다. ICD는 D3DKMTGetDeviceState 함수를 호출하여 오류에 대한 보다 정확한 이유를 확인할 수 있습니다.

설명

D3DKMTPresent 함수는 매개 변수 값의 조합(즉, pData가 가리키는 D3DKMT_PRESENT 구조체의 멤버에 있는 값)의 조합에 따라 STATUS_INVALID_PARAMETER 반환할 수 있습니다. 다음 목록에서는 D3DKMTPresent 가 STATUS_INVALID PARAMETER를 반환할 수 있는 매개 변수 값의 가장 일반적인 조합을 설명합니다.

  • hDestination 멤버는 NULL이 아니고 다음 조건 중 하나 이상이 true입니다.

    • pSrcSubRects 멤버가 NULL입니다.
    • SubRectCnt 멤버는 0입니다.
    • Flags 멤버의 Blt 비트 필드 플래그가 설정되지 않았습니다.
    • FlagsSrcRectValid 비트 필드 플래그가 설정되지 않았습니다.
    • FlagsColorFill 비트 필드 플래그가 설정됩니다.
    • FlagsFlip, FlipDoNotFlip, FlipDoNotWait 또는 FlipRestart 비트 필드 플래그가 설정됩니다.
    • 플래그SrcColorKey 또는 DstColorKey 비트 필드 플래그가 설정됩니다.
    • hSource 멤버는 hDestination과 같습니다.
    • 원본 및 대상은 기본 표면이 아닙니다.
  • FlagsFlip 비트 필드 플래그가 설정되고 다음 조건 중 하나 이상이 true입니다.

    • FlagsColorFill 비트 필드 플래그가 설정됩니다.
    • 플래그Blt 비트 필드 플래그가 설정됩니다.
    • 플래그SrcColorKey 또는 DstColorKey 비트 필드 플래그가 설정됩니다.
    • 플래그SrcRectValid 또는 DstRectValid 비트 필드 플래그가 설정됩니다.
    • 플래그의 회전 비트 필드 플래그가 설정됩니다.
    • FlagsRestrictVidPnSource 비트 필드 플래그가 설정됩니다.
    • 원본이 기본 표면이 아닙니다.
    • 디스플레이 미니포트 드라이버는 FlipInterval 멤버가 지정하는 대칭 이동 간격을 지원하지 않습니다.
    • D3DKMTSetDisplayMode 함수는 이전에 호출되지 않았습니다.
  • FlagsColorFill 비트 필드 플래그가 설정되고 다음 조건 중 하나가 true입니다.

    • pSrcSubRectsNULL입니다.
    • SubRectCnt 는 0입니다.
    • 플래그Blt 비트 필드 플래그가 설정됩니다.
    • FlagsFlip, FlipDoNotFlip, FlipDoNotWait 또는 FlipRestart 비트 필드 플래그가 설정됩니다.
    • 플래그SrcColorKey 또는 DstColorKey 비트 필드 플래그가 설정됩니다.
    • FlagsSrcRectValid 비트 필드 플래그가 설정됩니다.
  • FlagsBlt 비트 필드 플래그가 설정되고 다음 조건 중 하나가 true입니다.

    • pSrcSubRectsNULL입니다.
    • SubRectCnt 는 0입니다.
    • FlagsColorFill 비트 필드 플래그가 설정됩니다.
    • FlagsFlip, FlipDoNotFlip, FlipDoNotWait 또는 FlipRestart 비트 필드 플래그가 설정됩니다.

플래그Blt 비트 필드 플래그가 설정된 블릿 스타일에 대해 D3DKMTPresent를 호출하는 사용자 모드 그래픽 드라이버는 이전에 제출된 모든 작업이 제공된 컨텍스트에 완전히 드레이닝할 수 있도록 특별히 주의해야 합니다. 이렇게 하지 않으면 애플리케이션이 교착 상태가 발생하거나 일부 코너의 경우 현재 사용자 데스크톱이 교착 상태에 빠질 수 있습니다. 해당 신호가 GPU 스케줄러 데이터베이스에 이미 큐에 대기된 GPU 동기화 개체에 대한 대기만 포함되고 해당 신호 자체가 다른 드레인할 수 없는 대기 뒤에 있지 않은 경우 컨텍스트는 완전히 드레이닝할 수 있습니다. 즉, 시스템의 모든 프로세스의 사용자 공간이 D3DKMTPresent 호출 직후 일시 중지된 경우 GPU 스케줄러에 이미 큐에 대기 중인 종속 렌더링 체인이 렌더링을 마치면 대기가 충족됩니다. 드라이버는 GPU 대기에 종속된 컨텍스트에서 현재 충족되지 않으며 이 프로세스 또는 다른 프로세스에서 발생하는 일부 이후 작업에 만족할 것으로 예상되는 컨텍스트에서 블릿을 호출해서는 안 됩니다.

예제

다음 코드 예제에서는 OpenGL ICD가 D3DKMTPresent 를 사용하여 데이터를 표시하는 방법을 보여 줍니다.

HRESULT Present(D3DKMT_HANDLE hDevice, 
                HWND hWnd, 
                RECT* pSrcRect,
                 RECT* pDstRect)
{
    D3DKMT_PRESENT PresentData = {0};

    PresentData.hDevice = hDevice;
    PresentData.Flags.Blt = 
    PresentData.Flags.DstRectValid = 
    PresentData.Flags.SrcRectValid = TRUE;
    PresentData.hWindow = hWnd;
    PresentData.DstRect = *pDstRect;
    PresentData.SrcRect = *pSrcRect;
    PresentData.SubRectCnt = 1;  
    PresentData.pSrcSubRects = pSrcRect; 

    if (NT_SUCCESS((*pfnKTPresent)(&PresentData))) {
        return S_OK;
    }
    return E_FAIL;
}

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Vista
대상 플랫폼 유니버설
헤더 d3dkmthk.h(D3dkmthk.h 포함)
라이브러리 Gdi32.lib
DLL Gdi32.dll

추가 정보

D3DKMTGetDeviceState

D3DKMTSetDisplayMode

D3DKMT_PRESENT