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가 호출되면 디스플레이 미니포트 드라이버는 지정된 세그먼트의 CPU 조리개(즉, DXGKARG_ACQUIRESWIZZLINGRANGESegmentId 멤버)를 통해 pAcquireSwizzlingRange 매개 변수가 가리키는 DXGKARG_ACQUIRESWIZZLINGRANGE 구조의 hAllocation 멤버인 지정된 할당을 만들어야 합니다. 할당은 얽히지 않는 제거 후 컴퓨터 메모리에 표시되는 것과 정확히 동일하게 표시되어야 합니다.

사용자 모드 디스플레이 드라이버의 모든 요청에 디스플레이 미니포트 드라이버에 액세스할 수 있는 것은 아닙니다. 비디오 메모리 관리자가 획득한 스위즐링 범위는 연결된 할당 및 지정된 개인 데이터에 따라 캐시됩니다. 할당에 액세스하기 위한 사용자 모드 표시 드라이버의 첫 번째 요청에서 디스플레이 미니포트 드라이버의 DxgkDdiAcquireSwizzlingRange 함수가 호출되어 할당에 액세스할 수 있도록 합니다. 개인 데이터가 일치하는 후속 요청에서 이전에 설정한 매핑은 할당에 액세스하는 데 사용됩니다.

비디오 메모리 관리자는 디스플레이 미니포트 드라이버의 DxgkDdiReleaseSwizzlingRange 함수를 호출하여 할당이 제거되거나 제거되거나 다른 할당에 조리개가 필요할 때 스위즐링 범위를 해제합니다. 할당은 여러 스위즐링 범위(예: MIP 수준당 하나의 조리개)와 연결할 수 있습니다.

드라이버의 DxgkDdiQueryAdapterInfo 함수가 호출될 때 어댑터가 지원하는 스위즐링 범위의 수는 DXGK_DRIVERCAPS 구조체의 NumberOfSwizzlingRanges 멤버에 있는 드라이버에 의해 노출됩니다. 모든 범위는 동일합니다(즉, 모든 범위가 스와이즐 해제되거나 모든 유형의 스위즐링 또는 타일링까지 가능). 비디오 메모리 관리자는 필요한 모든 애플리케이션 간에 사용 가능한 스위즐링 범위를 중재합니다.

드라이버는 MMIO(메모리 매핑 I/O)를 사용하여 스위즐링 범위를 설정해야 합니다. 이러한 스위즐링 범위 액세스는 GPU 실행을 방해해서는 안 됩니다(즉, DxgkDdiAcquireSwizzlingRange 가 호출될 때 GPU는 유휴 상태여야 함).

DxgkDdiAcquireSwizzlingRange에 대한 모든 호출은 자체적으로 직렬화되지만 다른 DDI 함수와는 다릅니다.

GPU가 CPU 액세스를 비 CPU 액세스 메모리 세그먼트 또는 시스템 메모리로 리디렉션하는 스위즐링 범위를 지원하는 경우 사용자 모드 표시 드라이버는 pfnLockCb 함수를 호출하여 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
대상 플랫폼 데스크톱
머리글 d3dkmddi.h
IRQL PASSIVE_LEVEL

추가 정보

D3DDDICB_LOCK

DXGKARG_ACQUIRESWIZZLINGRANGE

DXGK_DRIVERCAPS

DxgkDdiAddDevice

DxgkDdiCreateAllocation

DxgkDdiQueryAdapterInfo

DxgkDdiReleaseSwizzlingRange

pfnLockCb