Compartir a través de


Función D3DKMTCreateAllocation2 (d3dkmthk.h)

La función D3DKMTCreateAllocation2 crea o agrega asignaciones de memoria de sistema o vídeo.

Sintaxis

NTSTATUS D3DKMTCreateAllocation2(
  D3DKMT_CREATEALLOCATION *unnamedParam1
);

Parámetros

unnamedParam1

[dentro, fuera] pData: puntero a una estructura de D3DKMT_CREATEALLOCATION que contiene información para crear asignaciones.

Valor devuelto

D3DKMTCreateAllocation2 devuelve STATUS_SUCCESS si la operación se realiza correctamente. De lo contrario, podría devolver un código NTSTATUS , como uno de los siguientes valores:

Código devuelto Descripción
STATUS_DEVICE_REMOVED El adaptador de gráficos se detuvo o se restableció el dispositivo de pantalla.
STATUS_INVALID_PARAMETER Los parámetros se validaron y determinaron que son incorrectos.
STATUS_NO_MEMORY Esta rutina no se pudo completar debido a una memoria del sistema insuficiente.
STATUS_NO_VIDEO_MEMORY Esta rutina no se pudo completar debido a una memoria de vídeo insuficiente. El administrador de memoria de vídeo intenta virtualizar la memoria de vídeo. Sin embargo, si se produce un error en la virtualización (por ejemplo, cuando se agota el espacio de direcciones virtuales), el administrador de memoria podría devolver este código de error.

Comentarios

Un cliente de gráficos en modo de usuario puede llamar a D3DKMTCreateAllocation2 para crear asignaciones y recursos. Una asignación se puede asociar a un recurso o puede ser independiente.

También se puede llamar a D3DKMTCreateAllocation2 para agregar asignaciones adicionales a un recurso en cualquier momento. Las únicas restricciones son que todas las asignaciones compartidas deben estar asociadas a un recurso y no se pueden agregar asignaciones adicionales a un recurso compartido existente.

Ejemplos

Creación de una asignación independiente en la memoria de vídeo que no está asociada a un recurso

En el ejemplo de código siguiente se muestra cómo un cliente de gráficos en modo de usuario puede usar D3DKMTCreateAllocation2 para crear una asignación independiente en la memoria de vídeo que no está asociada a un recurso.

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;
}

Creación de un recurso con una única asignación de memoria del sistema

En el ejemplo de código siguiente se muestra cómo un cliente de gráficos en modo de usuario puede usar D3DKMTCreateAllocation2 para crear un recurso con una única asignación de memoria del sistema.

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;
}

Requisitos

Requisito Value
Cliente mínimo compatible Windows 7
Plataforma de destino Universal
Encabezado d3dkmthk.h (incluya D3dkmthk.h)
Library Gdi32.lib
Archivo DLL Gdi32.dll

Consulte también

D3DKMT_CREATEALLOCATION