D3DKMTRender 함수(d3dkmthk.h)

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

구문

NTSTATUS D3DKMTRender(
  D3DKMT_RENDER *unnamedParam1
);

매개 변수

unnamedParam1

pData [in, out]

현재 명령 버퍼를 그래픽 커널 하위 시스템에 제출하기 위한 매개 변수를 설명하는 D3DKMT_RENDER 구조체에 대한 포인터입니다.

반환 값

D3DKMTRender 는 다음 값 중 하나를 반환합니다.

반환 코드 설명
STATUS_SUCCESS 명령 버퍼가 성공적으로 제출되었습니다.
STATUS_DEVICE_REMOVED 그래픽 어댑터가 중지되었거나 디스플레이 컨텍스트가 다시 설정되었습니다.
STATUS_INVALID_PARAMETER 매개 변수의 유효성이 검사되었고 잘못된 것으로 확인되었습니다.
STATUS_NO_MEMORY 메모리가 부족하여 D3DKMTRender를 완료할 수 없습니다.
STATUS_INVALID_HANDLE OpenGL ICD가 명령 버퍼에서 잘못된 핸들을 검색했습니다.
STATUS_PRIVILEGED_INSTRUCTION D3DKMTRender 는 권한이 없는 명령(즉, 현재 CPU 프로세스의 권한을 초과하여 메모리에 액세스하는 명령)을 검색했습니다.

이 함수는 다른 NTSTATUS 값을 반환할 수도 있습니다.

설명

명령 버퍼에는 일반적으로 많은 그래픽 명령이 포함됩니다.

D3DKMTRenderSTATUS_GRAPHICS_ALLOCATION_INVALID 반환하는 경우 OpenGL ICD는 기본 핸들을 다시 열거나 다시 만들고 명령 버퍼의 모든 참조를 이전 핸들로 바꾼 다음 D3DKMTRender를 다시 호출하여 버퍼를 다시 제출해야 합니다.

D3DKMTRender를 호출한 후 OpenGL ICD는 pData 매개 변수가 가리키는 D3DKMT_RENDER 구조체의 pCommandBufferCommandBufferSize 멤버에 반환된 값에서 다음 제출에 사용해야 하는 명령 버퍼의 기본 주소와 크기를 결정해야 합니다.

보장된 DMA 버퍼 계약 모드를 사용하는 디바이스의 경우(이 모드에 대한 자세한 내용은 보장된 계약 DMA 버퍼 모델 사용 참조) 디스플레이 미니포트 드라이버에서 다음 제출 시 명령 버퍼를 변환하는 데 사용할 수 있는 DMA 버퍼의 크기는 명령 버퍼 자체의 크기와 동일합니다. 이러한 디바이스의 경우 OpenGL ICD는 D3DKMT_RENDER AllocationListSize 멤버에 반환된 값에서 다음 제출 시 명령 버퍼를 변환하는 동안 디스플레이 미니포트 드라이버에 사용할 수 있는 할당 목록의 크기도 결정해야 합니다.

보장된 DMA 버퍼 계약을 사용하지 않는 디바이스의 경우 OpenGL ICD는 CommandBufferSizeAllocationListSize 멤버에 반환된 정보를 사용하여 변환에 사용할 수 있는 다음 DMA 버퍼 및 할당 목록의 크기를 결정할 수 있습니다. 그러나 메모리가 부족한 상태에서 디스플레이 미니포트 드라이버에 제공되는 실제 DMA 버퍼 및 할당 목록은 필요 이상으로 작을 수 있습니다.

OpenGL ICD에서 명령 버퍼 플러시 대부분이 명령 버퍼 또는 할당 목록의 공간이 부족하여 명령 버퍼 플러시를 감지하는 경우 드라이버는 크기 조정을 요청할 수 있습니다. 명령 버퍼의 크기를 조정하기 위해 드라이버는 D3DKMT_RENDER Flags 멤버에서 ResizeCommandBuffer 비트 필드 플래그를 설정하고 요청된 크기를 D3DKMT_RENDER CommandBufferSize 멤버에 넣습니다. 마찬가지로 할당 목록의 크기를 조정하기 위해 드라이버는 D3DKMT_RENDER Flags 멤버에서 ResizeAllocationList 비트 필드 플래그를 설정하고 요청된 수의 요소를 D3DKMT_RENDER AllocationListSize 멤버에 넣습니다.

참고

드라이버가 명령 버퍼와 할당 목록 모두의 크기 조정을 요청할 수 있지만 비디오 메모리 관리자가 이를 준수하지 못할 수 있습니다. 따라서 D3DKMTRender 호출에 성공하면 드라이버는 pCommandBuffer, CommandBufferSizeAllocationListSize 멤버에 반환되는 값을 확인해야 합니다.
그러나 D3DKMTRender 에 대한 호출이 실패하면 드라이버는 명령 버퍼, 할당 목록 또는 둘 다 크기가 조정되지 않았다고 결정합니다. 따라서 드라이버는 pCommandBuffer, CommandBufferSizeAllocationListSize 멤버에 반환된 값이 잘못되었기 때문에 처리해서는 안 됩니다.

예제

다음 코드 예제에서는 OpenGL ICD가 D3DKMTRender를 사용하여 3D 기본 형식을 렌더링하는 방법을 보여 줍니다.

HRESULT Render(D3DKMT_HANDLE hDevice, UINT CommandOffset, UINT CommandLength)
{
    D3DKMT_RENDER RenderData;

    memset(&RenderData, 0, sizeof(RenderData));
    RenderData.hDevice = hDevice;
    RenderData.CommandOffset = CommandOffset;
    RenderData.CommandLength = CommandLength;

    if (NT_SUCCESS((*pfnKTRender)(&RenderData))) {
        return S_OK;
    }
    return E_FAIL;
}

요구 사항

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

추가 정보

D3DKMTGetDeviceState

D3DKMT_RENDER