Compartir a través de


Función D3DKMTCreateAllocation (d3dkmthk.h)

La función D3DKMTCreateAllocation crea o agrega asignaciones de memoria del sistema o de vídeo. Los controladores de cliente de gráficos en modo de usuario deben llamar a D3DKMTCreateAllocation2 en su lugar (vea Comentarios).

Sintaxis

NTSTATUS D3DKMTCreateAllocation(
  D3DKMT_CREATEALLOCATION *unnamedParam1
);

Parámetros

unnamedParam1

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

Valor devuelto

D3DKMTCreateAllocation 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 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

Los controladores de cliente de gráficos en modo de usuario deben llamar a D3DKMTCreateAllocation2 en su lugar. Una razón es que Subsistema de Windows para Linux (WSL) no admite D3DKMTCreateAllocation(nf-d3dkmthk-d3dkmtcreateallocation2.md).

El modo de usuario (en este caso, el entorno de ejecución D3D) llama a D3DKMTCreateAllocation para crear asignaciones y recursos. Una asignación se puede asociar a un recurso o puede ser independiente.

Cuando el modo de usuario llama a D3DKMTCreateAllocation, el UMD proporciona datos del controlador privado que describen la asignación. Dxgkrnl toma estos datos del controlador privado y los pasa al KMD que, a continuación, rellena una descripción de cada asignación de una manera que VidMm entiende. Los datos de UMD contienen información como el tipo de recurso (textura, cadena de intercambio, etc.). El KMD traduce estos datos a elementos como el tamaño, la alineación, un conjunto de segmentos de memoria que la asignación se puede encontrar, preferencias para estos segmentos, etc.

También se puede llamar a D3DKMTCreateAllocation 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 memoria de vídeo que no está asociada a un recurso

En el ejemplo de código siguiente se muestra cómo se 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;
}

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

Creación de una asignación estándar con ExistingSysMem

En el ejemplo de código siguiente se muestran los argumentos que se van a pasar a D3DKMTCreateAllocation para crear una asignación estándar con ExistingSysMem. El búfer de memoria del sistema existente que proporciona el runtime al kernel debe estar alineado con páginas y un múltiplo del tamaño de página; de lo contrario, el kernel produce un error en la llamada.

    UINT PrivateDriverDataEstimate = 2048;

    D3DDDI_ALLOCATIONINFO2 AllocInfo = {};
    AllocInfo.pSystemMem = SomeValidPageAlignedSysMem;
    AllocInfo.VidPnSourceId = SomeVidPnSourceId;

    D3DKMDT_CREATESTANDARDALLOCATION StandardAlloc = {};
    StandardAlloc.Type = D3DKMT_STANDARDALLOCATIONTYPE_EXISTINGHEAP;
    StandardAlloc.ExistingHeapData.Size = SizeOfSystemMemBuffer; // Multiple of PAGE SIZE

    D3DKMT_CREATEALLOCATION CreateAlloc = {};
    CreateAlloc.hDevice = SomeDevice;
    CreateAlloc.NumAllocations = 1;
    CreateAlloc.pAllocationInfo2 = &AllocInfo;
    CreateAlloc.pStandardAllocation = &StandardAlloc;
    CreateAlloc.Flags.ExistingSysMem = TRUE;

    ntStatus = D3DKMTCreateAllocation(&CreateAlloc);

Limitaciones de argumentos para D3DKMTCreateAllocation:

  • ExistingSysMem (o ExistingSection) solo se admite con StandardAllocation y viceversa.
  • NumAllocations compatibles es 1.
  • Solo se puede establecer uno de ExistingSysMem o ExistingSection .
  • Al crear una standardAllocation, siempre se deben establecer las marcas CreateShared y CrossAdapter .
  • ExistingSysMem (o ExistingSection) no se puede crear en un recurso existente (D3DKMT_CREATALLOCATION::hResource).

Requisitos

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

Consulte también

D3DKMT_CREATEALLOCATION

D3DKMTCreateAllocation2