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 멤버에 AcquireApertureUseAlternateVA 비트 필드 플래그의 조합을 설정할 수 있습니다. 이 경우 비디오 메모리 관리자는 디스플레이 미니포트 드라이버의 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

참고 항목

D3DDDICB_LOCK

DXGKARG_ACQUIRESWIZZLINGRANGE

DXGK_DRIVERCAPS

DxgkDdiAddDevice

DxgkDdiCreateAllocation

DxgkDdiQueryAdapterInfo

DxgkDdiReleaseSwizzlingRange

pfnLockCb