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