Qual é a vantagem do mecanismo de acesso direto ao estado do OpenGL?


11

Eu tenho lido sobre o OpenGL 4.5 Direct State Access (DSA) no opengl.org e não tenho certeza se estou acertando.

Parece implicar que a maneira antiga é menos eficiente:

glBind(something)
glSetA(..)
glSetB(..)
glSetC(..)

do que a nova maneira:

glSetA(something, ..)
glSetB(something, ..)
glSetC(something, ..)

Pelo que parece, agora cada um glSetdeve incluir glBind(something)dentro dele e se o OpenGL ainda é uma máquina de estado não pode tirar proveito das alterações transmitidas aplicadas a um único something.

Por favor, explique o raciocínio e as vantagens do novo DSA.

Respostas:


21

Pela aparência, agora cada glSet deve incluir glBind (algo) dentro dele

Não exatamente. É o contrário, como descrito em vários parágrafos abaixo.

Mesmo se isso fosse verdade, lembre-se de que os comandos GL do aplicativo cliente para o servidor GL (também conhecido como driver) têm muita sobrecarga de despacho em comparação com uma chamada de função regular. Mesmo se assumirmos que as funções DSA são apenas invólucros em torno das funções existentes, eles são invólucros que vivem dentro do servidor GL e, portanto, podem ter (um pouco) menos sobrecarga.

se o OpenGL ainda é uma máquina de estado, não pode tirar proveito das alterações transmitidas aplicadas a um único item.

GPUs não são máquinas de estado. A interface da máquina de estado GL é uma emulação que envolve os drivers do tipo DSA, e não o contrário.

A remoção de uma camada de quebra automática - uma camada que requer um número excessivo de chamadas no servidor GL - é claramente uma vitória, mesmo que pequena.

A abordagem da máquina de estado também não faz muito sentido ao lidar com vários threads; A GL ainda é péssima nesse caso de uso, mas os drivers costumam usar threads nos bastidores, e uma máquina de estado exige muita sincronização de threads ou algoritmos / construções paralelos realmente sofisticados para fazer as coisas funcionarem de maneira confiável.

A extensão DSA continua expressando sua operação em termos de alterações de estado porque, afinal, é uma extensão de um documento baseado em estado existente e não uma API totalmente nova, portanto, precisava estar pronto para se conectar à especificação GL existente linguagem e terminologia do documento. Mesmo que essa linguagem existente seja bastante adequada ao seu trabalho como uma API de hardware gráfico moderna.

Por favor, explique o raciocínio e as vantagens do novo DSA.

O maior raciocínio é que a maneira antiga era uma dor. Tornou muito difícil compor bibliotecas em conjunto que pudessem modificar ou confiar no estado GL. Isso dificultou o empacotamento eficiente da API GL em um estilo orientado a objeto ou funcional devido às suas raízes profundas de gerenciamento de estado processual, o que dificultou o empacotamento da API em várias linguagens não C e também o fornecimento de empacotadores de dispositivos gráficos eficientes esse OpenGL abstrato do Direct3D.

O segundo foi a sobrecarga da API de máquina de estado processual, conforme descrito anteriormente.

Terceiro, as funções do DSA alteraram a semântica, quando apropriado, das APIs antigas que permitiam maior eficiência. Coisas que antes eram mutáveis ​​se tornaram imutáveis, por exemplo, o que remove muitos códigos de contabilidade do servidor GL. As chamadas do aplicativo podem ser enviadas para o hardware ou validadas mais cedo (ou em modas mais paralelas) quando o servidor GL não precisar lidar com objetos mutáveis.

-

Justificativa e explicação adicionais são fornecidas na especificação de extensão EXT_direct_state_access .

-

As alterações de hardware relevantes para o design da API são bastante numerosas.

Lembre-se de que o OpenGL remonta a 1991. O hardware alvo não eram placas gráficas de nível consumidor (elas não existiam), mas grandes estações de trabalho CAD e similares. O hardware daquela época tinha envelopes de desempenho muito diferentes dos atuais; o multi-threading era mais raro, os barramentos de memória e as CPUs tinham menos brechas de velocidade e a GPU fazia pouco mais do que a renderização de triângulo de função fixa.

Mais e mais recursos de função fixa foram adicionados. Vários modelos de iluminação, modos de textura etc. foram todos adicionados, cada um precisando de seu próprio estado. A abordagem simples baseada em estado funcionou quando você tinha vários estados. À medida que mais e mais estados foram adicionados, a API começou a explodir nas costuras. A API tornou-se mais complicada, mas não divergiu muito dos modos de hardware, pois eram realmente baseadas em muitas opções de estado.

