다음을 통해 공유


WDDM 기능의 커널 모드 테스트

이 문서에서는 WDDM 3.2(Windows 11 버전 24H2)에 추가된 WDDM의 커널 모드 테스트 인프라 설계에 대해 설명합니다. 이 인프라를 사용하면 일부 NPU 디바이스의 드라이버와 같이 D3D 런타임을 지원하지 않는 드라이버를 테스트하고 유효성을 검사할 수 있습니다. D3D 런타임을 포함하지 않고 D3D 런타임을 지원하는 드라이버의 유효성을 검사하는 데 사용할 수도 있습니다.

개요

WDDM 또는 MCDM 을 기반으로 하는 새 컴퓨팅 디바이스가 도입되고 이러한 디바이스의 드라이버가 D3D 런타임을 지원하지 않는 시나리오가 있습니다. 이와 같은 드라이버의 검증 작업을 돕기 위해 기능이 Dxgkrnl에 추가되어 커널 모드 톡만 사용하고자 유효성 검사를 수행합니다. 이는 D3D 런타임 및 사용자 모드 드라이버(UMD)를 포함하지 않는다는 의미입니다.

또한 이 인프라를 사용하면 D3D 런타임 또는 UMD를 거치지 않고도 정확한 설정을 사용하여 WDDM 기능을 테스트할 수 있으므로 상황이 복잡해질 수 있습니다.

DDI는 지정된 명령 집합에 대한 커널 모드로 명령 버퍼를 빌드하기 위해 도입되었습니다. 명령은 간단하므로 거의 모든 실행 노드가 미리 컴파일된 셰이더 또는 다른 방법을 사용하여 실행할 수 있어야 합니다.

이 기능을 지원하려면 KMD(커널 모드 드라이버)에서 다음 지원을 제공해야 합니다.

  • DXGK_FEATURE_KERNEL_MODE_TESTING 기능이 사용하도록 설정되어 있다고 보고합니다.
  • DXGKDDI_KERNELMODETESTINGINTERFACE 기능 인터페이스를 구현합니다.
  • 테스트 명령 버퍼의 빌드 및 실행을 지원하는 실행 노드에 대한 정보를 제공합니다.
  • 프라이빗 드라이버 데이터 없이 컨텍스트/하드웨어 큐 만들기를 지원합니다. 일반적으로 디바이스에 워크로드를 제출하려면 프라이빗 드라이버 명령 형식이 필요합니다. 테스트 인터페이스를 사용하면 프라이빗 드라이버 데이터 없이 워크로드를 제출할 수 있습니다.
  • 기능을 지원하는 디바이스의 모든 노드에서 pfnBuildTestCommandBuffer 에서 빌드한 명령 버퍼의 실행을 지원합니다.
  • 페이징 DDI(TRANSFER, FILL 등)에서 NULL 할당 핸들을 지원합니다.

이 기능은 컴퓨터에서 테스트 서명을 사용하는 경우에만 사용됩니다.

이 기능을 사용하는 HLK 테스트가 개발됩니다.

DDI 변경 내용

커널 모드 테스트를 지원하도록 다음 구조 및 열거형이 업데이트되었습니다.

커널 모드 테스트를 지원하기 위해 다음 DDI, 구조 및 열거형이 추가됩니다.

커널 모드 테스트 기능에 대한 보고 지원

OS는 추가된 DXGK_FEATURE_KERNEL_MODE_TESTING 기능 ID를 사용하여 KMD의 DxgkDdiQueryFeatureSupport 함수를 호출하여 드라이버가 커널 모드 테스트를 지원하는지 확인합니다. KMD는 기능이 지원된다는 것을 보고해야 합니다.

그런 다음 시스템은 동일한 기능 ID를 사용하여 DxgkDdiQueryFeatureInterface 를 호출하여 pfnBuildTestCommandBuffer에 대한 인터페이스 함수 포인터를 가져옵니다. KMD는 이 함수를 구현하고 DXGKDDI_KERNELMODETESTINGINTERFACE 인터페이스에 대한 포인터를 제공해야 합니다.

커널 모드 테스트를 지원하는 실행 노드 보고

