Suporte a threading, listas de comandos e pipeline 3D

Esta seção se aplica somente ao Windows 7 e posterior e ao Windows Server 2008 R2 e versões posteriores do sistema operacional Windows.

Um driver de exibição no modo de usuário indica os novos recursos do Direct3D versão 11 compatíveis (por exemplo, threading, listas de comandos e pipeline 3D) quando o runtime do Direct3D versão 11 chama a função GetCaps(D3D10_2) do driver. GetCaps(D3D10_2) é uma das funções específicas do adaptador do driver que o driver fornece na estrutura D3D10_2DDI_ADAPTERFUNCS para a qual o membro pAdapterFuncs_2 da estrutura D3D10DDIARG_OPENADAPTER aponta. Para obter mais informações sobre como fornecer funções específicas do adaptador durante a inicialização do driver, consulte Inicializando a comunicação com a DDI do Direct3D versão 11. Quando sua função GetCaps(D3D10_2) é chamada, o driver de exibição do modo de usuário fornece novos recursos do Direct3D versão 11 com base no tipo de solicitação (que é especificado no membro Type da estrutura D3D10_2DDIARG_GETCAPS à qual o parâmetro pData da função GetCaps(D3D10_2) aponta para).

Threading e listas de comandos

A API do Direct3D versão 11 requer um modo de operação em que pode sincronizar os threads do aplicativo para garantir que apenas um dos threads seja executado na DDI de cada vez. A API do Direct3D versão 11 também requer um modo de operação com uma emulação de software de listas de comandos. Esses modos de operação são exigidos e aproveitados em DDIs de versão anterior (como a DDI do Direct3D versão 10). Portanto, como um auxílio de desenvolvimento para gravadores de driver, esses mesmos modos de operação são estendidos para existir na DDI do Direct3D versão 11. Os gravadores de driver podem decidir quais modos de operações gostariam que seus drivers dessem suporte para a DDI do Direct3D versão 11.

Todos os drivers devem eventualmente dar suporte total a todos os tipos de operações de threading (ou seja, todos os drivers devem eventualmente dar suporte a todos os recursos de threading da estrutura de D3D11DDI_THREADING_CAPS ). No entanto, o driver pode exigir que a API emule listas de comandos ou imponha um modo de operação de thread único para o driver. A API deve estar ciente dos recursos de threading do driver durante a criação de um dispositivo de API, mas antes da criação de um dispositivo DDI. Portanto, o runtime determina os recursos de threading do driver quando ele chama a função específica do adaptador GetCaps(D3D10_2) do driver com o membro Type de D3D10_2DDIARG_GETCAPS definido como D3D11DDICAPS_THREADING. O driver retorna um ponteiro para uma estrutura D3D11DDI_THREADING_CAPS no membro pData do D3D10_2DDIARG_GETCAPS que identifica os recursos de threading do driver. O driver deverá dar suporte ao modo de thread livre (D3D11DDICAPS_FREETHREADED) se o driver também der suporte a listas de comandos (D3D11DDICAPS_COMMANDLISTS_BUILD_2) porque as listas de comandos se baseiam no modo de thread livre. O driver deve aceitar para dar suporte ao modo de thread livre e às listas de comandos. O aplicativo pode determinar o suporte que o driver indicou por meio do uso da função CheckFeatureSupport no nível do aplicativo e da constante D3D11_FEATURE_THREADING; no entanto, alguns aplicativos podem não se importar devido ao suporte que a API fornece.

Nível de pipeline 3D

Os drivers que dão suporte à DDI do Direct3D versão 11 não são necessários para dar suporte a todos os recursos de hardware da DDI do Direct3D versão 11. Os drivers podem dar suporte ao novo modelo de threading da DDI do Direct3D versão 11 sobre o hardware que dá suporte apenas à DDI do Direct3D versão 10. O runtime do Direct3D versão 11 determina o nível máximo de suporte de hardware do driver quando o runtime chama a função GetCaps(D3D10_2) do driver com o membro Type de D3D10_2DDIARG_GETCAPS definido como D3D11DDICAPS_3DPIPELINESUPPORT. O driver retorna um ponteiro para uma estrutura D3D11DDI_3DPIPELINESUPPORT_CAPS no membro pData de D3D10_2DDIARG_GETCAPS que identifica o nível máximo de hardware de suporte.

A API não usa apenas a versão DDI como o indicador principal do suporte ao nível de recurso da API; a API permite que o driver se alimente novamente nesse processo. O runtime escolhe um valor D3D11DDI_3DPIPELINELEVEL e alimenta de volta o valor para o driver durante a criação do dispositivo em uma chamada para a função CreateDevice(D3D10) do driver, como parte do membro Flags da estrutura D3D10DDIARG_CREATEDEVICE .

Se o driver der suporte a níveis de hardware menores que o Direct3D versão 11 na DDI do Direct3D versão 11, haverá pequenas ramificações na operação do driver. A primeira é que o runtime do Direct3D versão 11 pode nunca chamar muitas novas funções DDI do Direct3D versão 11. Por exemplo, o runtime do Direct3D versão 11 não chamará nenhuma das novas funções DDI de estágio de sombreador (como DsSetShader) se o driver der suporte a um nível de recurso de hardware menor que o Direct3D versão 11. Outras funções DDI seguem as regras do nível de recurso e ignoram o fato de que a DDI do Direct3D versão 11 pode estar associada a funcionalidades mais altas. Por exemplo, embora IAVertexInputSlots para a API direct3D versão 11 seja 32, o nível de recurso do Direct3D versão 10 permite apenas 16 e é isso que o driver deve esperar.

Recursos preteridos ou convertidos apresentam outro aspecto interessante. A substituição não é possível no nível de DDI do Direct3D versão 11 porque a substituição deve dar suporte à capacidade de expressar funções DDI de versão anterior. Por exemplo, a versão da API direct3D 11 do PIPELINESTATS é sempre constante; no entanto, ele solicita diferentes D3D10_DDI_QUERY_DATA_PIPELINE_STATISTICS com níveis de recursos do Direct3D 10 e D3D11_DDI_QUERY_DATA_PIPELINE_STATISTICS com níveis de recursos do Direct3D 11 e assim por diante. Embora a API tenha tentado preterir o tamanho do filtro de texto, é mais fácil para os drivers preterir a entrada da tabela de funções DDI, em sua totalidade, do que tentar reutilizar a entrada da tabela de funções para outra coisa.

Mesmo que um driver que dê suporte à DDI do Direct3D versão 11 não dê suporte ao nível de recurso completo do Direct3D versão 11, o driver não poderá recusar o "reconhecimento de formato estendido", conforme descrito em Suporte ao Reconhecimento de Formato Estendido. Como o driver dá suporte à DDI do Direct3D versão 11, o driver deve lidar com as seguintes tarefas:

  • Dar suporte a formatos BGR

  • Responda corretamente às chamadas à função CheckFormatSupport para marcar para XR_BIAS suporte. O driver deve reivindicar suporte ou negar suporte.

  • Permitir a conversão de buffers de back totalmente tipado

A API direct3D versão 11 também informa ao driver se o aplicativo usa vários threads por meio do sinalizador D3D11DDI_CREATEDEVICE_FLAG_SINGLETHREADED. Se esse sinalizador estiver presente no membro Flags da estrutura D3D10DDIARG_CREATEDEVICE quando um dispositivo de exibição for criado por meio de uma chamada para a função CreateDevice(D3D10) do driver, o driver poderá determinar que nenhum contexto adiado é criado e que o driver não é necessário para sincronizar, pois as criações simultâneas não ocorrem.