Le toca el turno a la exitosa PlayStation de Sony.

Esquema GeneralPU-23(a)_blocks

En lo primero en que me voy a centrar es en la CPU del sistema.

R3000 CPU

La CPU de PlayStation era un MIPS R3000A altamente modificado por Sony y fabricado por LSI para esta funcionando a 33.86 Mhz y con una potencia de 30 MIPS.

R3000PSX

Las primera modificación se encuentra en el núcleo principal de la CPU, en vez de tener una cache de datos de primer nivel, Sony añadió una memoria Scratchpad de 1KB, a la que la CPU puede acceder a una velocidad de 133.4 MB/seg, dado que no accede a través del controlador de la DRAM siempre esta accesible, incluso cuando otro dispositivo accede a la RAM principal a través del DMA.

Sí seguimos dentro del chip pero ya fuera del núcleo de proposito veremos la unidad SIO (E/S en serie) que es la que comunica la CPU con los periféricos (mandos y memory cards), las unidades B/U, MDEC y GTE son los tres co-procesadores a medida creados por Sony para el R3000A de PlayStation.

B/U

La unidad B/U es lo que llamamos DMA, es la unidad que se encarga de manejar el acceso a la RAM principal tanto al resto de procesadores del sistema que no son la CPU y las interrupciones de esta a la propia CPU. Hay que tener en cuenta que cuando uno de los procesadores accede a la memoria principal la CPU es desconectada de dicha memoria mientras dure la operación con la memoria. Cada co-procesador y procesador de apoyo esta conectado con la RAM a través de un canal DMA, cuya lista es la siguiente:

La lista de canales de la unidad DMA es la siguiente:

  • El Canal 0 sirve para transmitir los bloques de datos comprimidos dese la RAM principal al MDEC.
  • El Canal 1 comunica el MDEC con la RAM para que este transmita los bloques ya descodificados hacía la RAM.
  • El Canal 2 comunica con la VRAM.
  • El Canal 3 sirve para comunicar con el CD-ROM.
  • El Canal 4 es para la unidad de procesamiento de sonido (SPU).
  • El Canal 5 comunica con el Puerto de E/S paralelo, dicho puerto no se uso y fue descartado en versiones posteriores de la consola.
  • El Canal 6 comunica con la GPU con la RAM principal.

MDEC

El segundo coprocesador es el Movie Decompression (MDEC)/Motor de descompresión de películas. Se encarga de la descodificación de vídeo en MPEG-1/H.261 para las escenas cinemáticas, fue una novedad importante por el hecho que hasta la llegada de PlayStation se utilizaba la CPU misma para renderizar las escenas cinemáticas que empezaron a incluirse en los juegos basados en CD-ROM.

El MDEC solo se encuentra activo cuando hay una escena cinemática, comparativamente con el R3000A tiene una potencia de 80 MIPS pero no se trata de un procesador de proposito general sino una máquna de estado que lo que hace es descodificar el video en bloques que la GPU de PlayStation puede entender, su funcionamiento es el siguiente:

  1. Recibe los datos a través del canal del DMA hacía el MDEC y los descodifica al vuelo.
  2. Dicha descodificación al vuelo la almacena en la memoria principal.
  3. Los bloques descodificados son enviados al búfer de imagen de la VRAM para que sean mostrados en pantalla.

GTE

Llegamos a la joya de la corona, el GTE es un co-procesador especializado en realizar ciertas operaciones con vectores y matrices que son ampliamente utilizadas para la generación de gráficos en 3D a tiempo real, no tiene acceso a la RAM principal y la única manera de acceder al mismo es a través de llamadas a los registros del mismo a través de la CPU por lo que se puede considerar más bien un co-procesador matemático del R3000A para realizar dichas operaciones.

