다음을 통해 공유


D3DKMTCreateAllocation2 함수(d3dkmthk.h)

D3DKMTCreateAllocation2 함수는 시스템 또는 비디오 메모리 할당을 만들거나 추가합니다.

구문

NTSTATUS D3DKMTCreateAllocation2(
  D3DKMT_CREATEALLOCATION *unnamedParam1
);

매개 변수

unnamedParam1

[in, out] pData: 할당을 만들기 위한 정보를 포함하는 D3DKMT_CREATEALLOCATION 구조체에 대한 포인터입니다.

반환 값

D3DKMTCreateAllocation2 는 작업이 성공하면 STATUS_SUCCESS 반환합니다. 그렇지 않으면 다음 값 중 하나와 같은 NTSTATUS 코드를 반환할 수 있습니다.

반환 코드 설명
STATUS_DEVICE_REMOVED 그래픽 어댑터가 중지되었거나 디스플레이 디바이스가 다시 설정되었습니다.
STATUS_INVALID_PARAMETER 매개 변수의 유효성이 검사되었고 잘못된 것으로 확인되었습니다.
STATUS_NO_MEMORY 시스템 메모리가 부족하여 이 루틴을 완료할 수 없습니다.
STATUS_NO_VIDEO_MEMORY 비디오 메모리가 부족하여 이 루틴을 완료할 수 없습니다. 비디오 메모리 관리자는 비디오 메모리를 가상화하려고 시도합니다. 그러나 가상화가 실패하는 경우(예: 가상 주소 공간이 부족할 때) 메모리 관리자는 이 오류 코드를 반환할 수 있습니다.

설명

사용자 모드 그래픽 클라이언트는 D3DKMTCreateAllocation2 를 호출하여 할당 및 리소스를 만들 수 있습니다. 할당은 리소스와 연결되거나 독립 실행형일 수 있습니다.

D3DKMTCreateAllocation2 를 호출하여 언제든지 리소스에 추가 할당을 추가할 수도 있습니다. 유일한 제한 사항은 모든 공유 할당을 리소스와 연결해야 하며 추가 할당을 기존 공유 리소스에 추가할 수 없다는 것입니다.

예제

리소스와 연결되지 않은 비디오 메모리에 독립 실행형 할당 만들기

다음 코드 예제에서는 사용자 모드 그래픽 클라이언트가 D3DKMTCreateAllocation2 를 사용하여 리소스와 연결되지 않은 비디오 메모리에 독립 실행형 할당을 만드는 방법을 보여 줍니다.

D3DKMT_HANDLE CreateStandAloneAllocation(D3DKMT_HANDLE hDevice, VOID* pPrivateAllocationInfo, UINT Size)
{
    D3DKMT_CREATEALLOCATION CreateAllocation;
    D3DDDI_ALLOCATIONINFO2 AllocationInfo;

    memset(&CreateAllocation, 0, sizeof(CreateAllocation));
    CreateAllocation.hDevice = hDevice;
    CreateAllocation.NumAllocations = 1;
    CreateAllocation.pAllocationInfo2 = &AllocationInfo;

    AllocationInfo.hAllocation = NULL;
    AllocationInfo.pSystemMem = NULL;  // Vidmem allocation
    AllocationInfo.pPrivateDriverData = pPrivateAllocationInfo;  // Contains format, size, and so on.
    AllocationInfo.PrivateDriverDataSize = Size;

    if (NT_SUCCESS((*pfnKTCreateAllocation)(&CreateAllocation))) {
        return AllocationInfo.hAllocation;
    }
    return 0;
}

단일 시스템 메모리 할당을 사용하여 리소스 만들기

다음 코드 예제에서는 사용자 모드 그래픽 클라이언트가 D3DKMTCreateAllocation2 를 사용하여 단일 시스템 메모리 할당을 사용하여 리소스를 만드는 방법을 보여 줍니다.

HRESULT CreateSysmemResource(D3DKMT_HANDLE hDevice, 
                             UINT AllocationSize, 
                             VOID* pResourceData, 
                             UINT ResourceDataSize,
                             VOID* pAllocationData, 
                             UINT AllocationDataSize,
                             D3DKMT_HANDLE* phResource,
                             D3DKMT_HANDLE* phAllocation)
{
    D3DKMT_CREATEALLOCATION CreateAllocation;
    D3DDDI_ALLOCATIONINFO2 AllocationInfo;
    VOID* pSysMem;

    *phResource = NULL;
    *phAllocation = NULL;

    // For a sysmem allocation, preallocate the memory.
    pSysMem = MemAlloc(AllocationSize);
    if (pSysMem == NULL) {
        return E_OUTOFMEMORY;
    }
 
    memset(&CreateAllocation, 0, sizeof(CreateAllocation));
    CreateAllocation.hDevice = hDevice;
    CreateAllocation.Flags.CreateResource = TRUE;
    CreateAllocation.pPrivateDriverData = pResourceData;
    CreateAllocation.PrivateDriverDataSize = ResourceDataSize;
    CreateAllocation.NumAllocations = 1;
    CreateAllocation.pAllocationInfo = &AllocationInfo;

    AllocationInfo.hAllocation = NULL;
    AllocationInfo.pSystemMem = pSysMem;
    AllocationInfo.pPrivateDriverData = pAllocationData;
    AllocationInfo.PrivateDriverDataSize = AllocationDataSize;

    if (NT_SUCCESS((*pfnKTCreateAllocation)(&CreateAllocation))) {
        *phResource = CreateAllocation.hResource;
        *phAllocation = AllocationInfo.hAllocation;
        return S_OK;
    }
    MemFree(pSysMem);
    return E_FAIL;
}

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 7
대상 플랫폼 유니버설
헤더 d3dkmthk.h(D3dkmthk.h 포함)
라이브러리 Gdi32.lib
DLL Gdi32.dll

추가 정보

D3DKMT_CREATEALLOCATION