Compartilhar via


PFND3DKMT_CREATEALLOCATION função de retorno de chamada (d3dkmthk.h)

A função D3DKMTCreateAllocation cria alocações de memória de sistema ou vídeo.

Sintaxe

PFND3DKMT_CREATEALLOCATION Pfnd3dkmtCreateallocation;

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

Parâmetros

unnamedParam1

pData [in, out]

Um ponteiro para uma estrutura de D3DKMT_CREATEALLOCATION que contém informações para criar alocações.

Retornar valor

D3DKMTCreateAllocation retorna um dos seguintes valores:

Código de retorno Descrição
STATUS_SUCCESS As alocações foram criadas com êxito.
STATUS_DEVICE_REMOVED O adaptador gráfico foi interrompido ou o dispositivo de exibição foi redefinido.
STATUS_INVALID_PARAMETER Os parâmetros foram validados e determinados como incorretos.
STATUS_NO_MEMORY D3DKMTCreateAllocation não pôde ser concluído devido à memória insuficiente.
STATUS_NO_VIDEO_MEMORY D3DKMTCreateAllocation não pôde ser concluído devido à memória de vídeo insuficiente. O gerenciador de memória de vídeo tenta virtualizar a memória de vídeo; no entanto, se a virtualização falhar (como, quando o espaço de endereço virtual se esgotar), o gerenciador de memória poderá retornar esse código de erro.

Essa função também pode retornar outros valores NTSTATUS.

Comentários

O OpenGL ICD usa a função D3DKMTCreateAllocation para criar alocações e recursos. Uma alocação pode ser associada a um recurso ou uma alocação pode ficar sozinha. A função D3DKMTCreateAllocation também pode ser usada para adicionar alocações adicionais a um recurso a qualquer momento. As únicas restrições são que todas as alocações compartilhadas devem ser associadas a um recurso e alocações adicionais não podem ser adicionadas a um recurso compartilhado existente.

Exemplos

O exemplo de código a seguir demonstra como um OpenGL ICD pode usar D3DKMTCreateAllocation para criar uma alocação autônoma na memória de vídeo que não está associada a um 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;
}

O exemplo de código a seguir demonstra como um OpenGL ICD pode usar D3DKMTCreateAllocation para criar um recurso com uma única alocação de memória do 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 Valor
Cliente mínimo com suporte Windows Vista
Plataforma de Destino Universal
Cabeçalho d3dkmthk.h (inclua D3dkmthk.h)

Confira também

D3DKMT_CREATEALLOCATION