紧随新CPU而来的总是一个现代GPU。 那么,任天堂这次构建了什么样的图像处理单元(PPU)呢? 说实话,一个都没有。 这是他们掌机系列中首次求助于GPU供应商。
尽管如此,任天堂的要求并未改变。 该公司仍然想要一个性能可接受的芯片......以及其知识产权核心。 将使他们能够将GPU嵌入到他们的SoC中,就像他们对ARM CPU所做的那样。
任天堂3DS游戏示例。 所有游戏都渲染两个400 x 240像素的帧和一个320 x 240像素的帧。与此同时,一家潜在的候选公司刚刚在2006年SIGGRAPH大会上公布了他们的新发明。 一段时间以来,数码媒体专业公司(Digital Media Professionals Inc.,也称为"DMP")一直在为嵌入式市场构建经济实惠的GPU,虽然他们的芯片没有什么特别之处,但它们保证了不错的OpenGL ES支持。 此外,他们的授权框架提供了可综合的GPU。
这对于任天堂来说似乎足够了,他们愉快地协商获得了DMP最新核心PICA200的授权,并随后将其捆绑到CPU CTR(任天堂3DS的SoC)内部。 这款GPU运行频率为268 MHz。
PICA200的架构
如果用一句话来概括,PICA200是一个低成本、低功耗的3D处理器,它结合了预统一架构和现代化的API。 PICA200的底层架构被称为Maestro 2G ,其设计符合OpenGL ES 1.1,但扩展了OpenGL ES 2.0的元素 。 然而,PICA200的API并不局限于任何一个标准。
你看,尽管流水线是分离的,并且像素阶段是固定功能的(类似于PlayStation 2),DMP还是通过一套Maestro函数扩展了有限的电路,提供了超越嵌入式市场预期的功能 。 这包括片段光照、多种阴影算法、多边形细分、凹凸贴图、程序纹理和多种雾效。
此外,与Nintendo DS不同,PICA200只使用帧缓冲区。 就是这样。 精灵引擎,一种解决高昂内存需求的流行方法,现在已成为过去。 这还包括扫描线技巧,因为现代GPU的工作速度远快于CRT的刷新率。
硬件组织
既然我们知道这个主机可以绘制3D图形,现在的问题是:它在哪里存储其素材? 有两个位置,大型FCRAM块和较小但更快的VRAM。
任天堂只为GPU提供了6MB的VRAM。 理想情况下,程序员会尽可能多地将数据放入其中,但由于它会很快被填满,因此预计它将用于存储需要即时访问的数据(即命令、缓冲区和重复纹理),而将其余数据放在FCRAM中。 PICA200带有一个DMA单元,可以在FCRAM和VRAM之间传输数据。 因此,归根结底,程序员有责任提出一个高效的布局以避免瓶颈。
在渲染过程中,程序员为许多操作分配专用的渲染缓冲区(即帧、模板、深度等)。 一直如此。 然而,对于3DS,LCD控制器不理解PICA200在帧缓冲区中渲染的数据。 因此,程序员还需要为LCD帧缓冲区保留额外的空间。 每个缓冲区都绑定到一个物理屏幕,并以LCD控制器所需的格式编码帧。
这意味着3DS需要至少分配三个LCD帧缓冲区(两个用于立体上屏,一个用于下屏)。 然而,为了避免显示伪影,可能会分配一套重复的缓冲区以进行页面翻转。
基于此,显示过程如下:
- LCD根据索引寄存器的指示,持续显示活动LCD帧缓冲区的内容。
- 同时,GPU在单独的帧缓冲区中完成新几何体的渲染。
- 帧缓冲区被导出到非活动的LCD帧缓冲区。
- GPU交换活动LCD帧缓冲区的索引。
- 出于实际原因,索引交换发生在垂直同步结束时,以避免画面撕裂。
- 此后,LCD将扫描最近更新的LCD帧缓冲区。
采用开放标准
有趣的是,就像ARM11 MPCore采用ARM的AXI协议互连其核心一样,DMP采用了不太专有的选项,称为开放核心协议(OCP)。 顾名思义,开放核心协议对其用户不施加任何许可限制,这可能是使用PICA200的供应商认为有利的。 为了比较,AXI于2003年发布(与AMBA 3规范一起),而OCP于2001年发布。 这确实让我好奇任天堂安装了什么样的技术来将来自PICA200的OCP信号转换为符合AXI的信号,以便SoC的其余部分能够理解它。 我猜测PICA200和AXI总线之间有一个桥接器。
有趣的是,PICA200的前身ULTRAY2000与其继任者有许多相似之处。 然而,最显著的区别是数据接口改用PCI和DDR-SDRAM协议 。
构造帧
自然地,GPU不了解显示器的立体或双屏性质,它只负责在游戏过程中渲染三个屏幕:
- 顶部立体左眼:400 x 240像素。
- 顶部立体右眼:400 x 240像素。
- 底部:320 x 240像素。
所有这些都可以显示8位RGB颜色,相当于高达1678万种颜色。
考虑到玩家期望所有三个屏幕(特别是前两个)都能达到可接受的帧率,单个PICA200在其整个运行过程中将承受大量工作负载,这是在评估其性能时需要记住的重要方面。
话虽如此,以下是数据如何传输以绘制单个帧的概述:
......按照本系列文章的惯例,我们现在将查看每个阶段发生的情况。
指令
这是任天堂首款最终以"常规方式"绘制三角形的掌机。 也就是说,通过使用命令。 但这并不是一个令人惊讶的因素,因为PICA200预计将遵循OpenGL ES的教义。
本质上,PICA200通过读取命令缓冲区来绘制多边形 。 此外,顶点数据可以嵌入到命令中,也可以存储在VRAM的单独缓冲区中,后者效率最高。
Vertex
PICA200提供了四个并行操作的顶点处理器(VP)。 然而,如果激活了几何着色器(下一个流水线阶段),则只能使用三个处理器。
每个核心计算由四个24位浮点值组成的96位向量 ,但与ARM11的VFP不同,它们不符合IEEE-754 。 顶点处理器使用PICA200特有的汇编语言进行编程(让人联想到Nvidia NV30的时代),并按以下方式操作 :
- 开发者使用PICA200汇编编写顶点着色器。 作为参考,指令集与Microsoft的
vs_2_0非常相似 。 - 着色器使用专有汇编器进行编译。
- 3DS程序必须将编译后的二进制文件复制到内存中(FCRAM或VRAM)。
- 然后,3DS程序发出GPU命令以加载二进制文件并将其与程序连接。
一旦顶点核心处理完毕,它们将结果输出到同步控制块,该块充当顶点缓存和缓冲区。 它具有384字节的容量,能够容纳多达32个96位向量。 最后,下一个阶段从该块读取数据。
几何
几何阶段是第八代主机的标志性功能,允许开发者从简单的顶点数据中生成复杂的几何体。
在这种情况下,PICA200的几何阶段是通过占用四个顶点处理器中的一个来实现的。 然后,"几何"顶点核心加载不同的顶点着色器。 最后,它从其他三个处理器接收顶点数据。
几何着色器的用途示例包括正方形或线条生成(使用点图元)、几何细分、轮廓边缘渲染;以及随机粒子生成。
光栅器
在此阶段,所有图元都转换为像素。
PICA200上的光栅化单元非常简单,它只是从图元生成三角形,然后应用剔除和裁剪以移除不可见的三角形(分别隐藏在其他三角形后面和/或在视图区域之外)。 这与OpenGL ES的操作方式非常相似,尽管开发者在PICA200上工作时必须注意某些坐标系是反转的。
像素
片元阶段由两个区域组成:纹理单元,可以从内存中获取纹理并进行处理。 以及着色单元,可以对纹理数据执行额外操作。
PICA200包含四个纹理单元 ,每个单元都有256字节的L1缓存,并且它们都共享8 KB的L2缓存。 然而,这些单元并非同质的。 相反,每个单元的服务范围各不相同:
- 只有三个单元可以处理2D纹理。
- 只有一个单元可以执行阴影、立方体和投影纹理映射。
- 最后一个单元更像是一个噪声生成器,这意味着它只输出随机纹理。 它使用随机数生成器和颜色查找表的组合。 这是一种纤薄而高效的纹理程序生成实现方式,同时节省了带宽。
之后,着色单元的工作是创造性地处理输入的纹理。 然而——考虑到我们正在谈论第八代主机,这有些出乎意料——PICA200的单元不可用像素着色器进行编程 。 相反,我们发现有六个可配置的颜色混合器,每个混合器接收三个RGB或Alpha值并对其执行逻辑操作。 结果传递给下一个混合器,依此类推。 每个颜色混合器都可以从上一个混合器(第一个除外)、纹理单元或常量值获取输入。
总而言之,这是Flipper时代(同时遵守OpenGL规范 )的现代反映,但不要忘记开发者还可以将其与前面提到的Maestro函数结合使用。
后处理
帧经过处理并准备写入帧缓冲区(或渲染目标)后,它会经历一系列最终的"校正"。 这类似于OpenGL ES 2.0的流水线。
话虽如此,帧会经过alpha、模板和深度测试。 之后,结果可以使用颜色混合器或逻辑运算符(AND、XOR等)与现有帧(在帧缓冲区中)混合。 最后,帧以整体形式或通过模板过滤器(用于遮罩)写入内存中分配的缓冲区。
为了进一步平滑边缘,PICA200可以以两倍于选定尺寸的帧缓冲区进行渲染,然后使用2x2抗锯齿进行平均。 这是一种称为超采样的旧技术。
一旦帧缓冲区准备好显示,它必须复制到内存中另一个名为LCD帧缓冲区的块中(其格式更符合LCD屏幕的扫描线程序),然后以扫描线的形式传输到LCD。
交互式比较
现在你已经了解了PICA200如何在屏幕上绘制三角形,是时候来看一些实际例子了。 这里我收集了来自《任天堂明星大乱斗》游戏中的两个马里奥,一个是Wii版,一个是3DS版。 请注意,新版"愤怒马里奥"的细节感知水平与家用机版本非常接近。

