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 |