¿Que tiene de especial? Pues que para la época era una bestia parda. La segunda consola más potente cuando salio PlayStation era la Sega Saturn que se encargaba de la geometría de la escena utilizando el SH2 esclavo para dicha tarea. Aunque mucho más versatil a la hora de desarrollar el SH2 requeria que ciertas funciones que en el GTE eran una simple llamada al registro correspondiente se tuviesen que hacer manualmente a través de código y esto es lo que hacía a la PlayStation de Sony más atractiva que otros sistemas en cuanto al 3D. Cosas tan complejas como la rasterización en PlayStation eran una simple llamada a la instrucción correspondiente.  El otro motivo era la velocidad con la que el GTE realizaba sus cálculos, tened en cuenta que el SH2 de Saturn tenía una potencia límite de 25 millones de instrucciones mientras que la del GTE era de 66 millones, esto es algo más del doble y esto significaba que se conseguían las mismas tasas geométricas que con Saturn pero con un esfuerzo mucho menor.

A nivel visual el punto fuerte del GTE era la capacidad para soportar vertex lightning, se conseguía dando un valor de color concreto a los vertices para que las aristas de estos se difuminaran con el color del poligono o la textura más cercana. A la técnica se la llama Gouraud Shading y aunque Saturn en teoría era capaz de aplicarla lo hacía utilizando una formula mucho menos efectiva y que destruía el colorido de la escena.

_SHADING

La tasa geométrica de los primeros juegos de PlayStation y Saturn era más o menos parecida, durante años muchos juegos de la consola de Sony se movieron por esa tasa pero fue gracias al Gouraud Shading bien aplicado que los juegos parecían realmente más pulidos, en especial los exclusivos.

Ahora bien, PlayStation era muy primitiva a la hora de renderizar la escena en 3D, uno de los elementos más prohibitivos en aquella época era el uso de un búfer de profundidad, un búfer de profundidad es un búfer de imagen en que en cada pixel no se almacena la información de color sino su distancia respecto a la cámara. En 1994 dar soporte a esto era prohibitivo por lo que Sony había descartado su uso en la consola y tomo un mecanismo completamente distinto que son las tablas de ordenación. En el SDK de la consola se puede leer:

La GPU de PlayStation esta diseñada para leer una lista enlazada de primitivas gráficas y dibujarlas todas en secuencia hasta que se llega al final de la lista. Hay muchas formas en las que esta lista puede ser construida pero las librerías de la GPU de PlayStation utilizan un método conocido como”Tabla de ordenación” porque provee la lista de pantalla de una forma flexible y fácil. Este método es ideal pera gráficos en 3D, pero es también aplicable a los gráficos en 2D donde el orden de dibujado es importante.

Una lista de ordenación (OT) es una lista enlazada diseñada para agrupar juntas primitivas gráficas para el 3D (polígonos, segmentos de linea, sprites, etc) de acuerdo con su valor de profundidad (Z). Cuando la lista se utiliza para dibujar, los elementos que estén más alejados de la cámara serán los que se dibujaran primero, los más cercanos a la cámara los que se dibujaran más tarde, y todos los que estén en una distancia intermedia se dibujaran cuando sea apropiado.

Esto significa que la escena es dibujada de atrás hacía adelante por lo que los objetos que quedan por detrás de otros también son dibujados en el búfer de imagen cuando se compone la escena.

Ya os hable de dichas tablas hace unas entradas:

PSXOrdering2

A través de una instrucción especial, el GTE transforma las coordenadas (X, Y,Z) en coordenadas (Xs,Yz), cuando la GPU recibe los fragmentos no sabe si cada uno de ellos se encuentra detrás o delante de otros por lo que tiene que consultar la tabla donde tiene almacenado el orden en el que tiene que dibujar los objetos. Dado que 256 valores es algo muy impreciso se pueden anidar varias tablas conjuntas para aumentar la precisión. El envió de las tablas a la VRAM para que la GPU las pueda leer se hace a través del canal 6 del DMA.

Memoria Principal

