PFND3DKMT_CREATEALLOCATION 콜백 함수(d3dkmthk.h)

D3DKMTCreateAllocation 함수는 시스템 또는 비디오 메모리의 할당을 만듭니다.

구문

PFND3DKMT_CREATEALLOCATION Pfnd3dkmtCreateallocation;

NTSTATUS Pfnd3dkmtCreateallocation(
  D3DKMT_CREATEALLOCATION *unnamedParam1
)
{...}

매개 변수

unnamedParam1

pData [in, out]

할당을 만들기 위한 정보를 포함하는 D3DKMT_CREATEALLOCATION 구조체에 대한 포인터입니다.

반환 값

D3DKMTCreateAllocation 은 다음 값 중 하나를 반환합니다.

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

이 함수는 다른 NTSTATUS 값을 반환할 수도 있습니다.

설명

OpenGL ICD는 D3DKMTCreateAllocation 함수를 사용하여 할당 및 리소스를 만듭니다. 할당은 리소스와 연결되거나 할당이 단독으로 실행될 수 있습니다. D3DKMTCreateAllocation 함수를 사용하여 언제든지 리소스에 추가 할당을 추가할 수도 있습니다. 유일한 제한 사항은 모든 공유 할당을 리소스와 연결해야 하며 기존 공유 리소스에 추가 할당을 추가할 수 없다는 것입니다.

예제

다음 코드 예제에서는 OpenGL ICD가 D3DKMTCreateAllocation 을 사용하여 리소스와 연결되지 않은 비디오 메모리에 독립 실행형 할당을 만드는 방법을 보여 줍니다.

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

    memset(&CreateAllocation, 0, sizeof(CreateAllocation));
    CreateAllocation.hDevice = hDevice;
    CreateAllocation.NumAllocations = 1;
    CreateAllocation.pAllocationInfo = &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;
}

다음 코드 예제에서는 OpenGL ICD가 D3DKMTCreateAllocation 을 사용하여 단일 시스템 메모리 할당을 사용하여 리소스를 만드는 방법을 보여 줍니다.

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_ALLOCATIONINFO 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 Vista
대상 플랫폼 유니버설
헤더 d3dkmthk.h(D3dkmthk.h 포함)

추가 정보

D3DKMT_CREATEALLOCATION