Gráficos en Consolas Antiguas. Temp 2 (IV): Microsoft Xbox

Le toca el turno ahora a la que fue la primera consola de Microsoft.

Xbox11

Los cuatro componentes clave del sistema son:

  • La XCPU: Un Pentium III a 733Mhz con la mitad de su cache (128KB).
  • El NV2A: Un procesador que engloba el DMA/NB del sistema y la GPU del mismo.
  • El MCPX: El chip encargado del control de los periféricos, así como la generación del sonido. No es utilizado para generar gráficos por lo que lo voy a tener en cuenta.
  • 64MB DDR a 200Mhz con un ancho de banda de 6.4 GB/seg.

La organización general del sistema es la siguiente:

Captura de pantalla 2016-01-06 a las 11.33.25

De lo cual nos interesa solo esto:

Captura de pantalla 2016-01-06 a las 11.37.47

Como veis la organización general del sistema es la misma que N64, GCN y Wii con el NB/DMA en la GPU y una memoria unificada con todos los accesos a memoria siendo controlados por dicho NB/DMA incluido en el mismo chip que el procesador gráfico. Por lo que dado que ya he explicado dichos sistemas no voy a perder el tiempo en ello.

XCPU

La XCPU es un Pentium III a 733Mhz y una cache de segundo nivel de 128KB. Comparativamente con otras consolas su capacidad en cuanto a enteros según el Dhrystone es 1980 MIPS o lo que es lo mismo, unos 2.1 MIPS por ciclo de reloj. Esto significa que es más potente que la CPU de GameCube por su velocidad de reloj pero no es más potente que la de Wii.

xboxintelp31

En cuanto al tema de la cache L2 ya lo trate en la entrada de GameCube y aquí los principios son los mismos. Claro esta que hay que tratar un tema que aparece siempre cuando se habla de GameCube y de Xbox, la estúpida comparación CISC vs RISC. La gente piensa erroneamente que un procesador RISC es más potente que uno CISC cuando no es así, los procesadores RISC tienen un conjunto de instrucciones reducidas, esto significa que para realizar instrucciones más complejas hacen uso de combinación de otras más simples. Lo procesadores CISC en cambio tienen un set de instrucciones más complejo.

Claro esta que la comparación es estúpida en este caso porque el Pentium III de Xbox es un procesador cuya arquitectura deriva del P6 (Pentium Pro) y es Post-RISC. ¿Que significa esto? Pues que lo que hace es descodificar las instrucciones complejas en simples para operar con ellas por lo que internamente es RISC. ¿Que es mejor, una instrucción compleja que tarde varios ciclos o una serie de instrucciones simples que tardan pocos ciclos cada una? Esto realmente no nos importa en el caso del que estamos hablando que como funciona la consola y el hecho constatado es que de la generación PS2-GCN-Xbox la consola de Microsoft es la más potente de todas.

El otro tema es la unidad de coma flotante, tenemos por un lado la unidad x87 y por otro la unidad SSE, esta funciona exactamente igual que los Paired-Singles del IBM Gekko. Por lo que en comparativa y dada la velocidad de reloj Xbox tiene una CPU con unas capacidades casi iguales a las de la CPU de GCN pero con la diferencia que la CPU de GCN pierde por la velocidad de reloj. Curiosamente en coma flotante la CPU de Xbox es un poco más potente que la de Wii.

CPU, GPU y Acceso a la RAM

La CPU no tiene acceso directo a la RAM si no es a través del Northbridge/DMA que se encuentra en el mismo chip que la GPU por lo que existe una conexión directa entre el bus de la CPU y el NB/DMA en vez de la CPU con la memoria. El ancho de banda externo de la CPU es es de 1.3 GB/seg y el de la memoria de 6.4 GB/seg, esto significa que el NB/DMA puede funcionar de dos maneras distintas:

  • Dado que la GPU tiene preferencia esta se puede quedar con todo el ancho de banda.
  • 1.3 GB/seg para la CPU, 0.4 GB/seg para el MCPX y el resto para el NV2A, unos 4.7 GB/seg.

Dado que la consola tiene unos 64MB de memoria como pozo único de memoria es sumamente importante que la GPU pueda acceder a toda la memoria posible por fotograma para encontrar los datos que tiene que utilizar. Los anchos de banda de la memoria dan un enorme margen para ello. Es decir, Xbox tiene ancho de banda en exceso para la densidad de memoria que tiene y no resulta en ningún problema.

Por otro lado, hay un ventaja adicional en lo que al uso de una mayor densidad de memoria respecta en lo que a la calidad gráfica de los juegos respecta, pero esto ya entrare cuando hablemos del texturizado.

NV2A

