王者之间的较量,R300 VS NV30深度
寄存器分析:
可能有朋友感到奇怪,为什么要进行寄存器分析呢?寄存器数量的多寡和类型的丰富其实直接影响到VS的功能实现。不但可以决定VS的执行效率、程序编写的灵活性,甚至能都大大影响VS真正能够实现的有效效果数量。说到这里,我想编写过或者还在编写汇编程序的朋友们能够心领神会。
注:
1) – 不支持; 支持; ? 不明; R 读; W 写; U 使用; S 标量; V 向量。
2) * NV30不提供整数常量寄存器和循环计数寄存器,不过任何浮点常量寄存器组员都可以被用作循环计数器。
3) ** NV30采用了不同的静态流控机制。
4) *** 在VS2.0中, 只有常量寄存器组可以被索引,而在VS3.0中通过使用循环计数器也可以索引输入寄存器和纹理坐标寄存器组。
5) **** 采样器寄存器似乎在VS2.0中没有用处。浮点常量寄存器: 又被称为程序参数寄存器,是一组4组员构成的浮点向量寄存器集,用来储存顶点程序参数。这些寄存器集可以用来储存整数也可以用来储存浮点书。R300和NV30这里没有区别。
整数常量和循环计数器寄存器:R300严格遵循DX9VS2.0的标准。NV30这里有很大不同,它可以使用任何浮点常量寄存器的组员作为循环计数器。任何事情都有两面性,这里也一样。在极端情况下,NV30可以为程序参数用光所有的浮点常量寄存器,这时就会导致NV30不能够执行循环操作,因为没有循环计数器了。不过,R300只能够在一个顶点程序中只能够拥有16个独立的循环,这时由于整数常量寄存器数目限制的原因,现在看起来NV30似乎没有这个限制。
布尔常量寄存器:它在严格意义上是用在DX9VS2.0/3.0静态流控指令上的位的集合。总数16个,因此,一个着色程序只能够拥有16个独立的分支条件。R300就提供了16个布尔常量寄存器。不过,由于缺少IF-ELSE-ENDIF指令,R300将使用JNZ和JUMP指令来完成同样的功能。
NV30是用更强大的BRA指令来实现动态流控,不需要这样的寄存器。
地址寄存器:NV30所提供的两个向量寄存器可以提供更好的间接寻址,包括二维数组的访问。
预测寄存器:这是一个布尔向量寄存器,只能够通过SETP指令进行修改,由DX9VS3.0引入来完成预测功能。R300不支持它。在NV30中,同样的功能由条件代码寄存器来实现,包括条件写屏蔽和动态流控。条件写寄存器在NV30的指令集中扮演关键角色。
输出寄存器:NV30额外提供了背面颜色和剪裁距离输出寄存器,提供程序控制裁剪平面,可以用于快速清除无效图形元素,提高以后的渲染效率。
ATi工程师的评论:R300直接支持6个用户裁剪平面,所以不需要裁剪平面距离寄存器。
注意,NV30超出DX9 VS规格的寄存器,理论上采用DX9实现的3D游戏或者应用程序是利用不上的。不过,如果采用OpenGL 1.4 NV扩展,则就可以充分发挥NV30的威力。
R300和NV30在寄存器规格上各有所长,整体看起来,NV30应该更有优势一些。<