SupportBuildTestCommandBufferDXGK_NODEMETADATA_FLAGS 구조에 추가됩니다. KMD는 노드가 pfnBuildTestCommandBuffer로 빌드된 명령 버퍼를 실행할 수 있음을 나타내기 위해 이 플래그를 설정해야 합니다. 가능한 한 많은 노드에서 이 기능을 지원하는 것이 좋습니다.

프라이빗 데이터 없이 컨텍스트 만들기

컨텍스트가 테스트 컨텍스트임을 나타내기 위해 TestContextDXGK_CREATECONTEXTFLAGS 추가됩니다. 이 플래그는 테스트 서명을 사용하는 경우에만 적용됩니다.

KMD의 DxgkDdiCreateContextpfnBuildTestCommandBuffer에서 생성된 명령 버퍼의 실행을 지원하는 모든 노드에 대해 프라이빗 데이터 없이 컨텍스트를 만들 수 있도록 지원해야 합니다. 이 지원을 나타내려면 컨텍스트를 만드는 동안 Flags에서 TestContext 플래그를 설정합니다.

드라이버 프라이빗 데이터 없이 하드웨어 큐 만들기

TestQueue 는 하드웨어 큐가 테스트 큐임을 나타내기 위해 D3DDDI_CREATEHWQUEUEFLAGS 추가됩니다. 이 플래그는 테스트 서명을 사용하는 경우에만 적용됩니다.

KMD의 DxgkDdiCreateHwQueue 는 드라이버 프라이빗 데이터 없이 하드웨어 큐 만들기를 지원해야 합니다.

명령 버퍼 빌드

KMD의 pfnBuildTestCommandBuffer 는 간단한 명령 집합에 대한 디바이스별 지침이 포함된 명령 버퍼를 빌드합니다. KMD는 DxgkDdiQueryFeatureInterface(DXGK_FEATURE_KERNEL_MODE_TESTING)에서 이 함수에 대한 포인터를 반환합니다.

단일 테스트 명령이 pfnBuildTestCommandBuffer에 제출됩니다. 현재 지원되는 명령은 다음과 같습니다.

명령어 설명
D3DDDI_TESTCOMMAND_COPY 원본 및 대상 GPU 가상 주소를 사용하여 바이트를 복사합니다.
D3DDDI_TESTCOMMANDBUFFER_FILL 메모리 위치를 패턴으로 채웁니다.

테스트 명령은 GPU 가상 주소 사용을 기반으로 합니다. OS는 GPU VA가 표준 할당 유형의 D3DKMT_STANDARDALLOCATIONTYPE_EXISTINGHEAP 또는 D3DKMT_STANDARDALLOCATIONTYPE_INTERNALBACKINGSTORE 사용하여 만든 할당에 매핑되도록 보장합니다.

생성된 명령 버퍼 및 프라이빗 데이터가 다시 사용자 모드로 반환됩니다. 명령 버퍼가 실행을 위해 제출되면 사용자 모드에서 호출이 발생합니다. 악의적인 애플리케이션은 버퍼 및 프라이빗 데이터의 콘텐츠를 변경할 수 있습니다. 버그 검사를 방지하기 위해 명령 버퍼와 프라이빗 드라이버 데이터의 유효성을 모두 검사하는 것은 KMD의 책임입니다.

생성된 명령 버퍼에는 권한 있는 명령이 포함되어서는 안 됩니다.

사용자 모드 클라이언트 드라이버(예: Cuda)는 D3DKMTSubmitCommand 또는 D3DKMTSubmitCommandToHwQueue를 사용하여 실행하기 위해 생성된 명령 버퍼를 제출합니다. 나중에 버퍼 콘텐츠는 사용자 모드 제출의 일부로 제출됩니다.

생성된 명령 버퍼가 실행을 위해 제출되면 명령 버퍼에 단일 테스트 명령에 대한 디바이스 명령이 포함되어 있음을 보장합니다.

생성된 명령 버퍼는 pfnBuildTestCommandBuffer에 전달된 hContext에 해당하는 노드에 제출됩니다.

DMA 버퍼(pDmaBuffer)의 크기는 4KB로 제한되며 DMA 프라이빗 드라이버 데이터(pDmaBufferPrivateData)의 크기는 1KB로 제한됩니다.