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


Функция 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 (include D3dkmthk.h)
библиотеки Gdi32.lib
DLL Gdi32.dll

См. также

D3DKMT_CREATEALLOCATION