PFND3DKMT_CREATEALLOCATION función de devolución de llamada (d3dkmthk.h)

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

Sintaxis

PFND3DKMT_CREATEALLOCATION Pfnd3dkmtCreateallocation;

NTSTATUS Pfnd3dkmtCreateallocation(
  D3DKMT_CREATEALLOCATION *unnamedParam1
)
{...}

Parámetros

unnamedParam1

pData [in, out]

Puntero a una estructura D3DKMT_CREATEALLOCATION que contiene información para crear asignaciones.

Valor devuelto

D3DKMTCreateAllocation devuelve uno de los siguientes valores:

Código devuelto Descripción
STATUS_SUCCESS Las asignaciones se crearon correctamente.
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 D3DKMTCreateAllocation no se pudo completar debido a memoria insuficiente.
STATUS_NO_VIDEO_MEMORY D3DKMTCreateAllocation 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.

Esta función también podría devolver otros valores NTSTATUS.

Comentarios

OpenGL ICD usa la función D3DKMTCreateAllocation para crear asignaciones y recursos. Una asignación se puede asociar a un recurso o una asignación puede ser independiente. La función D3DKMTCreateAllocation también se puede usar 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

En el ejemplo de código siguiente se muestra cómo un ICD de OpenGL puede usar D3DKMTCreateAllocation para crear una asignación independiente en 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_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;
}

En el ejemplo de código siguiente se muestra cómo un ICD de OpenGL puede usar D3DKMTCreateAllocation 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_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;
}

Requisitos

Requisito Value
Cliente mínimo compatible Windows Vista
Plataforma de destino Universal
Encabezado d3dkmthk.h (incluya D3dkmthk.h)

Consulte también

D3DKMT_CREATEALLOCATION