DXGKDDI_RENDERKM 콜백 함수(d3dkmddi.h)

GDI 하드웨어 가속을 지원하는 디스플레이 어댑터의 경우 DxgkDdiRenderKm 함수는 커널 모드 CDD(정식 표시 드라이버)가 전달한 명령 버퍼에서 DMA(직접 메모리 액세스) 버퍼를 생성합니다.

구문

DXGKDDI_RENDERKM DxgkddiRenderkm;

NTSTATUS DxgkddiRenderkm(
  [in]     IN_CONST_HANDLE hContext,
  [in/out] INOUT_PDXGKARG_RENDER pRenderKmArgs
)
{...}

매개 변수

[in] hContext

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

드라이버가 컨텍스트 생성을 지원하지 않는 경우 Microsoft DirectX 그래픽 커널 하위 시스템은 컨텍스트에 대한 핸들을 디바이스에 대한 핸들로 바꿉니다. 디스플레이 미니포트 드라이버의 DxgkDdiCreateDevice 함수는 이전에 DxgkDdiCreateDevicepCreateDevice 매개 변수가 가리키는 DXGKARG_CREATEDEVICE 구조체의 hDevice 멤버에서 디바이스 핸들을 반환했습니다.

[in/out] pRenderKmArgs

DMA 버퍼 및 형식이 지정된 명령 버퍼에 대한 정보를 포함하는 DXGKARG_RENDER 구조체에 대한 포인터입니다.

디스플레이 미니포트 드라이버가 GDI 하드웨어 가속을 지원하는 경우 pRenderKmArgspCommand->는 DXGK_RENDERKM_COMMAND 명령 버퍼를 가리킵니다.

드라이버는 입력 명령 버퍼를 DMA 버퍼 명령으로 변환하고 패치 위치 목록을 빌드해야 합니다.

반환 값

DxgkDdiRenderKm 은 다음 값 중 하나를 반환합니다.

반환 코드 설명
STATUS_SUCCESS 전체 명령 버퍼가 변환되었습니다.
STATUS_NO_MEMORY DxgkDdiRenderKm 에서 완료하는 데 필요한 메모리를 할당할 수 없습니다.
STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER 현재 DMA 버퍼가 고갈되었습니다.
STATUS_INVALID_PARAMETER DxgkDdiRenderKm 은 그래픽 하드웨어에서 지원할 수 없는 명령 매개 변수를 감지했습니다. 그러나 그래픽 하드웨어는 명령 자체를 지원할 수 있습니다. 드라이버가 이 오류 코드를 반환할 필요가 없습니다. 대신 지원되지 않는 명령 매개 변수를 검색할 때 STATUS_ILLEGAL_INSTRUCTION 반환할 수 있습니다.
STATUS_INVALID_USER_BUFFER DxgkDdiRenderKm 에서 데이터 또는 명령이 실행되거나 오버런되는 것을 감지했습니다. 즉, 드라이버가 예상보다 적은 또는 더 많은 명령 또는 데이터를 수신했습니다. 드라이버가 이 오류 코드를 반환할 필요가 없습니다. 대신 데이터 또는 명령이 오버런되거나 오버런되면 STATUS_ILLEGAL_INSTRUCTION 반환할 수 있습니다.
STATUS_INVALID_HANDLE DxgkDdiRenderKm 이 명령 버퍼에서 잘못된 핸들을 감지했습니다.
STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE 디스플레이 미니포트 드라이버가 DMA 스트림에서 오류를 감지했습니다. 드라이버가 이 오류 코드를 반환하면 그래픽 컨텍스트 디바이스가 손실된 상태로 배치됩니다.

설명

DirectX 그래픽 커널 하위 시스템은 디스플레이 미니포트 드라이버의 DxgkDdiRenderKm 함수를 호출하여 운영 체제에서 제공하는 커널 모드 CDD(정식 디스플레이 드라이버)에 의해 전달되는 명령 버퍼에서 DMA 버퍼를 생성합니다. 출력 DMA 버퍼 외에도 디스플레이 미니포트 드라이버는 출력 패치 위치 목록을 생성해야 합니다. 비디오 메모리 관리자는 이 목록을 사용하여 DMA 버퍼를 적절하게 분할하고 패치합니다.