El NV2A es el procesador gráfico de Xbox, diseñado por Nvidia para Microsoft es de lejos el procesador gráfico más potente de su generación y supera por mucho no solo a PS2 y GameCube sino que además se puede considerar un salto generacional respecto a Dreamcast.

c402

Su principal aporte a la historia de los videojuegos son los Vertex Shaders y la creación del primer pipeline gráfico moderno, fue a partir de Xbox que los juegos empezaron a utilizar los shaders y se puede considerar una antesala a lo que fue la generación siguiente con Xbox 360 y PlayStation 3.

Su arquitectura general es la siguiente:

Captura de pantalla 2016-01-06 a las 15.03.49

Su pipeline gráfico es el siguiente:

download

Dado que toda GPU tiene dos etapas: Geometría y Rasterizacion+Texturizado, voy a dividir la explicación en las dos etapas y me voy a centrar especialmente en los shaders.

Geometria y Vertex Shaders

El error principal de concepto es pensar que en el caso de los Vertex Shaders se tiene que programar la geometría al completo, esto es falso tanto en Xbox como en las GPUs actuales. La realidad es que la geometría se procesa a través de una serie de máquinas de estado concatenadas que lo que hacen es recibir unos datos de entrada, realizar una operación ya fijada en el hardware y sacar unos datos de salida tras realizar dicha operación.

¿Entonces que tienen de especial los Shaders? El hecho de que estos cargan un pequeño programa definido por el desarrollador para la manipulación de las primitivas gráficas solo que en el caso de los Vertex Shaders lo que hacen es manipular el valor de los vértices. ¿Y cuales son esos valores? Pues los valores xyzw de cada vertice, los cuales son utilizados para las ecuaciones de transformación e iluminación de la escena.

3d-transformation-3-728

Hay que tener en cuenta que al contrario de las máquinas de función fija donde su potencia es predecible en este caso no sabemos cuanta potencia puede ocupar un shader concreto. Puede ser muy simple y durar pocos ciclos o ser muy complejo y afectar la tasa de geometría producida que tiene que enviarse al rasterizador. ¿Pero que hay de su potencia? El chip es un derivado del de la GeForce 3 con 2 Vertex Shaders en vez de uno, lo que le da una potencia sin uso de la iluminación de unos 116 millones de poligonos por segundo transformados, pero tened en cuenta que no hablamos de iluminados y mucho menos dibujados en pantalla, en todo caso esto hace palidecer de mala manera a los 32.4 millones de polígonos por segundo que es la tasa de la unidad geometrica de la GX GPU de Game Cube.

Pero lo que nos interesa es una una información comparativa real entre PS2, Xbox y GameCube para saber donde colocar realmente la consola de Microsoft y el resto. Hasta ahora os he hablado de rendimiento teórico para explicar como funciona. ¿Y cual es la fuente imparcial? Un benchmark que publico EA en su día:

HighPolyCount_PS2_Xbox_GC_PC_2002

Mirando estas cifras esta claro que Xbox es más de dos veces más potente que PS2 y GCN en el tema geométrico, es decir, puede mostrar escenas con más del doble de la complejidad geométrica que su competencia directa.

Rasterización, Texturizado y Pixel Shaders

El NV2A tiene unos cuatro pipelines para el texturizado al igual que GameCube pero trabaja con 2 pixeles texturizados por TMU en lo que su tasa de texturizado se refiere por lo que estamos hablando de una tasa de casi 1864 millones de pixeles por segundo con una capacidad de color de 32 bits por lo que es la consola con mayor definición por pixel de su generación.

Ahora bien… ¿Como lo hace para sostener dicha tasa de relleno con una memoria externa de solo 6.4 GB/seg? Renderizando a 32 bits de color, 4 bytes por pixel, y teniendo en cuenta solo el filtro bilineal el ancho de banda necesario pasaría a ser de:

1864 millones de pixeles * 4 bytes por pixel*4 muestras por pixel=29.8 GB/seg.

¿Como lo solventa esto? Pues a través de la inclusión de una cache de texturas dentro del chip de tal manera que se realicen las operaciones de filtrado de texturas desde la misma en vez desde la memoria. El NV2A es la primera GPU para consola en implementarlo y desde entonces casi todas las GPUs de consola la han implementado, sobretodo porque es esencial de cara no solo al filtraje sino también a los Pixel Shaders. La cache de texturas del NV2A tiene suficiente ancho de banda para bilineal en 32 bits y trilineal en 16 bits por lo que para el trilineal en 32 bits la tasa de relleno se va a la mitad.