"现代版本"中可用的互动模型
Wii的任天堂明星大乱斗X(Super Smash Bros. Brawl)(2008)
5455个三角形

"现代版本"中可用的互动模型
3DS版《任天堂明星大乱斗》(2014)。
3,080个三角形。
值得再次提醒的是,实际上,PICA200将同时渲染三个屏幕,这是Wii的GPU所没有承受的任务。
隐藏的附加功能
"新"3DS版本似乎还捆绑了一个不常见的DSP,名为MVD。 它执行H.264&MJPEG解压缩以及YUV到RGB的颜色转换 。 CPU通过写入其寄存器来对其进行编程。 反过来,MVD内部有一个专用的DMA单元,可以独立处理FCRAM中的数据。
总的来说,关于这个组件没有详细的文档,我只能推测它位于SoC的某个地方。 新3DS上的网页浏览器似乎是其唯一的用户(用于加速视频播放)。
怀旧渲染
解释了这么多之后,还剩下一个问题没有回答:PICA200如何渲染任天堂DS和Game Boy Advance游戏? 你可能还记得DS和GBA的GPU在渲染和广播帧方面表现出完全不同的操作模式。

由NDS[Graphics Engine](nintendo-ds#graphics)渲染的一帧,其流水线将2D和3D数据分离。 这是符合OpenGL规范的PICA200无法理解的。
解释是,DS和GBA的PPU(图像处理单元)都集成在SoC中,DSi/DS/GBA游戏将像它们最初在之前的游戏机上那样操作这些PPU。 PPU的输出(扫描线)被传递到一个名为LgyFB的模块,该模块可以选择性地放大帧,然后将其转发到帧缓冲区,PICA200将负责显示它。 ARM11及其DMA负责在此过程中处理所有内存传输。
自然,这种安排会增加一些延迟(即 卡顿),尽管对用户来说可以忽略不计。












