第11章 像素和顶点数据导出
导出指令将像素或顶点着色器数据从VGPR(向量通用寄存器)复制到专用的输出缓冲区。导出指令输出以下类型的数据:
顶点位置
顶点参数
像素颜色
像素深度(Z)
11.1 微码编码
导出指令使用EXP(导出)微码格式。
表46. EXP编码字段描述
| 字段 | 大小 | 描述 |
|---|---|---|
| VM | 1 | 有效掩码(Valid Mask)。设置为1时,表示EXEC掩码代表该波前的有效掩码。每个着色器可以多次发送(使用最终值),但每个像素着色器必须至少发送一次。 |
| DONE | 1 | 这是程序的最终像素着色器或顶点位置导出。仅用于像素和位置导出。对于参数导出,设置为零。 |
| COMPR | 1 | 压缩数据。设置时,表示导出的数据每个分量是16位,而不是通常的32位。 |
| TARGET | 6 | 表示导出数据的类型: 0..7 MRT 0..7 8 Z(深度) 9 空(无数据) 12-15 位置 0..3 32-63 参数 0..31 |
| EN | 4 | COMPR==1:导出半双字使能。有效值为:0x0、3、C、F。 [0] 使能VSRC0:来自一个VGPR的R、G分量 [2] 使能VSRC1:来自一个VGPR的B、A分量 COMPR==0:[0-3] = VSRC0..3的使能位。 EN可以为零(当仅向NULL目标导出有效掩码时使用)。 |
| VSRC3 | 8 | 读取数据的VGPR。 位置和参数:vsrc0=X,1=Y,2=Z,3=W MRT:vsrc0=R,1=G,2=B,3=A |
| VSRC2 | 8 | 读取数据的VGPR。 |
| VSRC1 | 8 | 读取数据的VGPR。 |
| VSRC0 | 8 | 读取数据的VGPR。 |
11.2 操作
11.2.1 像素着色器导出
导出指令将颜色数据复制到MRT(多重渲染目标)。数据有四个分量(R、G、B、A)。可选地,导出指令也输出深度(Z)数据。
每个像素着色器必须至少有一条导出指令。最后执行的导出指令必须将DONE位设置为1。
EXEC掩码应用于所有导出。只有对应EXEC位设置为1的像素才会将数据导出到输出缓冲区。多次导出的结果会在输出缓冲区中累积。
至少有一个导出必须将VM位设置为1。除了将数据复制到颜色或深度输出缓冲区外,此导出还通知颜色缓冲区哪些像素有效,哪些已被丢弃。EXEC掩码的值传达像素有效掩码。如果发送了多个VM设置为1的导出,则使用最终导出的掩码。如果着色器程序只想更新有效掩码而不发送任何新数据,程序可以向NULL目标执行导出。
11.2.2 顶点着色器导出
顶点着色器使用导出指令将顶点位置数据和顶点参数数据输出到输出缓冲区。这些数据会传递给后续的像素着色器。
每个顶点着色器必须至少输出一个位置向量(x、y、z;w是可选的)到POS0目标。最后一个位置导出必须将DONE位设置为1。顶点着色器可以导出零个或多个参数。为了获得增强的性能,应尽可能早地在顶点着色器中输出所有位置数据。
11.3 依赖性检查
硬件执行导出指令分为两个阶段。首先,指令被选择执行,EXPCNT递增1。此时,硬件请求完成指令所需的内部总线使用权。
当获得总线访问权限时,读取EXEC掩码并发送VGPR数据。在发送完最后一个VGPR数据后,EXPCNT计数器递减1。
使用S_WAITCNT等待EXPCNT,以防止着色器程序在导出操作完成之前覆盖EXEC或保存要导出数据的VGPR。
多个导出指令可以同时处于未完成状态。相同类型的导出(例如:位置)按顺序完成,但不同类型的导出可以乱序完成。
如果STATUS寄存器的SKIP_EXPORT位设置为1,硬件会将所有EXPORT指令视为NOP(空操作)。