PlayStation disponía de 2MB de RAM, dicha memoria funcionaba a 33Mhz y era capaz de transmitir hasta 4 bytes (32 bits) por ciclo de reloj. En modo lectura+escritura transmitía 16+16 bits. Comparativamente con todos los pozos de memoria que hemos visto hasta ahora la de PlayStation es la más rápida de todas ellas, siendo su pico mayor que el de la Atari Jaguar pero sin la desventaja de tener un solo canal de acceso.

VRAM

La VRAM tiene el mismo ancho de banda que la RAM principal, unos 66.7 MB/seg. Esta compuesta como si se tratase de un enorme búfer de imagen de 1024×512 pixeles y 16 bits (2 bytes) por pixel (1MB). Se trata de una RAM de doble puerto como la de 3DO por lo que mientras se esta escaneando la imagen ya generada para ser enviada al televisor se esta renderizando la siguiente en otra parte de la memoria. La diferencia respecto a 3DO es que la VRAM es ahora memoria origen y memoria destino para no parar a la CPU por lo que es necesario cargar todos los datos necesarios para los gráficos a la VRAM antes de empezar a renderizar la escena.

Dichos datos se almacenan en forma de página de texturas. Cada página de texturas tiene un tamaño de 256×256 pixeles con una información de 4, 8 o 16 bits por pixel (este último es de 15 bits+1 bit para marcar si el pixel es transparente/no se dibuja). Esto hace que el tamaño que ocupan las páginas de texturas sea variable dependiendo de la información que almacene cada una de ellas. La información y el número de paginas de texturas que se puedan almacenar en memoria dependerá directamente de la memoria libre que le deje el búfer de imagen.

En cuanto a las resoluciones soportadas por la consola y lo que ocupaban cada una de ellas, sí la resolución era muy alta entonces no se podía operar con doble búfer de imagen y se tenia que renderizar la escena durante el VSync, recortando enormemente el rendimiento de la misma:

PSXResolutions

Las resoluciones entrelazadas iban a 60 fotogramas por segundo, las no-entrelazadas a 30 fotogramas por segundo.

GPU

El chip gráfico de PlayStation es un animal particular por el hecho que esta especializada en dibujar triangulos, el motivo de ello es que es el estándar para las escenas en 3D a tiempo real ya que cualquier forma poligonal se puede romper en triangulos. Se podría definir al chip gráfico de PlayStation como un dibujador de triangulos 2D.

Debido a esta particularidad para dibujar el clásico patrón/sprite de forma cuadrada lo que hace es dibujar dos triangulos juntos como si fuese un cuadrado. Lo que es la preferencia de los pixeles (las diferentes capas para el 2D) se realizan utilizando las Ordering Table para colocar los diferentes fondos que componen la escena. Esta particularidad de la consola de Sony obligaba a los desarrolladores a plantear el motor gráfico de sus juegos en 2D de forma diferente a cualquier otro sistema.

Lista de Comandos

La GPU recibe dos listas de comandos, GP0 y GP1, en la primer recibe las listas de comandos y los patrones/fragmentos/sprites generados (o no) por la CPU (GTE) a través del DMA2 como origen y la VRAM como destino. El GP1 en cambio sirve para acceder a ciertos registros para seleccionar cosas como el modo de resolución, mandar a limpiar la VRAM al completo…

Tasa de polígonos.

La tasa de polígonos depende de muchas cosas, en realidad nos debería importar unicamente la cantidad de polígonos que puede dibujar la GPU en pantalla pero eso depende también del resto de pasos previos. ¿Cual es la carga de trabajo del GTE? ¿Cual es la carga de trabajo durante la etapa de texturizado? ¿Cual es la calidad del código? La tasa de poligonos en ninguna consola es fija ya que depende de muchos factores.

Texturizado

PlayStation soporta mapeado de texturas, puede texturizar desde la VRAM o desde la cache de texturas.

