Blog Personal.

PlayStation 5, PS5, Xbox Series X, XSX

PS5 y XSX: Geometry Engine

Uno de los problemas que tenía PlayStation 3 era que su GPU estaba limitada en cuanto al cálculo geometría.

Hay muy, pero que muy pocos momentos donde uno escogería la GPU de PS3 por encima de la de 360 debido a que la de PS3 es debil comparada con la de 360. No es mi opinión, preguntadle a otros desarrolladores lo que piensan de esta. Sony escogió pobremente el hardware de video. A nivel de rendimiento, la 360 renderizara más rápido que la PS3 cada vez si le entregas la misma escena en 3D. La única manera de que la PS3 pueda mantener el tipo, es utilizar a los SPE para que hagan un pre-procesamiento de tu escena 3D.

Esto forzaba a que los desarrolladores tuvieran que tirar de los SPE del CBEA (las unidades especiales de su CPU) para realizar algo llamado Pre-Culling.

La idea no era otra que eliminar los vertices no visibles de la escena para que los Vertex Shaders del RSX no los tengan que calcular. Para ello los SPE del CBEA funcionaban como una pre-GPU y pre-procesan el fotograma antes de que el RSX dibuje la escena final.  Es decir, la geometría de la escena es procesada en los SPE pero sin tener en cuenta elementos como el Vertex Color ni los diferentes shaders y sin llegar a rasterizar dicha geometría en forma de fragmentos sino que básicamente la idea es llegar de todo el pipeline geométrico hasta justo antes del rasterizado.

¿Para que? Pues para tener una lista de la geometría superflua, es decir:

La eliminacion de triangulos en la escena que…

… son transformados pero que al aplicar las coordenadas de cámara/eye coordinates acaba fuera de escena por estar de espaldas a la cámara.

… se encuentran fuera de la pantalla (Viewport) pero aún así son calculados por el Vertex Shader.

… son lo demasiado pequeños y estan a una distancia lo suficientemente lejana de la cámara como para que el RSX rasterizar y luego texturizar, por lo que es una tontería calcular la geometría de estos.

… a la hora de rasterizarse no llegan a tocar ni un pixel de la escena y por tanto la unidad de rasterizado los descartará de entrada. 

Esto lo que provocaba es que la geometría de los juegos de PS3 se optimizará y es el mismo motivo por el cual hubo una evolución en la forma de utilizar el calculo de la geometria, de manera inteligente según la distancia ya que no tiene sentido dar detalle geométrico masivo a los planos alejados de la escena.

Microsoft en cambio con Xbox 360 no tenia este problema, pero no nos quedemos en la generación anterior y saltemos a la actual…

Sony lanza una arquitectura distinta, deciden enviar el CBEA al guano y con ello los SPE. ¿La sugerencia de Sony? Pasar algunos de los trabajos del CBEA a la CPU…

¿El gran problema? Los núcleos Jaguar de la CPU no son los suficientemente rápidos, lo mejor es utilizar los nuevos Compute Shader de la GPU pero tenemos un problema. Los SPE se programaban con C y C++, pero la GPU de PlayStation 4 no… Este… ¿Tiene la suficiente potencia como para ejecutar los juegos de esta generación sin pre-culling? Si… ¡Pues tiremos para adelante sin él!

Pero claro, era una forma eficiente de aumentar la calidad gráfica en PS3 que puede ayudar en cualquier sistema. ¿Que hacen? Empiezan a plantearse el hecho de implementar el concepto del Pre-Culling pero utilizando los Compute Shaders de la GPU para ello como etapa previa a los Vertex Shaders y con PS4 recien terminada deciden publicar una patente donde hablan del tema.

¿Tiene que ver esto con el Geometry Engine del que hablo Cerny en su presentación? No, no tiene nada que ver aunque el problema que busca solventar el «Geometry Engine» es el mismo, su funcionamiento es distinto y el Geometry Engine no es ningún tipo de unidad especial sino que es el nuevo pipeline geométrico que reemplaza al que hemos tenido hasta ahora y nos ha traido los Mesh/Primitive Shader.

Renderizar una escena en 3D a tiempo real tiene una definición muy simple, la CPU le pasa una lista de la geometría que ha de renderizar y como, entonces la GPU sigue siempre las mismas etapas generales para renderizar la escena. Cada triangulo es primero procesado en el pipeline geométrico, es rasterizado para convertirlo en un fragmento y posteriormente se le da color y voila… ¡Acaba siendo un montón de pixeles en tu pantalla! El problema de todo esto es que es como una cadena de montaje y el cuello de botella de etapas anteriores afecta a etapas posteriores y de la misma manera la carga de trabajo.

