¿Cuál es la ventaja del mecanismo de acceso directo al estado de OpenGL?


11

He estado leyendo sobre OpenGL 4.5 Direct State Access (DSA) en opengl.org y no estoy seguro de si lo estoy haciendo bien.

Parece implicar que la vieja forma es menos eficiente:

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

que la nueva forma:

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

Por lo que parece ahora, cada uno glSetdebe incluir glBind(something)dentro de él y si OpenGL sigue siendo una máquina de estado no puede aprovechar los cambios transmitidos aplicados a un solo something.

Explique el razonamiento y las ventajas del nuevo DSA.

Respuestas:


21

Por lo que parece ahora, cada glSet tiene que incluir glBind (algo) dentro de él

No exactamente. Es al revés, como se describe en varios párrafos a continuación.

Incluso si fuera cierto, recuerde que los comandos GL desde la aplicación cliente al servidor GL (también conocido como controlador) tienen una sobrecarga de despacho en comparación con una llamada de función normal. Incluso si suponemos que las funciones DSA son solo envoltorios alrededor de las funciones existentes, son envoltorios que viven dentro del servidor GL y, por lo tanto, pueden tener (un poco) menos sobrecarga.

si OpenGL sigue siendo una máquina de estado, no puede aprovechar los cambios transmitidos aplicados a un solo elemento.

Las GPU no son máquinas de estado. La interfaz de la máquina de estado GL es una emulación que envuelve elementos internos de controladores similares a DSA, no al revés.

Eliminar una capa de envoltura, una capa que requiere un número excesivo de llamadas en el servidor GL, es claramente una victoria, incluso si es pequeña.

El enfoque de máquina de estado tampoco tiene mucho sentido cuando se trata de múltiples hilos; GL sigue siendo terrible en este caso de uso, pero los controladores a menudo usan hilos detrás de escena, y una máquina de estados requiere mucha sincronización de hilos o algoritmos / construcciones paralelas realmente elegantes para que las cosas funcionen de manera confiable.

La extensión DSA continúa expresando su funcionamiento en términos de cambios de estado porque, después de todo, es una extensión de un documento basado en estado existente y no una API completamente nueva, por lo que tenía que estar lista para conectarse a la especificación GL existente Lenguaje y terminología del documento. Incluso si ese lenguaje existente es muy adecuado para su trabajo como una API moderna de hardware de gráficos.

Explique el razonamiento y las ventajas del nuevo DSA.

El mayor razonamiento es que la vieja forma era un dolor. Hacía muy difícil componer bibliotecas que pudieran modificar o depender del estado GL. Esto dificultó el encapsulado eficiente de la API GL en un estilo orientado a objetos o funcional debido a sus profundas raíces de gestión de estado procesal, lo que dificultó el encapsulamiento de la API en varios lenguajes que no son C y también dificultó proporcionar envoltorios de dispositivos gráficos eficientes ese resumen de OpenGL de Direct3D.

El segundo fue la sobrecarga de la API de máquina de estado procesal, como se describió anteriormente.

En tercer lugar, las funciones de DSA cambiaron la semántica, en su caso, de las API antiguas que permitieron una mayor eficiencia. Las cosas que anteriormente eran mutables se hicieron inmutables, por ejemplo, lo que elimina una gran cantidad de código de contabilidad del servidor GL. Las llamadas de la aplicación pueden enviarse al hardware o validarse antes (o de manera más paralela) cuando el servidor GL no tiene que lidiar con objetos mutables.

-

Se dan justificaciones y explicaciones adicionales en la especificación de extensión EXT_direct_state_access .

-

Los cambios de hardware que son relevantes para el diseño de la API son bastante numerosos.

Recuerde que OpenGL se remonta a 1991. El hardware objetivo no eran las tarjetas gráficas de nivel de consumidor (esas no existían) sino grandes estaciones de trabajo CAD y similares. El hardware de esa época tenía sobres de rendimiento muy diferentes a los actuales; el subprocesamiento múltiple era más raro, los buses de memoria y las CPU tenían menos espacio de velocidad, y la GPU hizo poco más que la representación de triángulo de función fija.

Se agregaron más y más funciones de función fija. Se agregaron varios modelos de iluminación, modos de textura, etc., cada uno necesita su propio estado. El enfoque simple basado en el estado funcionó cuando tenía un puñado de estados. A medida que se agregaron más y más estados, la API comenzó a explotar. La API se volvió más incómoda, pero no se alejó demasiado de los modos de hardware, ya que en realidad se basaban en muchos cambios de estado.

