Поделиться через


функция обратного вызова 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 (include D3dkmthk.h)

См. также

D3DKMT_CREATEALLOCATION