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