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


Функция D3DKMTCreateAllocation2 (d3dkmthk.h)

Функция D3DKMTCreateAllocation2 создает или добавляет выделения системной или видеопамять.

Синтаксис

NTSTATUS D3DKMTCreateAllocation2(
  D3DKMT_CREATEALLOCATION *unnamedParam1
);

Параметры

unnamedParam1

[вход, выход] 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