R700指令集架构参考手册第三章——控制流(CF)程序
2011-01-12 22:51
295 查看
一个控制流(CF)程序是一个主程序。它通过使用控制流指令(带条件的跳转、循环、以及子例程)指引程序子句流,并且它可以包括存储器分配指令和其它指定顶点和几何程序什么时候已经完成它们操作的指令。R700硬件维护一单个多条目栈,用于保存和恢复活动掩膜、循环计数器、以及子例程的返回地址。
CF指令可以:
1、执行一个ALU、取纹理或取顶点子句,局部数据共享子句,或存储器读子句。这些操作获取子句执行的地址,以及指示子句大小的一个计数。一个程序可以指定,一个子句必须等待,直到先前被执行的子句完成;或一个子句必须有条件地执行(只有活动像素执行此子句,并且如果没有活动像素的话,该子句被整个跳过)。
2、执行一个DirectX9风格的循环。有两条指令标记了循环开头和结尾。每条指令取其成对的LOOP_START和LOOP_END指令的地址。一个循环从32个常量的其中之一读取,获得循环计数、初始索引值以及索引增量值。循环可以被嵌套。
3、执行一个DirectX10风格的循环。有两条指令标记了循环开头和结尾。每条指令取其成对的LOOP_START和LOOP_END指令的地址。循环可以被嵌套。
4、执行一个重复循环(重复循环并不维护一个循环索引)。重复循环以LOOP_START_NO_AL和LOOP_END指令实现。这些循环可以被嵌套。
5、跳出最里层的循环。LOOP_BREAK指令获取相应的LOOP_END指令的一个地址。LOOP_BREAK指令可以是有条件的(仅对于满足一个跳出条件的像素执行)。(译者注:类似于C语言中的break关键字)
6、继续一个循环,开始最里层循环的下一次迭代。LOOP_CONTINUE指令获取相应LOOP_END指令的一个地址。LOOP_CONTINUE指令可以是有条件的。(译者注:类似于C语言里的continue关键字)
7、执行一个子例程CALL或RETURN。一个CALL获取一个跳转地址。一个RETURN不会获取地址;它返回在栈顶部的地址。CALL可以是有条件的(只有满足一个条件的像素才执行该指令)。CALL可以被嵌套。
8、调用取顶点着色器(FS)。在一个VTX或VTX_TC控制流指令中的地址域是不被使用的;取顶点子句的地址是全局的,并且被主机写。因而,嵌套这些调用是毫无意义的。
9、跳转到控制流中的一个指定地址。一条JUMP指令可以是有条件或无条件的。
10、在当前流控制的活动掩膜上执行操作(比如:执行一条ELSE指令,保存和恢复栈上的活动掩膜)。
11、在一个缓存中分配数据存储空间并导入(读)或导出(写)地址或数据。
12、发送信号,几何着色器(GS)已经完成了输出一个顶点,并可选地作为一个图元带(primitive strip)的结束。
CF程序的结束通过设置程序中最后一条CF指令的END_OF_PROGRAM位来标记。CF程序在本条指令的结束之后终止,不管这条指令是否有条件地被执行了。
3.1 CF微代码编码
CF指令可以:
1、执行一个ALU、取纹理或取顶点子句,局部数据共享子句,或存储器读子句。这些操作获取子句执行的地址,以及指示子句大小的一个计数。一个程序可以指定,一个子句必须等待,直到先前被执行的子句完成;或一个子句必须有条件地执行(只有活动像素执行此子句,并且如果没有活动像素的话,该子句被整个跳过)。
2、执行一个DirectX9风格的循环。有两条指令标记了循环开头和结尾。每条指令取其成对的LOOP_START和LOOP_END指令的地址。一个循环从32个常量的其中之一读取,获得循环计数、初始索引值以及索引增量值。循环可以被嵌套。
3、执行一个DirectX10风格的循环。有两条指令标记了循环开头和结尾。每条指令取其成对的LOOP_START和LOOP_END指令的地址。循环可以被嵌套。
4、执行一个重复循环(重复循环并不维护一个循环索引)。重复循环以LOOP_START_NO_AL和LOOP_END指令实现。这些循环可以被嵌套。
5、跳出最里层的循环。LOOP_BREAK指令获取相应的LOOP_END指令的一个地址。LOOP_BREAK指令可以是有条件的(仅对于满足一个跳出条件的像素执行)。(译者注:类似于C语言中的break关键字)
6、继续一个循环,开始最里层循环的下一次迭代。LOOP_CONTINUE指令获取相应LOOP_END指令的一个地址。LOOP_CONTINUE指令可以是有条件的。(译者注:类似于C语言里的continue关键字)
7、执行一个子例程CALL或RETURN。一个CALL获取一个跳转地址。一个RETURN不会获取地址;它返回在栈顶部的地址。CALL可以是有条件的(只有满足一个条件的像素才执行该指令)。CALL可以被嵌套。
8、调用取顶点着色器(FS)。在一个VTX或VTX_TC控制流指令中的地址域是不被使用的;取顶点子句的地址是全局的,并且被主机写。因而,嵌套这些调用是毫无意义的。
9、跳转到控制流中的一个指定地址。一条JUMP指令可以是有条件或无条件的。
10、在当前流控制的活动掩膜上执行操作(比如:执行一条ELSE指令,保存和恢复栈上的活动掩膜)。
11、在一个缓存中分配数据存储空间并导入(读)或导出(写)地址或数据。
12、发送信号,几何着色器(GS)已经完成了输出一个顶点,并可选地作为一个图元带(primitive strip)的结束。
CF程序的结束通过设置程序中最后一条CF指令的END_OF_PROGRAM位来标记。CF程序在本条指令的结束之后终止,不管这条指令是否有条件地被执行了。
3.1 CF微代码编码
相关文章推荐
- R700指令集架构参考手册——第二章:程序组织和状态
- R700指令集架构参考手册第二章——2.5 程序状态
- 《PL/SQL 语言开发参考手册》之二:PL/SQL 程序结构
- STM32F103学习3:通过器件参考手册和具体程序学习I/O输出操作(MDK软件仿真+硬件实验)
- 【Python学习】python学习手册--第三章 如何运行程序
- JavaWeb程序参考手册
- 《PL/SQL 语言开发参考手册》之二:PL/SQL 程序结构
- 10、MySQL 8.0参考手册 4.5.4 mysqldump - 数据库备份程序
- 10、MySQL 8.0参考手册 4.5.5 mysqlimport - 数据导入程序
- 21,MySQL 8.0参考手册 4.7 MySQL程序开发实用程序
- 9、MySQL 8.0参考手册 4.2.3指定程序选项
- 《Red5 用户参考手册》之十:Red5 核心技术第三章 自定义流路径
- PHP程序开发参考手册
- R700指令集架构参考手册——第一章:介绍
- 9、MySQL 8.0参考手册 4.1 MySQL程序概述
- 《Red5 用户参考手册》之四:入门第三章 迁移指南
- 9、MySQL 8.0参考手册 4.2.1调用MySQL程序
- Libevent参考手册第三章:与事件循环一起工作
- KnockoutJS 3.X API 第三章 计算监控属性(5) 参考手册
- Libevent参考手册第三章:与事件循环一起工作