Share via


Introdução a um dispositivo no Direct3D 11

O modelo de objeto Direct3D 11 separa a funcionalidade de criação e renderização de recursos em um dispositivo e em um ou mais contextos; essa separação foi projetada para facilitar o multithreading.

Dispositivo

Um dispositivo é usado para criar recursos e enumerar os recursos de um adaptador de exibição. No Direct3D 11, um dispositivo é representado com uma interface ID3D11Device .

Cada aplicativo deve ter pelo menos um dispositivo; a maioria dos aplicativos só cria um dispositivo. Crie um dispositivo para um dos drivers de hardware instalados em seu computador chamando D3D11CreateDevice ou D3D11CreateDeviceAndSwapChain e especifique o tipo de driver com o sinalizador D3D_DRIVER_TYPE . Cada dispositivo pode usar um ou mais contextos de dispositivo, dependendo da funcionalidade desejada.

Contexto do dispositivo

Um contexto de dispositivo contém a circunstância ou a configuração na qual um dispositivo é usado. Mais especificamente, um contexto de dispositivo é usado para definir o estado do pipeline e gerar comandos de renderização usando os recursos pertencentes a um dispositivo. O Direct3D 11 implementa dois tipos de contextos de dispositivo, um para renderização imediata e outro para renderização adiada; ambos os contextos são representados com uma interface ID3D11DeviceContext .

Contexto Imediato

Um contexto imediato é renderizado diretamente para o driver. Cada dispositivo tem um e apenas um contexto imediato que pode recuperar dados da GPU. Um contexto imediato pode ser usado para renderizar (ou reproduzir) imediatamente uma lista de comandos.

Há duas maneiras de obter um contexto imediato:

Contexto Adiado

Um contexto adiado registra comandos de GPU em uma lista de comandos. Um contexto adiado é usado principalmente para multithreading e não é necessário para um aplicativo de thread único. Um contexto adiado geralmente é usado por um thread de trabalho em vez do thread de renderização main. Quando você cria um contexto adiado, ele não herda nenhum estado do contexto imediato.

Para obter um contexto adiado, chame ID3D11Device::CreateDeferredContext.

Qualquer contexto – imediato ou adiado – pode ser usado em qualquer thread, desde que o contexto seja usado apenas em um thread de cada vez.

Considerações de thread

Esta tabela realça as diferenças no modelo de threading no Direct3D 11 das versões anteriores do Direct3D.

Diferenças entre o Direct3D 11 e as versões anteriores do Direct3D:
Todos os métodos de interface ID3D11Device são de thread livre, o que significa que é seguro que vários threads chamem as funções ao mesmo tempo.

  • Todas as interfaces derivadas de ID3D11DeviceChild (ID3D11Buffer, ID3D11Query etc.) são de thread livre.
  • O Direct3D 11 divide a criação e a renderização de recursos em duas interfaces. Map, Unmap, Begin, End e GetData são implementados em ID3D11DeviceContext porque ID3D11Device define fortemente a ordem das operações. Interfaces ID3D11Resource e ID3D11Assíncronas também implementam métodos para operações de thread livre.
  • Os métodos ID3D11DeviceContext (exceto aqueles que existem em ID3D11DeviceChild) não são de thread livre, ou seja, exigem threading único. Apenas um thread pode estar chamando com segurança qualquer um de seus métodos (Desenhar, Copiar, Mapear etc.) por vez.
  • Em geral, o threading livre minimiza o número de primitivos de sincronização usados, bem como sua duração. No entanto, um aplicativo que usa a sincronização mantida por um longo tempo pode afetar diretamente a quantidade de simultaneidade que um aplicativo pode esperar alcançar.
Os métodos de interface ID3D10Device não foram projetados para serem de thread livre. ID3D10Device implementa todas as funcionalidades de criação e renderização (assim como ID3D9Device no Direct3D 9. Map e Unmap são implementados em interfaces derivadas de ID3D10Resource, Begin, End e GetData são implementados em interfaces derivadas de ID3D10Assíncronas.

Dispositivos