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 하드웨어 가속을 지원하는 경우 pRenderKmArgs-pCommand>는 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가 정보를 더 최적으로 다시 만들 수 있는 경우 제공하는 정보를 사용할 필요가 없습니다. 예를 들어 사용자 모드 표시 드라이버가 입력 패치 위치 목록을 제공하지 않아 pRender-pPatchLocationListIn > 멤버가 비어 있는 경우 디스플레이 미니포트 드라이버는 대신 명령 버퍼의 내용에 따라 pRender-pPatchLocationListOut> 멤버의 콘텐츠를 생성할 수 있습니다.

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

드라이버의 DxgkDdiRenderKm 함수가 앞에서 설명한 대로 초기 DMA 버퍼 패치를 수행하더라도 드라이버는 pPatchLocationListOut 멤버가 지정하는 출력 패치 위치 목록에 할당에 대한 모든 참조를 계속 삽입해야 DXGKARG_RENDER . DMA 버퍼가 GPU에 제출되기 전에 할당 주소가 변경될 수 있으므로 이 목록에는 모든 참조가 포함되어야 합니다. 따라서 DirectX 그래픽 커널 하위 시스템은 DxgkDdiPatch 함수를 호출하여 DMA 버퍼를 다시 일치합니다.

할당을 바인딩 해제하기 위해 디스플레이 미니포트 드라이버는 할당 목록에서 NULL 핸들을 참조하는 요소를 지정한 다음 해당 NULL 할당을 참조하는 패치 위치 요소를 사용할 수 있습니다. 일반적으로 드라이버는 할당 목록의 첫 번째 요소(요소 0)를 NULL 요소로 사용해야 합니다.

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

DxgkDdiRenderKm 을 페이징 가능으로 만들어야 합니다.

요구 사항

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

추가 정보

D3DDDI_ALLOCATIONLIST

DXGKARG_CREATECONTEXT

DXGKARG_CREATEDEVICE

DXGK_ALLOCATIONLIST

DXGK_RENDERKM_COMMAND

DxgkDdiCreateContext

DxgkDdiCreateDevice

DxgkDdiOpenAllocation

DxgkDdiPatch

DxgkDdiRender