Compartilhar via


Função D3DKMTCreateAllocation2 (d3dkmthk.h)

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

Sintaxe

NTSTATUS D3DKMTCreateAllocation2(
  D3DKMT_CREATEALLOCATION *unnamedParam1
);

Parâmetros

unnamedParam1

[in, out] pData: um ponteiro para uma estrutura D3DKMT_CREATEALLOCATION que contém informações para criar alocações.

Retornar valor

D3DKMTCreateAllocation2 retornará STATUS_SUCCESS se a operação for bem-sucedida. Caso contrário, ele poderá retornar um código NTSTATUS , como um dos seguintes valores:

Código de retorno Descrição
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 Essa rotina não pôde ser concluída devido à memória insuficiente do sistema.
STATUS_NO_VIDEO_MEMORY Essa rotina não pôde ser concluída 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.

Comentários

Um cliente de gráficos no modo de usuário pode chamar D3DKMTCreateAllocation2 para criar alocações e recursos. Uma alocação pode ser associada a um recurso ou pode ficar sozinha.

D3DKMTCreateAllocation2 também pode ser chamado 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

Criando uma alocação autônoma na memória de vídeo que não está associada a um recurso

O exemplo de código a seguir demonstra como um cliente de gráficos no modo de usuário pode usar D3DKMTCreateAllocation2 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_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;
}

Criando um recurso com uma única alocação de memória do sistema

O exemplo de código a seguir demonstra como um cliente de gráficos no modo de usuário pode usar D3DKMTCreateAllocation2 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_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 Valor
Cliente mínimo com suporte Windows 7
Plataforma de Destino Universal
Cabeçalho d3dkmthk.h (inclua D3dkmthk.h)
Biblioteca Gdi32.lib
DLL Gdi32.dll

Confira também

D3DKMT_CREATEALLOCATION