RSP是一颗MIPS CPU,它的固件实现了一个程序,这个程序可以读取一个指令序列,解析指令序列中的指令并执行相应的指令。这些指令称为微码,micro code。程序员将一系列微码组成一个列表,称为display list或是command list。RSP则按照display list去执行。
RSP的微码看起来像是C函数调用,但实际上它们可能是一些打包二进制比特流的宏。熟悉opengl的同学可能会觉得它们和opengl的API有点像。
其操作思路与opengl也是很相似的,先要指定一些顶点,一些变换矩阵,一些纹理,对应的api如下:
gsSPMatrix(Mtx *m, unsigned int p)
gsSPVertex(Vtx *v, unsigned int n, unsigned int v0)
gsSPTexture(int s, int t, int levels, int tile, int on)
gsSPClipRatio(FRUSTRATIO_3),
Lights3 light_structure1 = gdSPDefLights3(
ambient_red, ambient_green, ambient_blue,
light1red, light1green, light1blue,
light1x, light1y, light1z,
light2red, light2green, light2blue,
light2x, light2y, light2z,
light3red, light3green, light3blue,
light3x, light3y, light3z);
gsSPSetGeometryMode(G_LIGHTING),
gsSPSetLights3(material1_light),
gsSPVertex( /* define vertices for object 1 */ );
/* render object 1 here */
gsSPLight(&material2_light.l[0], LIGHT_1),
gsSPLight(&material2_light.a, LIGHT_2),
gsSPVertex( /* define vertices for object 2 */ );
/* render object 2 here */
guLookAtHilite(&throw_away_matrix, &lookat, &hilite,
Eyex, Eyey, Eyez,
Objectx, Objecty, Objectz,
Upx, Upy, Upz,
light1x, light1y, light1z,
light2x, light2y, light2z,
tex_width, tex_height);
gsDPLoadTextureBlock_4b(hilight_texture, G_IM_FMT_I,
tex_width, tex_height, 0,
G_TX_WRAP | G_TX_NOMIRROR,
G_TX_WRAP | G_TX_NOMIRROR,
tex_width_power2,
tex_height_power2,
G_TX_NOLOD, G_TX_NOLOD),
具体的含义见: http://level42.ca/projects/ultra64/Documentation/man/pro-man/pro11/index11.6.html
RCP的输入是一些顶点、纹理坐标、光照条件等,输出是多边形。 这些多边形进入RDP进行进一步处理。
Reality Display Processor。 它的作用是把多边形进行栅格化,输入为high-quality, Silicon Graphics style pixels that are textured, antialiased, and z-buffered.
听起来的大致意思是这是一些像素,每个像素都已经映射了纹理,做了抗锯齿,并且包含z缓冲即深度信息。与opengl里面的fragment,片元几乎是一回事儿。
RDP会按照固定的步骤处理这些片元。在某种模式下的步骤如下:
在这种模式下,它一个周期只能处理1个像素,在另一些模式下,它可以实现一个周期处理两个像素。
RCP已经很像是一款固定流水线的GPU了,美中不足的是它的RSP部分是用MIPS处理器来做的,速度就慢了不少。
Block | Functionality |
---|---|
RS | Generates pixel and its attribute covered by the interior of the primitive. |
TX | Generates 4 texels nearest to this pixel in a texture map. |
TF | Bilinear filters 4 texels into 1 texel,or performs step 1 of YUV-to-RGB conversion. |
CC | Combines various colors into a single color,or performs step 2 of YUV-to-RGB conversion. |
BL | Blends the pixel with framebuffer memory pixel, or fogs the pixel for writing to framebuffer. |
MI | Fetches and writes pixels from and to the framebuffer memory. |
这个GPU支持Direct3D 7。称为世界上的第一个GPU。
Nvidia如些骄傲于这个芯片,已至于官网上还有它的链接: https://www.nvidia.com/page/geforce256.html
这时GPU的定义为:a single-chip processor with integrated transform, lighting, triangle setup/clipping, and rendering engines that is capable of processing a minimum of 10 million polygons per second.
一秒钟可以得处理1000万个多边形。
256的意思是"256位,4流水线渲染引擎"。相当于4核的GPU,一个周期可以处理4个像素。
与RCP不同的是,所有的处理都是硬逻辑完成的,而不是RCP那像由运行于CPU上的固件完成。
Nvidia不愧为世界上第一个GPU,它有现代GPU的所有特点:
可以说硬件支持T&L是GPU和非GPU的分界点,Direct3D 7,是固定流水线GPU和非固定流水线分界点。当Direct3D 8出来的时候,vertex shader, fragment shader就已经有了,这时就是非固定流水线的GPU了。
太晚了,今天就写到这里。
发现一个好文章还没读完,供大家参考: https://www.techspot.com/article/653-history-of-the-gpu-part-2/