DXGKDDI_ACQUIRESWIZZLINGRANGE 콜백 함수(d3dkmddi.h)
DxgkDdiAcquireSwizzlingRange 함수는 지정된 세그먼트에 대한 CPU(중앙 처리 장치) 조리개를 통해 할당에 액세스할 수 있도록 합니다.
구문
DXGKDDI_ACQUIRESWIZZLINGRANGE DxgkddiAcquireswizzlingrange;
NTSTATUS DxgkddiAcquireswizzlingrange(
[in] IN_CONST_HANDLE hAdapter,
[in/out] INOUT_PDXGKARG_ACQUIRESWIZZLINGRANGE pAcquireSwizzlingRange
)
{...}
매개 변수
[in] hAdapter
디스플레이 어댑터와 연결된 컨텍스트 블록에 대한 핸들입니다. 디스플레이 미니포트 드라이버는 이전에 DxgkDdiAddDevice 함수의 MiniportDeviceContext 출력 매개 변수에서 Microsoft DirectX 그래픽 커널 하위 시스템에 이 핸들을 제공했습니다.
[in/out] pAcquireSwizzlingRange
CPU 조리개를 통해 할당에 액세스할 수 있도록 하는 정보가 포함된 DXGKARG_ACQUIRESWIZZLINGRANGE 구조체에 대한 포인터입니다.
반환 값
DxgkDdiAcquireSwizzlingRange 는 다음 값 중 하나를 반환합니다.
| 반환 코드 | 설명 |
|---|---|
| STATUS_SUCCESS | DxgkDdiAcquireSwizzlingRange 를 통해 할당에 액세스할 수 있게 되었습니다. |
| STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNSUPPORTED | DxgkDdiAcquireSwizzlingRange 에서 할당에 대한 스위즐링 범위를 프로그래밍할 수 없습니다. 비디오 메모리 관리자는 추가 시도 없이 스위즐링 범위를 획득하지 못합니다. |
| STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE | 다른 스위즐링 범위가 현재 필요한 GPU(그래픽 처리 장치) 리소스를 사용하고 있기 때문에 DxgkDdiAcquireSwizzlingRange 에서 할당에 대한 스위즐링 범위를 프로그래밍할 수 없습니다. 비디오 메모리 관리자는 현재 사용 중인 범위를 해제한 다음 스위즐링 범위를 다시 설정하려고 시도합니다. |
설명
DxgkDdiAcquireSwizzlingRange 함수는 사용자 모드 표시 드라이버가 할당의 비트를 참조하는 가상 주소를 요청한 후에 호출됩니다( 즉, 사용자 모드 표시 드라이버가 D3DDDICB_LOCK 구조의 Flags 멤버에 설정된 AcquireAperture 비트 필드 플래그를 사용하여 pfnLockCb 함수를 호출한 후 및 할당이 현재 CPU 액세스 가능 메모리 세그먼트에 있는 동안). acquireAperture 비트 필드 플래그가 pfnLockCb 호출에서 설정되지 않은 경우 DxgkDdiAcquireSwizzlingRange가 호출되지 않으며 할당은 사용자 모드 표시 드라이버 또는 애플리케이션이 처리할 수 있는 형식이어야 합니다.
DxgkDdiAcquireSwizzlingRange가 호출되면 디스플레이 미니포트 드라이버는 지정된 세그먼트(즉, DXGKARG_ACQUIRESWIZZLINGRANGE SegmentId 멤버)에 대한 CPU 조리개를 통해 pAcquireSwizzlingRange 매개 변수가 가리키는 DXGKARG_ACQUIRESWIZZLINGRANGE 구조의 hAllocation 멤버인 지정된 할당에 액세스할 수 있도록 해야 합니다. 할당은 비동기 제거 후 컴퓨터 메모리에 표시되는 것과 정확히 일치해야 합니다.
사용자 모드 디스플레이 드라이버의 모든 요청에 디스플레이 미니포트 드라이버에 액세스할 수 있는 것은 아닙니다. 비디오 메모리 관리자가 획득한 스위즐링 범위는 연결된 할당 및 지정된 개인 데이터에 따라 캐시됩니다. 할당에 액세스하기 위한 사용자 모드 표시 드라이버의 첫 번째 요청에서 할당에 액세스할 수 있도록 디스플레이 미니포트 드라이버의 DxgkDdiAcquireSwizzlingRange 함수가 호출됩니다. 개인 데이터와 일치하는 후속 요청에서 이전에 설치한 매핑은 할당에 액세스하는 데 사용됩니다.
비디오 메모리 관리자는 디스플레이 미니포트 드라이버의 DxgkDdiReleaseSwizzlingRange 함수를 호출하여 할당이 제거되거나 제거되거나 다른 할당에 조리개를 필요로 하는 경우 스위즐링 범위를 해제합니다. 할당은 여러 스위즐링 범위(예: MIP 수준당 하나의 조리개)와 연결할 수 있습니다.
어댑터가 지원하는 스위즐링 범위의 수는 드라이버의 DxgkDdiQueryAdapterInfo 함수가 호출될 때 DXGK_DRIVERCAPS 구조체의 NumberOfSwizzlingRanges 멤버에 있는 드라이버에 의해 노출됩니다. 모든 범위는 동일합니다(즉, 모든 범위는 스위즐링 또는 타일링의 모든 유형을 취소하거나 모든 형식이 바둑판식으로 배열될 수 있음). 비디오 메모리 관리자는 필요한 모든 애플리케이션에서 사용 가능한 스위즐링 범위를 중재합니다.
드라이버는 메모리 매핑된 I/O(MMIO)를 사용하여 스위즐링 범위를 설정해야 합니다. 이러한 스위즐링 범위 액세스는 GPU 실행을 방해해서는 안 됩니다(즉, DxgkDdiAcquireSwizzlingRange 가 호출될 때 GPU가 유휴 상태가 되어서는 안 됩니다).
DxgkDdiAcquireSwizzlingRange에 대한 모든 호출은 자체적으로 직렬화되지만 다른 DDI 함수에서는 serialize되지 않습니다.
GPU가 CPU 액세스를 비 CPU 액세스 가능 메모리 세그먼트 또는 시스템 메모리로 리디렉션하는 스위즐링 범위를 지원하는 경우 사용자 모드 표시 드라이버는 pfnLockCb 함수를 호출하여 할당을 잠그기 위해 D3DDDICB_LOCK 구조체의 Flags 멤버에 AcquireAperture 및 UseAlternateVA 비트 필드 플래그의 조합을 설정할 수 있습니다. 이 경우 비디오 메모리 관리자는 디스플레이 미니포트 드라이버의 DxgkDdiAcquireSwizzlingRange 함수를 호출하여 할당이 CPU에 액세스할 수 없는 메모리 세그먼트 또는 조리개 세그먼트에 있더라도 할당에 대한 스위즐링 범위를 획득합니다. 스위즐링 범위는 드라이버가 관리하고 비디오 메모리 관리자가 액세스하거나 고려하지 않는 일부 GPU 리소스(예: PCI 조리개 범위)와 연결됩니다.
드라이버 관리 리소스가 부족하여 스위즐링 범위를 획득하기 위해 DxgkDdiAcquireSwizzlingRange 를 호출하지 못할 수 있습니다. 스위즐링 범위 자체는 무료이지만 리소스 누락으로 인해 사용하지 못할 수 있습니다. 드라이버는 DxgkDdiAcquireSwizzlingRange에서 STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE 반환하여 비디오 메모리 관리자가 스위즐링 범위를 사용할 수 없음을 나타낼 수 있습니다. 그런 다음 비디오 메모리 관리자는 현재 사용 중인 스위즐링 범위를 해제한 다음 드라이버의 DxgkDdiAcquireSwizzlingRange 함수를 다시 호출하여 새 스위즐링 범위를 설정합니다. 모든 스위즐링 범위가 해제되고 드라이버가 여전히 STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE 실패하는 경우 비디오 메모리 관리자는 할당에 대한 스위즐링 범위를 획득하지 못합니다.
DxgkDdiAcquireSwizzlingRange 를 페이징 가능으로 만들어야 합니다.
요구 사항
| 지원되는 최소 클라이언트 | Windows Vista 이상 버전의 Windows 운영 체제에서 사용할 수 있습니다. |
| 대상 플랫폼 | 데스크톱 |
| 헤더 | d3dkmddi.h |
| IRQL | PASSIVE_LEVEL |
참고 항목
피드백
다음에 대한 사용자 의견 제출 및 보기