Sí lo hace desde la VRAM entonces puede manejar como si fuese un solo objeto una página de texturas de 256×256 pixeles. Pero antes de acceder a la VRAM mirará si la información se encuentra en la cache de texturas, dicha cache de 2KB almacena en su interior una pequeña porción de la página de texturas y será a la que accederá antes que la VRAM por jerarquía, sí la información no se encuentra en la cache de texturas entonces se pasaba a la VRAM. La cache de texturas es un estandar de todos los procesadores gráficos ya que permite reducir el número de lecturas a la RAM y dada su menor latencia aumenta la velocidad de renderizado. No obstante la cache de texturas es solo de lectura y la composición final sobre la escena se hace escribiendo sobre la memoria de video.

El otro punto a tener en cuenta es que dado que los datos que llegan desde el GTE no incluyen búfer de profundidad por lo que el texturizado no se hace desde la perspectiva correcta por lo que las texturas tiemblan, algo que ocurre dado que esto en aquella época es que permitía simplificar el mecanismo de texturizado.

El texturizado desde desde una perspectiva correcta tiene la siguiente formula:

CorrecciónPerspectiva

En cambio el texturizado tal y como lo hacen PlayStation, Saturn, 3DO… utilizaba esta otra formula:

TexturizadosinZ

Mucho más fácil de implementar pero que llevaba consigo el problema de los “flangolinos”.

Tasa de relleno.

La gran ventaja de PlayStation respecto a su competencia de la época era su enorme tasa de relleno, el gran error de Sega con Saturn y que la dejo atrás de PlayStation fue el tema de la tasa de relleno (fill rate) de cara a los gráficos 3D:

oh-no

En Saturn se renderizaba la escena de la siguiente manera:

  • El VDP1 escribe el búfer de imagen sobre uno de los dos búfers de imagen que tiene este utilizando un ancho de banda a 14.3Mhz y de 8 bits para la escritura.
  • Una vez ha sido dibujado la memoria que lo contenía pasa a ser el búfer delantero y el antiguo búfer delantero pasa a ser el búfer trasero.
  • El VDP2 lee el búfer delantero y lo copia en su búfer de imagen como si fuese uno de sus planos, aquí puede combinarlo con otros planos generados en el VDP2 o dibujar lo visto en pantalla.

El hecho de hacer transmisiones entre diferentes memorias añade latencia y afecta a la tasa de relleno, si a esto le sumamos que el ancho de banda de escritura es de 8 bits mientras que el de PlayStation es de 16 bits esto significa que la consola de Sony dobla en el ancho de banda de escritura y gracias a ello puede doblar en cuanto a tasa de relleno. Pero es que además simplifica enormemente las cosas:

  • LA GPU escribe en la VRAM con un ancho de banda de 16.67 Mhz y 16 bits de velocidad de escritura.

Dicho de otra forma:

keepitsimple

Dado que la tasa de relleno esta relacionada con la geometría la forma en la que Saturn podía mantener el tipo frente a PlayStation era reducir la información de color por pixel. Las diferencias entre ambas consolas se empezarón a notar con el port de Tomb Raider a PlayStation, un juego en cuya versión de PlayStation no solo incluyo texturas semitransparentes sino que operaba con una resolución de color mucho mas alta.

compare_water

Alpha Blending y multitextura.

Alpha Blending es lo que se llama la mezcla con el canal alpha para texturas semitransparentes, para poderse ejecutar se necesita primero leer la textura, escribirla sobre memoria y luego volverla a leer por lo que disminuye enormemente la tasa de relleno. Una variación de la mismo se utilizo al final de la vida de la consola para ejecutar efectos de multitexturizado muy simples.

El Alpha Blending es algo que solo las consolas a partir de PlayStation en adelante pueden realizar. En realidad las transparencias se siguen calculando de la misma manera que en PlayStation ya que es la forma estandar de realizarlo. Consolas como Saturn y 3DO realizaban transparencias a nivel de capas. Renderizaban la escena en 2D y componían esta por diversas capas por lo que las transparencias se simulaban dejando ver la capa posterior.

compare_underwater

Con esto termino la entrada, si alguna cosa ya sabéis, a los comentarios.