Pero en el pipeline gráfico que hemos tenido hasta ahora y seguimos teniendo en los juegos no podemos hacer tecnicas de Culling, la unidad de teselación que es de función fija (Primitive Engine) no es programable sino de función fija y si queremos eliminar la geometria con los Geometry Shaders ya podemos decir adios, es más, dado que los Geometry Shaders van después de la teselación este acaba eliminando también la geometría sobre-teselada por lo que en el fondo…

AMD a partir del pre-lanzamiento de Vega empezó a hablar del «New Geometry Pipeline» y a utilizar un termino que se convirtió en Vaporware llamado «Primitive Shader».

Los Primitive Shaders se idearon entre otras cosas para hacer lo que Mark Cerny a través de la patente pedía, pero el planteamiento era también el de acortar el número de etapas de tal manera que:

  • Vertex Shader+Hull Shader= Surface Shader. (Teselación Activa)
  • Domain Shader+Geometry Shader= Primitive Shader. (Teselación Activa)

Pasando de esto:

A esto:

No obstante el Surface Shader tiene una particularidad:

Los cambios en la patente son descritos de la siguiente manera:

  1. El Surface Shader solo se utiliza cuando esta activada la teselación como etapa posterior, si lo esta entonces este implementa la funcionalidad de las etapas Vertex Shader y Hull Shader.
  2. El Teselador esta implementado a través de un hardware de función fija.
  3. Cuando la teselación esta activa, el primitive shader y implementa la funcionalidad de las etapas Domain Shader y Geometry Shader que vienen a continuación de la teselación.
  4. Cuando la teselación esta inactiva entonces el Surface Shader desaparece y entonces todo se une en un shader universal para la geometría que es el Primitive Shader.

¿Pero que ocurrio? Pues que al final fue Nvidia la que acabo colocando dicha idea en sus GPUs pero utilizando otros nombre para los Primitive Shaders, los Mesh Shaders.

Los Mesh/Primitive Shaders cuando la unidad de teselación no esta activa significan una simplificación radical del pipeline de la geometria. Con un Mesh/Primitive Shader todas las etapas shader se reducen a una y te cargas por completo la obligatoriedad función fija dando una total versatilidad. Pero dicha función fija sigue existiendo por si necesitas invocarla, esto permite aplicar técnicas de Culling a través de los Shaders, en realidad el Mesh/Primitive Shader no es más que un Compute Shader.

Pero… ¿Que sale economicamente más barato en la étapa de la geometría? ¿Procesar un triangulo tal cual o aplicarle el Culling? En realidad lo más costoso es lo segundo, pero hemos de tener en cuenta que el concepto es ahorrarle trabajo a las etapas posteriores con tal de que valgan más sueltas. Pero… ¿No son las mismas unidades las que luego calcularan los Pixel/Fragment Shaders? Todo esto ha hecho que en RDNA AMD añadiese un nuevo tipo de unidad, el llamado «Geometry Processor».

¿Como funciona la idea? Es muy simple:

  1. Si la teselación esta activa, entonces el Surface/Task/Amplification Shader se encarga de marcar que triangulos se han de eliminar y cuales no.
  2. Si la teselación no esta activa, entonces el Mesh/Primitive Shader se encarga de marcar que triangulos se han de eliminar y cuales no.

El Geometry Processor entonces se encarga de eliminar la geometria superflua, esto nos evita tener que realizar una étapa de Pre-Culling y es mucho más eficiente. El Geometry Processor en realidad son 8 unidades trabajando en paralelo y con la capacidad de eliminar un poligono/triangulo por ciclo de reloj. Gracias a este unidad los desarrolladores no tienen porque preocuparse a crear un sistema de Culling a mano creando un Compute Shader para ello y facilita enormemente las cosas a nivel de programación y de rendimiento.

Por otro lado, pese a que he dado el trasfondo con Sony hemos de tener en cuenta que Xbox Series X se beneficia al 100% de esto ya que tanto PS5 como Xbox Series X se benefician de esto. Y esto es junto al rasterizado por Tiles una de las dos optimizaciones de recursos que hay en la etapas previas al texturizado de la escena con tal de que la etapa más pesada no tenga que calcular elementos superfluos en pantalla y se pueda centrar en lo que si que vemos.

Esto es todo, tenéis el Discord y los comentarios de esta entrada para comentarla.

5 1 vote
Article Rating
1 Comment
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Snake128

Muy interesante, gracias.