Então, veio o hardware programável. O hardware tornou-se cada vez mais programável, a ponto de agora, o hardware suportar um pouco de estado, alguns programas fornecidos pelo usuário e muitos buffers. Todo esse estado da época anterior tinha que ser emulado, assim como todos os recursos de função fixa daquela época estavam sendo emulados pelos motoristas.

O hardware também mudou para ficar cada vez mais paralelo. Isso exigiu outras reformulações de hardware que tornaram as alterações de estado dos gráficos muito caras. O hardware funciona em grandes blocos de estado imutável. Devido a essas alterações, o driver não pôde simplesmente aplicar cada pedacinho do estado que o usuário definiu imediatamente, mas teve que agrupar as alterações automaticamente e aplicá-las quando necessário implicitamente.

O hardware moderno opera ainda mais do modelo clássico OpenGL. O DSA é uma pequena mudança necessária há mais de 10 anos (foi originalmente prometida como parte do OpenGL 3.0), semelhante ao que o D3D10 fez. Muitas das alterações de hardware acima precisam muito mais do que apenas o DSA para manter o OpenGL relevante, e é por isso que ainda estão disponíveis grandes extensões que alteram drasticamente o modelo OpenGL . Depois, há toda a nova API GLnext, além de D3D12, Mantle, Metal, etc. nenhuma delas mantém a abstração obsoleta da máquina de estado.


Obrigado pela resposta. Portanto, parece que antes de alguma máquina de estado de ponto (não DSA) ter sido uma vitória, mas em algum momento algo mudou e agora a DSA é vantajosa. Você pode esclarecer o que mudou?
Kromster

@ KromStern: fiz o meu melhor. Se você precisar de mais detalhes, alguém com mais conhecimento do que eu precisarei fornecer.
Sean Middleditch

@KromStern que eu vi (da minha pesquisa limitada na história) o openGL se movendo para cada vez menos chamadas de chamada por CPU; exibir listas (pelo que valiam), glDrawArrays (desenhar em uma chamada), VBOs (carregar uma vez na GPU), VAOs (ligar buffers aos atributos uma vez), objeto de buffer uniforme (definir uniformes de uma só vez). Estou perdendo mais, tenho certeza.
roquete aberração

@ratchetfreak: curiosamente, estamos nos movendo para o outro lado agora. As modernas APIs / extensões estão focadas em aumentar nossas chamadas de desenho por quadro, principalmente removendo todo o estado que deve ser definido / despachado por chamada de desenho e tornando as chamadas de desenho pouco mais do que "inserir comando de desenho na fila de comandos" em um grande conjunto de estado estático e recursos sem ligação. Oooh, sem limites, eu esqueci de mencionar essa parte na minha resposta.
Sean Middleditch

@SeanMiddleditch Eu deveria ter definido chamadas por quadro.
roquete aberração

1

A visão geral justifica:

A intenção dessa extensão é torná-la mais eficiente para as bibliotecas, para evitar perturbar o seletor e o estado travado. A extensão também permite o uso mais eficiente de comandos, eliminando a necessidade de comandos de atualização do seletor.

Eu acho que "mais eficiente" aqui refere-se a menos sobrecarga de escrituração contábil para os autores da biblioteca e a um desempenho mais alto resultante. Com a API atual, para ser "bem comportado", é necessário consultar o estado, ocultar, alterar o estado para fazer o que você precisa e restaurar o estado original.

Gostar

oldState = glGet()
glBind()
glDoThings...
glSet(oldState)  // restore, in case anyone needs it just as they left it

Presumivelmente, o hardware mais antigo poderia ter um desempenho melhor com a API de mudança de estado explícita; caso contrário, é um ritual muito estranho. Essa extensão implica (e basta olhar para a lista de autoria!) Que evitar essa busca, definir e restaurar a dança é agora mais uma conquista de desempenho no hardware atual, mesmo com o parâmetro adicional em cada chamada.


"precisa consultar / stash / alterar / restaurar" - como é melhor com o DSA?
Kromster

..adicionou pseudo-código para mostrar. Com o DSA, nada disso é necessário. Presumivelmente, o hardware atual realmente não precisa do estado "obrigatório", pode apenas acessar tudo conforme necessário.
David van brink

A cadeia get/bind/do/setraramente é usada, porque 'Get' é muito lento. Normalmente, os aplicativos precisam manter a réplica das variáveis ​​de qualquer maneira, para reduzir para apenas bind/do. Eu vejo o ponto, no entanto.
Kromster

2
O @krom get from driver state pode ser rápido, alguns dos estados gettable não têm nada a ver com a GPU, portanto podem ser obtidos da RAM, o que é rápido.
roquete aberração
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.