AGP和3D软件
- 摘要
- 仅仅是另一种总线吗?
图1
图2
图3
直接内存执行(DIME )
图4
图5
- 不需做任何新的工作
当前的3D应用软件如何管理纹理内存
DOS应用程序
Windows应用程序
默认的直接刷新内存的分配
表1
- AGP的目标
图6
新老结合
- 棘手的细节
PIO与DMA
- 摘要与建议
- 参考文献
摘要
PII处理机系统中的图形加速端口(AGP)将为个人电脑带来更快、更好的画面。AGP的物理特性与已有的PCI(外围器件接口)总线相似,但AGP给动画效果提供了新的机会。
通过合理的分配和管理内存能使应用软件(特别是3D图形方面的)从中受益。即使那些非面向AGP的应用软件也应该从中受益。在更高的帧频率情况下,使用面向AGP的应用软件,用户将看到更好质地、更细致、更高分辨率的画面。
本文将为3D软件开发者揭开AGP的面纱,基于相关的硬件、OS(操作系统)和API(应用程序接口)展示怎样使用AGP以及了解其基本原理。
仅仅是另一种总线吗?
AGP有非常简单的两个方面:(1)线路;(2)直接内存执行(我们在这里简称DIME)。AGP和PCI相似使用32位复合地址/数据线。不过PCI总线在33MHZ时钟频率下最大带宽为132MB/s而AGP在66MHZ下能产生的最大带宽竟达到528MB/s。在66MHZ的时钟频率下由于上升沿、下降沿都传送数据因而在大多数情况下它的速度能达到PCI的四倍。
注:
一些廉价硬件可能在每个时钟周期内仅支持一次传送,这时带宽为264MB/s,当然了,对于不同的系统,不同的应用软件吞吐量会有所变化,但是在实际的传输条件下,传送时的带宽为尖峰值的50%~80%。
AGP与PCI相比传输效率更高,因为AGP加了一些额外的信号线使之能进行流水线操作和响应请求队列,(图1)它重叠了n个请求在内存或总线上的传送时间。对于“n+1”“n+2”个请求传送的数据传送完成后,第n+1个请求传送才能开始传送。虽然AGP和PCI都能“突发”(对应于一个请求传送信号,连续的传送多个数据),但是对于天生不是流水线方式传送的PCI
总线来说仅能有限的利用“突发”。AGP流水线操作的深度依赖于硬件支持,但对于应用软件来说是透明的。另外,AGP包含8个额外的“边带”地址线,这些地址线使得图形芯片从最初的请求传送开始能在32位数据/地址线上同步地传出地址和数据。在图1中,边带同步传送将允许“An+1”个请求传送的地址和数据D1同步传送,而不是在D6传送完后在开始传送。
图 1: Non-pipelined
PCI vs. AGP An is the address of the request, and
Dn is the result
AGP为了能支持高时钟频率,AGP不像PCI那样适应面广,如果把PCI比作一辆多座位的公共汽车,那么AGP就像一辆跑车,它只有两种设施(芯片集和图形芯片)。图2
是把AGP系统简单化后的图,上面标明了最大带宽和内存的使用情况。在芯片的另一边—即内存控制器和系统内存之间的那条无名的总线是典型的64位总线。CPU、图形芯片、PCI总线都通过它来访问内存。因为大量的内存线与它相连,它的时钟频率与图像局部内存相比通常更慢。最初的芯片集对于系统总线的带宽限制为528MB/s但未来带宽可能会增大。对于100MHZ的64位总线来说局部内存的带宽限制为800MB/s。
图 2: Typical
AGP System Block Diagram
所谓的“AGP内存”只是系统DRAM中的动态分配的一块区域,AGP内存使得图形芯片能快速的存取数据(参见图2中需线所画的圆内部分)。速度取决于芯片集本身。芯片集能翻译地址,以至于图形控制器和图形软件认为它们所得的内存空间是连续的,而实际上所得的页面在物理上是不相连的。因而图形芯片能存储大的数据结构做为一个整体,例如位图(通常在1KB到128KB之间)。这种芯片集硬件被称为GART(图形地址映射彪)。GART在功能上和CPU芯片中的页面映射硬件相类似,见图3中的地址映射说明。
所需加工的线性虚地址被页面映射硬件翻译成物理地址。这些物理地址用来访问内存、局部帧缓冲、AGP存储器。CPU
存取帧缓冲和AGP存储器时适用于图形芯片相同的地址;为此,操作系统建立CPU 页面硬件虚到实1:1
的转换。
图 3: AGP
Address Mapping
为了能读写AGP内存,图形芯片和CPU使用几兆字节的连续虚存空间。但是GART把这些虚地址翻译成不同的,可能连续也可能不连续的页面,在内存中4KB/页。PCI
设备存取AGP存储器也是通过GART(例如捕获动画画面)。注:在未来CPU 访问AGP存储器时无需使用GART,因为CPU
页表可以建立相同的映射。但这种变化对于应用软件应该是透明的。正如你所想的一样,GART必须由操作系统初始化和修改。从AGP
地址通道中4KB大小的页面被分配或者释放。
直接内存执行(DIME)
画3D图形的像素点有两种方式:纹理映射和“渐变的”。简单的渐变意味着在一块区域内给每个点赋予相同的颜色,或者平滑的变化像素点的颜色,但是纹理映射包含来自于一张位图所带来的1、2、4、8个纹理元素,把它们加起来求平均,然后把它作一些数学近似处理,这值是位图(或复合位图)最终显示所需要的画面,并且应该把最终得到的像素点放入帧缓冲中。纹理元素的协调并不是微不足道的功能,它能提供3D视角并把物体的几何形状对象化的放入位图。
真正的AGP 图形芯片对于复杂的纹理映射操作系统,它能直接受益与系统内存(DIME,直接内存执行)。没有DIME
,大多数PCI 时代的图形控制器仅能从图形卡上的显存中获得纹理图(参见图4)。早期的一些AGP显卡仅仅像一个总线的主宰者,或者连着都不是,虽然它们将从新总线最快的传输率中受益。但是,它们不得不通过AGP把稳力图放入显存中,然后又不得不把纹理图又重新返回内存以得到各个纹理元素的映射。
图 4: Texture
Data Flow with PCI requiring an extra copy in Frame
Buffer RAM
如果这些芯片没有主宰总线的权利,那么CPU必须把纹理图从内存中调出然后通过总线写入帧缓冲。因而,纹理图由多个副本,一个存在与显存中,另一个存在于系统内存中。DIME
方式避免了多余的副本和额外的数据传输。
图 5: Texture
Data Flow with AGP Direct Memory Execute
显存通常比系统内存更贵并且当正在运行的软件不需要图像显示时,显存不可能被操作系统用于别的目的。图形芯片希望更快速地访问局部内存为了屏幕刷新,Z缓冲和像素点(包括前后两个缓冲)。因此,编程者可能总是希望有更多的纹理内存作为AGP系统内存可供使用。把纹理图从帧缓冲器中分离出来,留出更多的帧缓冲空间能得到更高的分辨率或者允许Z缓冲支持更大的屏幕尺寸。大多数软件要使用2—16MB的空间给纹理图。通过使用AGP和DIME,他们要求能被满足。
摘要,AGP的优点包括:
- 最大带宽是PCI总线的4倍,最优越的对边带和流水线的支持。
- 纹理图的直接内存执行
- 减少CPU和I/O对总线的需求以及内存的访问次数。PCI总线为磁盘控制器、网卡、以及视频捕获器等提供服务。AGP与PCI有相同点也有不同点,AGP的大多数内容是基于PCI之上的。更进一步说,由于在芯片集内部所谓的无序的和有序的硬件都支持的原因,CPU访问图形芯片的AGP内存。所以来自图形芯片的访问工作多么繁重,都不应该造成声音的中断或者其它CPU处理能力的下降。
- 为了访问内存的方便而增加一个额外的图形芯片,所以它能从AGP存贮器中读纹理图的同时并发地读/写局部内存的Z值和像素点。图形芯片使用图2的带宽在两个端口同时使用的情况下最大值为1.3GB/s,其中有0.8GB/S来自局部内存。
- 当它需要提供图形数据,例如命令或者动画等等,它允许CPU
直接写被共享的AGP内存。总的来说,CPU与其更快地访问主存不如通过AGP更快地访问显存,当然了比通过PCI
更快。
那么,应用软件开发这应该为AGP做些什么呢?有两种可能性:一是什么也不做;二是对AGP持乐观态度。对于这两者而言,AGP的最大优点是为3D图像提供更好、更大的纹理图并且实时动画不失真。现在的应用软件在有图形加速卡的情况下也通常不得不把纹理图的大小限制在2兆以下。AGP将改变这一切,可以预见未来的应用软件将包含更高品质的画面。
不需做任何的更新
许多现有的软件和新的一样不必为AGP而专门书写代码,并且在AGP系统上软件将运行的更快、更好。
3D应用软件当前应怎样管理纹理内存
通过一个缓冲或“交换”算法,应用软件决定哪一个纹理图应该被存储在局部内存中,而另一些被放在系统内存里。通常地,应用软件给后台一定比例的局部内存做为窗口到窗口纹理图的转换空间,另外,保留地后台内存中包含常被使用的纹理图(固定的纹理内存)—例如,同时移动的白云和海。对于显存为1、2、4M的不同的显卡,被保持在显存中的纹理图的数量和尺寸有所不同。
如果硬件能从局部内存中得到纹理图,算法将预先把每一帧或每一屏所需的纹理图放入了局部内存。没有预先放置,当软件停止重画屏幕时用户将会看见一个停滞的画面,因为所需的纹理图需要被交换放入内存。因为所需的纹理图需要被放入显存,更糟的是不得不把纹理图从磁盘放入主存,再从主存放入局部内存,这样的画面停滞现象更严重。如果需要把格式转换成一种硬件定义的压缩格式,在初始的纹理图地载入过程中会出现更长的停滞过程。交换行为的流图参阅图6左边。
应用软件可以保留局部内存的一部分用作交换,也可以永久的保留它的一部分永久地载入固定的经常使用的纹理图。基于每帧的纹理图的数量,算法可以变化内存的比例分配用于纹理图的交换和固定纹理内存。包含更大数量的纹理图的画面将有更少的可重用纹理图;这些画面需要更大的纹理图交换空间。
DOS应用程序
当然了纹理图直接内存执行要求GART,因为当今的操作系统使用虚地址这一概念。以前使用的操作系统(例如DOS
)没有虚地址的概念。因此GART的工作也就不可能被做。老的应用程序运行在DOS环境下将从更快的AGP速度中受益,但要使其收益要做一些面向芯片的DIME特点的驱动工作。也有可能这些工作不起作用。
Windows应用程序
没有修改过的Windows应用程序也能从AGP中受益,因为OS和DirectDraw已经做了略微的改动以默认方式支持AGP。以下内容来自微软的站点:
“微软将增加对AGP的支持,在它的产品中Windows95[版本号:实际上版本号为Memphis]和产品Windows
NT[版本号:NT版本5.0]。通过微软的“DirectDraw”API,应用软件能对AGP进行控制。在这两种操作系统的未来版本中将对AGP进行软件支持。这种支持放在有“DirectDraw”的版本中,计划1997年的下半年发行。
在Windows95和Windows
NT中微软将提供列举和初始AGP装置的代码。操作系统也将负责初始化AGP硬件和管理系统内存到视频硬件地址空间的映射。这种支持大多数做的是幕后工作。它们不直接面向应用程序员。如果应用程序员想要使用AGP功能,那么可以使用“DirectDraw”API。
“DirectDraw”能从显示驱动器中或的AGP内存数量的信息。这种信息包含显示硬件的地址空间范围。通过“DirectDraw”API应用程序能通过配置表面的方式请求访问AGP内存。“DirectDraw”通过底层的系统服务完成这种请求。这些服务能委托和页锁系统内存的页面,然后建立AGP映射表以允许显示硬件访问这些页面。
如果操作系统认为没有严重冲击系统的行为页面不可能被锁,表面配置请求将会失败。在一些情况下,操作系统可以请求“DirectDraw”要释放已经分配的AGP内存。“DirectDraw”将无效化必要的表面和解开受影响的页面的锁。这种情况就像发生了显示模式的变化显示内存必须重新配置。“DirectDraw”应用程序已经着手对付一个视频内存在任何时候可能被丢失的情况。
(http://www.microsoft.com/hwdev/devdes/msagp.htm
Feb 1997).
注:操作系统锁住分配给AGP的页面,以至于它们不可能用作磁盘交换。现在(1997年)供AGP使用的内存的数量是由系统注册表中的一个值决定的,但我们希望分配给AGP的内存大小应该近似的等于内存总量减去操作系统及当前应用程序所需的内存量。例如,在一个内存为32兆的系统中,可供AGP使用的内存应为16兆到24兆。
因为当前的硬件工具、操作系统将制造AGP内存非缓冲的图形内存将被操作系统做上“联合写”的标记,这将比直接写的无缓冲的图形内存有着快许多倍的写访问。当总线空显示,此时总线可用作传输,WC存储区域让CPU把多个小心的写合成一个总线上的突发写,使用芯片上的专门的已建立的写缓冲。除了速度快外,其它方面对应用软件应保持透明。虽然WC的读访问速度并不比VC快,但VC内存的使用将使PII处理机不得不序列化执行,这有可能执行的更慢。复合写在出CPU以前,有可能联合成功,也有可能是不成功的,这种不确定性对于硬件驱动器将会产生一些影响,要解决这些问题可采用的方法是连续协同一个地方,二是内存写强制排序。
默认的直画式内存的配置
如果应用软件没有其它的专门的要求,微软的“DirectDraw”将以默认方式指派以下几个方面(I.E.分配内存):
- 局部图形控制器内存(叫做显存或帧缓冲区或后台存储器)
- AGP内存(非局部显存)
- 系统内存
如果有足够的空间分配给应用软件所要求的大小,“DirectDraw”将进行分配。举一例子,一个应用程序运行于分辨率为640Χ480的画面,每个像素点以16为表示,并且使用双缓冲和一个Z缓冲,这三个缓冲区每一个需600K。本例中应用程序要使用64个纹理图。每个256X256,16bits/texel,那么纹理图加起来为64X128K=8M。假设硬件包含2M的LFB(局部帧缓冲)内存。
这个应用软件首先申请了600K的前景缓冲区,600K的背景缓冲区和600K的Z缓冲区。“DirectDraw”把它们设置在显存中。如表1中显示显存仅剩下200K。所以“DirectDraw”把一个纹理土放在余下的空间中,另外63个放在了AGP内存中。如果显卡上的显存改为4M,那么在余下的2
.2M空间里能放下17个纹理图。剩下的纹理图在AGP内存中。
Sample
RAM
allocation,
for 16-bit pixels & Z, with 8M of textures
desired. |
640x480
Window and 2M Local Video RAM |
800x600
Window, 4M Local RAM |
1024x768
Window, 4M Local RAM |
Front
buffer |
600K |
0.92M |
1.5M |
Back
buffer |
600K |
0.92M |
1.5M |
Z-buffer |
600K |
0.92M |
Won't
fit |
Remaining
Local RAM (for textures, scratch, cursors) |
200K
(from
a 2M FB) |
1M
from a 4M Frame buffer |
1M
from a 4M Frame buffer |
AGP
used for textures |
7.8M |
7M |
8M |
表 1: RAM
Allocation Examples
3D加速卡通常支持16位,这将产生高质量的画面,因此我们在这儿假设16位的像素点、16位Z缓冲,16位的文本元素。有些应用程序为了有更多的显存留给纹理图使用8位的纹理图并且避免使用Z缓冲。又于仅有没被加速的软件工具,8位像素点被典型的使用并且没有Z缓冲。这样能使显存放下更多的纹理图。图标化了,仅SW的工具不想要纹理图在显内存中或者也可以需要纹理图在内存中。
如果应用软件尽力要分配一个大数量的空间给纹理图,假设对于一个24兆的系统,操作系统允许AGP内存最多占其中的16兆,那么24兆请求的后8兆有可能被拒绝,也有可能在内存中被分配。应用软件必须检查函数CreateSurface()的返回值来判断分配是否成功,这将在以后解释。
如果图形芯片从AGP内存中获得纹理图,那该怎么办?非常幸运,这种情况阻止了DirectDraw为纹理图分配任何一个非显存区域。图形芯片驱动器把自己的能力报告给操作系统和“DirectDraw”,如果芯片不可能DIME
,DirectDraw将仅仅给应用程序分配显存和系统内存。DirectDraw标志DDSCAPS_NONLOCALVIDMEM告诉应用程序是否它有AGP内存,这部分将在以后讨论。相类似地,如果图形芯片不可能从显存中获得纹理图,DirectDraw不将配置任何局部纹理画面。
AGP的目标
带DIME的现实的AGP-compliant的硬件能实际上形成更简单的应用程序。但是,给AGP的PC硬件将有3个特色,并且,软件将支持所有特色
:
1.不用DIME:这硬件在AGP上,但是不开发其DIME特色。它能比PCI设备更迅速地转换数据。也许它不开发流水线数据处理能力或边带访问。
2.DIME(直接的存储器执行):这硬件从系统(AGP)存储器给纹理着色。这样应用程序不需要交换纹理到局部存储器。硬件可以,或者不可以能从局部存储器做纹理。当从局部做NOT纹理,它可以更迅速完成。由于为像素写、屏幕刷新、像素读、和Z-值而访问给局部存储器会产生冲突。
3.DIMEL(直接的存储器执行,同样也做局部执行):当为了着色纹理并列地开发局部存储器和AGP存储器时,这硬件运行最好。频繁地被使用的纹理或更小的纹理将最好驻留在局部的RAM,另一方面,更大的不经常被使用的纹理在系统存储器。这样主存储器上的带宽消耗被减少到最小,减少在CPU和图形学芯片之间冲突。
为了把DIME硬件作为目标,应用程序按在图6中所示的流程图运作。它把空间在AGP存储器中分配给每个纹理,然后在那里加载将在这结构或全部场景上需要的纹理。它不为用显示虚线而烦恼,换句话说,显示虚线就是给局部的RAM拷贝一些纹理。
如果它不能把全部纹理安到DirectDraw同意分配的AGP存储器上的话,app必须从磁盘最终拷贝一些更多的纹理成为AGP
RAM。在使用大数量纹理的非常真实的飞行仿真器或其他的应用程序中,需要从磁盘或网络将纹理传送到AGP
RAM中,而不管RAM DirectDraw给他们多少RAM。
图6 AGP前和后的纹理存储管理
|