Camadas de API (Direct3D 10)
O runtime do Direct3D 10 é construído com camadas, começando com a funcionalidade básica no núcleo e criando funcionalidades opcionais e de assistência para desenvolvedores em camadas externas.
Camada Principal
A camada principal existe por padrão; fornecendo um mapeamento muito fino entre a API e o driver do dispositivo, minimizando a sobrecarga para chamadas de alta frequência. Como a camada principal é essencial para o desempenho, ela executa apenas a validação crítica.
As camadas restantes são opcionais. Como regra geral, as camadas adicionam funcionalidade, mas não modificam o comportamento existente. Por exemplo, as funções principais terão os mesmos valores retornados independentemente da camada de depuração ser instanciada, embora a saída de depuração adicional possa ser fornecida se a camada de depuração for instanciada.
Crie camadas quando um dispositivo é criado chamando D3D10CreateDevice e fornecendo um ou mais valores D3D10_CREATE_DEVICE_FLAG .
Camada de depuração
A camada de depuração fornece amplo parâmetro adicional e validação de consistência (como validar a vinculação do sombreador e a associação de recursos, validar a consistência do parâmetro e relatar descrições de erro). A saída gerada pela camada de depuração consiste em uma fila de cadeias de caracteres acessíveis usando a Interface ID3D10InfoQueue (consulte Personalizar a saída de depuração com ID3D10InfoQueue (Direct3D 10)). Os erros gerados pela camada principal são realçados com avisos pela camada de depuração.
Para criar um dispositivo que dê suporte à camada de depuração, instale o SDK do DirectX (para obter D3D10SDKLayers.DLL) e especifique o sinalizador D3D10_CREATE_DEVICE_DEBUG ao chamar D3D10CreateDevice. É claro que a execução de um aplicativo com a camada de depuração será substancialmente mais lenta. Para habilitar/desabilitar mensagens de depuração para APIs D3DX10, chame D3DX10DebugMute.
Quando a camada de depuração lista vazamentos de memória, ela gera uma lista de ponteiros de interface de objeto junto com seus nomes amigáveis. O nome amigável padrão é "<sem nome>". Você pode definir o nome amigável usando o método ID3D10DeviceChild::SetPrivateData e o GUID WKPDID_D3DDebugObjectName que está em D3Dcommon.h. Por exemplo, para nomear pTexture com um nome SDKLayer de mytexture.jpg, use o seguinte código:
const char c_szName[] = "mytexture.jpg";
pTexture->SetPrivateData( WKPDID_D3DDebugObjectName, sizeof( c_szName ) - 1, c_szName );
Normalmente, você deve compilar essas chamadas de sua versão de produção.
Camada alternar para referência
Essa camada permite que um aplicativo faça a transição entre um HAL (dispositivo de hardware) e um REF (dispositivo de referência ou software). Para alternar um dispositivo, primeiro você deve criar um dispositivo que dê suporte à camada switch-to-reference (consulte D3D10CreateDevice) e, em seguida, chamar ID3D10SwitchToRef::SetUseRef.
Todos os estados, recursos e objetos do dispositivo são mantidos por meio dessa transição de dispositivo. No entanto, às vezes, não é possível corresponder exatamente aos dados de recurso. Isso ocorre devido ao fato de que algumas informações estão disponíveis para um dispositivo de hardware que não está disponível para um dispositivo de referência.
Praticamente todos os aplicativos em tempo real usam a implementação HAL do pipeline. Quando o pipeline é alternado de um dispositivo de hardware para um dispositivo de referência, as operações de renderização são feitas simultaneamente em hardware e software. Como o dispositivo de software está sendo renderizado, ele exigirá que os recursos sejam baixados na memória do sistema. Isso pode exigir que outros recursos armazenados em cache na memória do sistema sejam removidos para abrir espaço.
Observação
Esse recurso de camada de alternância para referência tem suporte apenas no Direct3D 10 e no Direct3D 10.1 e não tem mais suporte no Direct3D 11 e versões posteriores.
Camada de Thread-Safe
Essa camada foi projetada para permitir que aplicativos com vários threads acessem o dispositivo de vários threads.
Um aplicativo Direct3D 10 pode controlar uma sincronização de dispositivo usando funções de dispositivo. Isso permite que um aplicativo habilite/desabilite seções críticas (habilitando/desabilitando temporariamente a proteção multithreading) e faça/libere um bloqueio de seção crítica em vários pontos de entrada da API do Direct3D 10. A camada thread-safe está habilitada por padrão. Para aplicativos de thread único, a camada thread-safe não tem impacto no desempenho.
Diferenças entre o Direct3D 9 e o Direct3D 10:
- Ao contrário do Direct3D 9, a API do Direct3D 10 usa como padrão totalmente thread-safe.
Tópicos relacionados