참고 커널 버퍼에 액세스하려면 코드로부터 try/except 보호가 필요하지 않습니다.
디스플레이 미니포트 드라이버는 CDD가 정보를 더 최적으로 다시 만들 수 있는 경우 제공하는 정보를 사용할 필요가 없습니다. 예를 들어 사용자 모드 표시 드라이버가 입력 패치 위치 목록을 제공하지 않았기 때문에 pRenderpPatchLocationListIn -> 멤버가 비어 있는 경우 디스플레이 미니포트 드라이버는 대신 명령 버퍼의 내용에 따라 pRenderpPatchLocationListOut -> 멤버의 콘텐츠를 생성할 수 있습니다.

장치별 핸들 외에도 DirectX 그래픽 커널 하위 시스템은 각 할당에 대해 마지막으로 알려진 GPU 세그먼트 주소를 가진 디스플레이 미니포트 드라이버를 제공합니다. 할당 인덱스 N이 현재 페이징된 경우 DirectX 그래픽 커널 하위 시스템은 DXGKARG_RENDER pAllocationList 멤버의 Nth 요소에 대한 SegmentId 멤버를 0으로 설정합니다. 할당 목록의 Nth 요소의 SegmentId 멤버가 0으로 설정되지 않은 경우 DirectX 그래픽 커널 하위 시스템이 DxgkDdiPatch 함수를 호출하여 DMA 버퍼를 다시 일치하기 전에 디스플레이 미니포트 드라이버가 제공된 세그먼트 주소 정보를 사용하여 생성된 DMA 버퍼를 패치해야 합니다. DirectX 그래픽 커널 하위 시스템이 드라이버가 제대로 패치되어야 하는 DMA 버퍼에서 DxgkDdiPatch 함수를 호출하지 않을 수 있으므로 드라이버가 요청될 때 이 초기 패치를 수행해야 합니다.

참고 드라이버의 DxgkDdiRenderKm 함수가 앞에서 설명한 대로 초기 DMA 버퍼 패치를 수행하더라도 드라이버는 pPatchLocationListOut 멤버가 지정하는 출력 패치 위치 목록에 할당에 대한 모든 참조를 여전히 삽입해야 DXGKARG_RENDER . DMA 버퍼가 GPU에 제출되기 전에 할당 주소가 변경될 수 있으므로 이 목록에는 모든 참조가 포함되어야 합니다. 따라서 DirectX 그래픽 커널 하위 시스템은 DMA 버퍼를 다시 일치하도록 DxgkDdiPatch 함수를 호출합니다.
할당을 바인딩 해제하기 위해 디스플레이 미니포트 드라이버는 할당 목록에서 NULL 핸들을 참조하는 요소를 지정한 다음 NULL 할당을 참조하는 패치 위치 요소를 사용할 수 있습니다. 일반적으로 드라이버는 할당 목록(요소 0)의 첫 번째 요소를 NULL 요소로 사용해야 합니다.

보장된 계약 DMA 모드에서 디스플레이 미니포트 드라이버가 명령 버퍼를 DMA 버퍼로 변환하는 경우 CDD는 번역 명령에 충분한 리소스를 보장해야 합니다. 번역에 충분한 리소스가 없는 경우 디스플레이 미니포트 드라이버는 DMA 버퍼를 거부해야 합니다. 자세한 내용은 보증 계약 DMA 버퍼 모델 사용을 참조하세요.

DxgkDdiRenderKm 을 페이징할 수 있어야 합니다.

요구 사항

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

참고 항목

D3DDDI_ALLOCATIONLIST

DXGKARG_CREATECONTEXT

DXGKARG_CREATEDEVICE

DXGK_ALLOCATIONLIST

DXGK_RENDERKM_COMMAND

DxgkDdiCreateContext

DxgkDdiCreateDevice

DxgkDdiOpenAllocation

DxgkDdiPatch

DxgkDdiRender