El otro tema son los Pixel Shaders, cada pixel shader puede realizar una operación Vec3 (RGB) y una escalar (A) por pixel, por lo que tenemos 2 unidades Pixel Shader por unidad de texturas. Lo que significan unas 32 operaciones en total y por tanto el doble de operaciones que el TEV de la GX GPU pero al mismo tiempo tenemos el mismo número de operaciones por pixel dado que la tasa de texturizado es el doble también. Pero realmente lo que nos interesa son el número de etapas/pasos en el multitexturizado, mirando el FAQ de la GeForce 3, GPU de la que deriva el NV2A nos encontramos con la siguiente información:

GeForce3 soporta hasta cuatro operaciones de direccionamiento de texturas seguidas de 8 operaciones de mezcla de color/alpha. Puedes enviar conjuntamente instrucciones de Alpha y Color para unas 16 operaciones.

01

Es decir el TEV y los Pixel Shaders de la arquitectura NV2X tienen exactamente la misma capacidad y son similares pero con una diferencia, cada TMU trabaja aquí con 2 muestras al mismo tiempo y tiene unas dos unidades distintas pero ambas unidades, el TEV y el PS soportan hasta 8 pasos en el multitexturizado. ¿La diferencia? Cada unidad de texturas soporta unas 2 muestras simultáneas y 2 pixeles por TMU en el NV2A. Por lo que Xbox puede realizar operaciones gráficas con los shaders que requieren dos muestras en un mismo ciclo y por tanto para ciertos efectos no hay perdida en lo que a la tasa de relleno se refiere. Es por ello que muchos juegos de Xbox abusaban y volvían a abusar del Bump Mapping en los escenarios…

563883-917536_20040506_002

Total, en Xbox salía completamente gratis sin perdida alguna de rendimiento en comparación con sus contemporaneas que veían como su tasa de relleno se veía negativamente afectado y con ello su rendimiento gráfico. GameCube podía hacer Bump Mapping pero requiere dos pasos y PS2 tiene dos métodos por software que requieren dos o cuatro pasos dependiendo de cual se quiera utilizar.

Z-Buffering y Stencil.

El Z-Buffering por otro lado también es de 32 bits permitiendo una configuración de 24 bits Z+8 Bits StencilBuffer, algo que es único en Xbox en conjunto a los Vertex Shaders y que permite realizar la iluminación de juegos como Doom 3 y el primer Splinter Cell para la misma consola:

doom3-xbox

uhBCTsK

Varios juegos de Xbox utilizan el Stencil Búfer para una técnica llamada Shadow Volumes que consiste en lo siguiente:

  1. Renderiza la escena como si estuviese completamente en sombras.
  2. Por cada fuente de luz: Utilizando la información de profundidad para esa escena, construye una máscara en el stencil búfer que tenga agujeros solo donde en las superficies visibles no haya sombras.
  3. Renderiza de nuevo la escena como si estuviese completamente iluminada, utilizando el búfer stencil para enmascarar las areas sombradas. Utiliza operaciones de mezcla para renderizar esto en la escena.

Sin un Stencil Buffer en el hardware este tipo de iluminación no se puede realizar y por tanto no hablamos solo de un tema de potencia aquí. Tanto PS2 como GameCube (y Wii) carecen de un Stencil Búfer para poder realizar este tipo de iluminación.

Ahora bien… ¿Con el ancho de banda que tiene como lo hace para renderizar Color+Z y la tasa de relleno que tiene la consola? Xbox tiene 4 ROPS por lo que su tasa de relleno real es de unos 932 Millones de pixeles pero al contrario de PS2 y GameCube carece de memoria embebida para las operaciones sobre el búfer trasero. y la ecuación para el búfer de imagen teniendo en cuenta unos 32 bits para el color y 32 bits para la profundidad entonces tenemos que el ancho de banda necesario para el búfer de imagen trasero es de:

4 ROPS * 233 Mhz * 4 Bytes*2(Color+z)= 7.4 GB/seg

Necesitariamos una RAM con unos 14.9 GB/seg de ancho de banda para poder paliar el problema. ¿Como lo hace entonces? En primer lugar al igual que con GameCube la consola soporta texturas comprimidas utilizando el formato S3TC/DXTC que en 32 bits RGBA puede comprimir y descomprimir en un ratio de 4:1. El otro tema es la compresión sin perdidas de los datos del búfer de profundidad con un ratio de 4:1 también por lo que el ancho de banda pasa a ser de:

4 ROPS * 233 Mhz * (1 Byte(Color Comprimido via DXTC)+ 1 Byte (Z+Stencil comprimidos)= 1.8 GB/seg,

Esto hace que el ancho de banda de la DDR no resulte insuficiente para este tipo de operaciones sobre el búfer de imagen.

En fin, con esto termino la entrada sobre la Xbox original, si alguna cosa a los comentarios.

Anuncios