Partager via


PFND3DKMT_CREATEALLOCATION fonction de rappel (d3dkmthk.h)

La fonction D3DKMTCreateAllocation crée des allocations de mémoire système ou vidéo.

Syntaxe

PFND3DKMT_CREATEALLOCATION Pfnd3dkmtCreateallocation;

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

Paramètres

unnamedParam1

pData [in, out]

Pointeur vers une structure de D3DKMT_CREATEALLOCATION qui contient des informations pour la création d’allocations.

Valeur retournée

D3DKMTCreateAllocation retourne l’une des valeurs suivantes :

Code de retour Description
STATUS_SUCCESS Les allocations ont été créées avec succès.
STATUS_DEVICE_REMOVED La carte graphique a été arrêtée ou le périphérique d’affichage a été réinitialisé.
STATUS_INVALID_PARAMETER Les paramètres ont été validés et déterminés comme incorrects.
STATUS_NO_MEMORY D3DKMTCreateAllocation n’a pas pu se terminer en raison d’une mémoire insuffisante.
STATUS_NO_VIDEO_MEMORY D3DKMTCreateAllocation n’a pas pu se terminer en raison d’une mémoire vidéo insuffisante. Le gestionnaire de mémoire vidéo tente de virtualiser la mémoire vidéo ; Toutefois, si la virtualisation échoue (par exemple, lorsque l’espace d’adressage virtuel est insuffisant), le gestionnaire de mémoire peut retourner ce code d’erreur.

Cette fonction peut également retourner d’autres valeurs NTSTATUS.

Remarques

OpenGL ICD utilise la fonction D3DKMTCreateAllocation pour créer des allocations et des ressources. Une allocation peut être associée à une ressource, ou une allocation peut être autonome. La fonction D3DKMTCreateAllocation peut également être utilisée pour ajouter des allocations supplémentaires à une ressource à tout moment. Les seules restrictions sont que toutes les allocations partagées doivent être associées à une ressource et que des allocations supplémentaires ne peuvent pas être ajoutées à une ressource partagée existante.

Exemples

L’exemple de code suivant montre comment un ICD OpenGL peut utiliser D3DKMTCreateAllocation pour créer une allocation autonome dans la mémoire vidéo qui n’est pas associée à une ressource.

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

L’exemple de code suivant montre comment un ICD OpenGL peut utiliser D3DKMTCreateAllocation pour créer une ressource avec une seule allocation de mémoire système.

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

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows Vista
Plateforme cible Universal
En-tête d3dkmthk.h (include D3dkmthk.h)

Voir aussi

D3DKMT_CREATEALLOCATION