Collabora detalha trabalhos OpenGL sobre o DirectX

Collabora anuncia PanVk, um driver Vulkan de código aberto para GPUs ARM Mali
collabora

No início deste ano, o Projeto Collabora anunciou um novo projeto em parceria com a Microsoft: a implementação das camadas de tradução OpenCL e OpenGL para DirectX 12 (repositório Git). Agora, a equipe resolveu aprofundar sobre o que realmente está sendo feito em relação ao OpenGL. E mais especificamente as etapas que foram tomadas para melhorar o desempenho do driver OpenGL-On-D3D12. Assim, a Collabora detalha trabalhos OpenGL sobre o DirectX.

As explicações foram dadas por Louis-Francis Ratté-Boulianne em uma postagem no blog da Collabora. Segundo ele, desde o início do projeto perceberam que o melhor caminho a seguir era construir sobre o Mesa. O projeto Zink já provou, segundo ele, que poderiam alcançar um objetivo semelhante: traduzir o OpenGL para uma API gráfica de nível inferior (s/Vulkan/DirectX12/).

Collabora detalha trabalhos OpenGL sobre o DirectX

O rastreador do estado do Mesa é responsável por converter o estado do OpenGL (modos de mesclagem, estado da textura etc.) e desenhar comandos (como glDrawArrays e glDrawPixels) em objetos e operações que mapeiam bem os recursos modernos de hardware da GPU (API Gallium). O “Driver D3D12” é, portanto, uma implementação dessa interface.

Em relação ao shader, o rastreador de estado é capaz de converter as funções fixas do OpenGL, tradicionalmente implementadas diretamente pelo hardware, em shaders. O Mesa também converterá os shaders GLSL em uma representação intermediária denominada NIR. Eles usaram essa representação para produzir o bytecode DXIL consumido pelo DirectX.

Finalmente, um componente diferente do Mesa, o rastreador de estado WGL, está lidando com chamadas WGL (API entre o OpenGL e a interface do sistema do Windows). Internamente, uma implementação existente do sistema estava usando GDI (Graphics Device Interface) para realmente exibir os quadros renderizados na tela. Assim, adicionaram uma nova implementação usando DXGI Swapchains.

DirectX 12-101

Para entender melhor as próximas seções, Louis-Francis se aprofunda nos detalhes sobre o DirectX 12. Este exige que gravemos comandos (por exemplo, limpando o destino de renderização, faça chamadas etc.) em uma ID3D12GraphicsCommandListe depois chame Execute()para realmente processar os comandos. Mas antes que possamos gravar comandos, primeiro precisamos definir algum estado na lista de comandos. Incluindo:

  • Janela de visualização, recorte, fator de mesclagem, topologia (se quisermos desenhar pontos, linhas ou triângulos), buffers de vértice e índice.
  • Recursos de renderização de alvos e profundidade/estêncil: onde a chamada de desenho renderizará os pixels resultantes.
  • Objeto de estado do pipeline (bits de estado que provavelmente permanecerão os mesmos para vários sorteios): sombreadores compilados (bytecode do DXIL), estado da mistura, profundidade/estêncil/estado alfa, estado do rasterizador …
  • Assinatura raiz: define quais tipos de recursos estão vinculados ao pipeline de gráficos. Por exemplo, se um pipeline exigir acesso a duas texturas, a assinatura raiz declarará um parâmetro com um intervalo de 2 descritores no heap SRV (exibição de recurso de sombreamento).
  • Heaps do descritor: onde definimos os descritores relevantes para recursos, samplers e buffers constantes.
  • Estado do recurso: descrição de como uma GPU pretende acessar um recurso. Barreiras de transição são necessárias para garantir o estado adequado de um comando. Por exemplo, antes da amostragem de uma textura, precisamos garantir que a fonte esteja no estado D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE. Os detalhes exatos da transição variam de hardware para hardware, mas assegura minimamente que todas as gravações na textura sejam concluídas, que o recurso tenha o layout adequado (por exemplo, (des) compactação) e que o cache seja coerente.

Collabora detalha trabalhos OpenGL sobre o DirectX e traça implementações futuras

Em seguida, ele vai esmiuçar ainda mais tudo o que foi feito, explicando tecnicamente como se desenvolveu essa parte do projeto. Para mais detalhes, você pode acompanhar tudo na postagem original. Não antes de dar algumas das ideias que pode ainda ser feito:

  • Análise adicional de sobrecarga da CPU
  • Otimize o número de lotes e o tamanho das pilhas de descritores
  • Texturas colocadas (subalocação de uma textura grande)
  • As cópias com o mesmo sub-recurso sempre serão mais ineficientes, a menos que possamos contornar essa
  • Restrição DirectX 12
  • Use uma BO diferente quando todo o conteúdo for descartado
  • Criar assinatura raiz do bucket (arredondar o tamanho necessário para os intervalos do descritor)

Além de Louis-Francis Ratté-Boulianne, a equipe é composta por cinco engenheiros da Collabora (Boris Brezillon, Daniel Stone, Elie Tournier, Erik Faye-Lund, Gert Wollny) e dois engenheiros da Microsoft DirectX (Bill Kristiansen, Jesse Natalie).