Condividi tramite


PFND3DKMT_CREATEALLOCATION funzione di callback (d3dkmthk.h)

La funzione D3DKMTCreateAllocation crea allocazioni di sistema o memoria video.

Sintassi

PFND3DKMT_CREATEALLOCATION Pfnd3dkmtCreateallocation;

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

Parametri

unnamedParam1

pData [in, out]

Puntatore a una struttura D3DKMT_CREATEALLOCATION che contiene informazioni per la creazione di allocazioni.

Valore restituito

D3DKMTCreateAllocation restituisce uno dei valori seguenti:

Codice restituito Descrizione
STATUS_SUCCESS Le allocazioni sono state create correttamente.
STATUS_DEVICE_REMOVED La scheda grafica è stata arrestata o il dispositivo di visualizzazione è stato reimpostato.
STATUS_INVALID_PARAMETER I parametri sono stati convalidati e determinati per essere non corretti.
STATUS_NO_MEMORY D3DKMTCreateAllocation non è stato possibile completare a causa di memoria insufficiente.
STATUS_NO_VIDEO_MEMORY D3DKMTCreateAllocation non è stato possibile completare a causa di memoria video insufficiente. La gestione memoria video tenta di virtualizzare la memoria video; tuttavia, se la virtualizzazione ha esito negativo (ad esempio, quando lo spazio indirizzi virtuale viene esaurito), la gestione memoria potrebbe restituire questo codice di errore.

Questa funzione potrebbe anche restituire altri valori NTSTATUS.

Commenti

OpenGL ICD usa la funzione D3DKMTCreateAllocation per creare allocazioni e risorse. Un'allocazione può essere associata a una risorsa o un'allocazione può essere autonoma. La funzione D3DKMTCreateAllocation può essere usata anche per aggiungere allocazioni aggiuntive a una risorsa in qualsiasi momento. Le uniche restrizioni sono che tutte le allocazioni condivise devono essere associate a una risorsa e le allocazioni aggiuntive non possono essere aggiunte a una risorsa condivisa esistente.

Esempio

Nell'esempio di codice seguente viene illustrato come un ICD OpenGL può usare D3DKMTCreateAllocation per creare un'allocazione autonoma nella memoria video che non è associata a una risorsa.

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

Nell'esempio di codice seguente viene illustrato come un ICD OpenGL può usare D3DKMTCreateAllocation per creare una risorsa con una singola allocazione di memoria di 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;
}

Requisiti

Requisito Valore
Client minimo supportato Windows Vista
Piattaforma di destinazione Universale
Intestazione d3dkmthk.h (include D3dkmthk.h)

Vedi anche

D3DKMT_CREATEALLOCATION