Luego, llegó el hardware programable. El hardware se ha vuelto cada vez más programable, hasta el punto de que ahora admite un pequeño estado, algunos programas proporcionados por el usuario y muchos buffers. Todo ese estado de la era anterior tenía que ser emulado, al igual que todas las características de función fija de esa era estaban siendo emuladas por los controladores.

El hardware también cambió para ser cada vez más paralelo. Esto requirió otros rediseños de hardware que hicieron que los cambios en el estado de los gráficos fueran muy caros. El hardware funciona en grandes bloques de estado inmutable. Debido a estos cambios, el controlador no podía simplemente aplicar cada bit del estado que el usuario configuró inmediatamente, sino que tenía que agrupar los cambios automáticamente y aplicarlos cuando fuera necesario de manera implícita.

El hardware moderno funciona aún más lejos del modelo clásico OpenGL. DSA es un pequeño cambio que se necesitaba hace más de 10 años (originalmente se prometió como parte de OpenGL 3.0), similar a lo que hizo D3D10. Muchos de los cambios de hardware anteriores necesitan mucho más que solo DSA para mantener relevante a OpenGL, por lo que aún están disponibles extensiones más grandes que cambian drásticamente el modelo de OpenGL . Luego está la nueva API GLnext plus D3D12, Mantle, Metal, etc., ninguna de las cuales mantiene la abstracción de la máquina de estado pasada de moda.


Gracias por la respuesta. Entonces, parece que antes algún punto de máquina de estado (no DSA) era una victoria, pero en algún momento algo ha cambiado y ahora DSA es ventajoso. ¿Puedes arrojar algo de luz sobre lo que ha cambiado?
Kromster

@KromStern: hice lo mejor que pude. Si necesita más detalles, alguien más informado que yo tendrá que proporcionarlo.
Sean Middleditch

@KromStern He visto (a partir de mi investigación limitada en la historia) que OpenGL se mueve a menos y menos llamadas de sorteo CPU por cuadro; mostrar listas (por lo que valían), glDrawArrays (dibujar en una llamada), VBO (subir a GPU una vez), VAO (vincular buffers a atributos una vez), objeto de buffer uniforme (configurar uniformes de una sola vez). Hay más de lo que me estoy perdiendo, estoy seguro.
monstruo de trinquete

@ratchetfreak: curiosamente, ahora nos estamos moviendo para otro lado. Las API / extensiones modernas se centran en aumentar nuestras llamadas de extracción por cuadro, principalmente mediante la eliminación de todo ese estado que debe establecerse / despacharse por llamada de extracción y hacer que las llamadas de extracción sean poco más que "insertar comando de extracción en la cola de comandos" contra una gran conjunto de estado estático y recursos sin enlace. Oooh, sin sentido, incluso olvidé mencionar esa parte en mi respuesta.
Sean Middleditch

@SeanMiddleditch Debería haber establecido llamadas por fotograma.
monstruo de trinquete

1

El resumen lo justifica por:

La intención de esta extensión es hacerla más eficiente para que las bibliotecas eviten alterar el selector y el estado bloqueado. La extensión también permite un uso más eficiente de los comandos al eliminar la necesidad de comandos de actualización del selector.

Creo que "más eficiente" aquí se refiere tanto a una menor sobrecarga de contabilidad para los autores de la biblioteca como a un mayor rendimiento. Con la API actual, para "comportarse bien" necesita consultar el estado, guardarlo, cambiar el estado para hacer lo que necesita y luego restaurar el estado original.

Me gusta

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

Presumiblemente, el hardware más antiguo podría ser más eficiente con la API explícita de cambio de estado; es un ritual bastante extraño de lo contrario. Esta extensión implica (¡y solo mire la lista de autores!) Que evitar esa recuperación, establecer y restaurar la danza ahora es más una ganancia de rendimiento en el hardware actual, incluso con el parámetro adicional en cada llamada.


"Necesito consultar / guardar / cambiar / restaurar": ¿cómo es mejor con DSA?
Kromster

..pseudocódigo agregado para mostrar. Con DSA, nada de eso es necesario. Presumiblemente, el hardware actual no necesita realmente un estado "vinculante", solo puede acceder a todo según sea necesario.
David Van Brink

La cadena get/bind/do/setrara vez se usa, porque 'Get' es muy lento. Por lo general, las aplicaciones tienen que mantener la réplica de las variables de todos modos, por lo que se reduce a solo bind/do. Aunque veo el punto.
Kromster

2
@krom get from driver state puede ser rápido, parte del estado gettable no tiene nada que ver con la GPU, por lo que solo se puede obtener de RAM, que es rápido.
monstruo de trinquete
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.