【原创】Linux环境下的图形系统和AMD R600显卡编程(3)——AMD显卡简介
早期的显卡仅用于显示,后来显卡中加入了2D加速部件,这些部件用于做拷屏,画点,画线等操作。随着游戏、三维模拟以及科学计算可视化等需要,对3D的需求逐渐增加,早期图形绘制工作由CPU来完成,要达到真实感和实时效果,只能绘制一些简单的线框模型,上世纪80年代,斯坦福大学的Jim Clark教授率先提出用专用集成电路技术实现一个专用的3D图形处理器的设想,于1984年推出了世界上第一个通用图形工作站IRIS1400。
AMD最早的显卡从R100开始,一直到R900(R600以后也使用HD xxxx作为代号),R900(HD 6xxx)之后是HD 7xxx系列,目前最新的显卡使用 Rx 2xx代号,最新的是Radeon R9 2xx系列。这里只描述R600显卡的编程,因此只讨论R600之前和之后不久的显卡。
AMD显卡的演变过程如下(参考wiki页和Plan9操作系统开发人员的PPT):

图1
R100是一款固定功能流水线的显卡,R200为可编程处理器,R300在R200的基础上发生了比较大的变化,此后的R400 和R300差别不大。到R500的时候GPU除了有vbios外,还引入了atombios,atombios是一段比较简单的脚本,和具体平台无关,解释器解释执行(代码集成在内核驱动里面),然而3D核较R300变化不大,寄存器变化也比较少(变化主要变化在pixel shader 部分)。
R600在R500的基础上发生很大的变化,2D部件被废除,3D部件改成了unified shader架构,GPU的寄存器和原来完全不同,由于体系结构的变化,对硬件编程也和原来有了很大变化。R700 GPU是R600的优化版,在驱动层面上,R700的编程和R60的编程基本上是一样的,后续的Evergreen、Southern Island和Northern Island都是这种unified shader架构的延续,因此理解R600的编程后将比较容易理解后续GPU核的编程。
本书的后续部分针对R600核心进行描述,总体来说,R600硬件在R500基础上重要的变化包括(参考Radeon R6xx/R7xx Acceleration):
- 不再包含2D加速部件,所有的加速都使用3D部件完成
- 使用Shader Model 4.0,使用Unified shader架构,vertex shader、fragment shader(以及geometry shader)不再分成单独的部件,而是被统一起来,另外包含Geometry shader
除了以上变化之外,还有一点值得注意的是,R600显卡GPU核的计算都是基于标量的,而不是像以前的那样基于矢量的(参考ATI Radeon HD 2000 programming guide)。
对于软件编程而言寄存器读写方式上也有比较大的变化,过去对R500编程的时候,所有的对硬件的编程都是可以用命令包或者普通的直接写寄存器的方式进行的,但是R600的部分寄存器是不能够通过直接写寄存器的方式进行编程的,必须通过3型命令包的方式进行(看到的代码都是这样的,R600寄存器手册上有很多寄存器地址都是一样的,但是含义不同,这些寄存器偏移都大于等于0x8000,是否正确??)。
Linux系统下的drm、exa、mesa代码也和这种变化相对应,通常来说,以Radeon_开头的函数名针对的是r100显卡或者后续显卡的公共代码,R200_开头的函数仅针对r200核心的显卡,R300_开头的函数针对r300、r400和r500,R600_开头的函数针对r600、r700,Evergreen_开头的的函数针对HD5xxx和HD6xxx系列。
后续的blog将介绍AMD显卡的显存管理机制、命令处理、中断机制,然后介绍3D引擎,3D引擎部分包括显卡的图形流水线和对3D引擎的编程以及R600的指令集。后续的内容是阅读代码和AMD公开的部分资料后对相关内容的理解,这些理解肯定有不少错误,仅供参考。
相关参考资料:
AMD公布的资料可以在这里看到,AMD公布的R500核心的编程资料是最完整和最详细的,这部分资料详细介绍了R500显卡工作的原理和一些编程细节。
【原创】Linux环境下的图形系统和AMD R600显卡编程(3)——AMD显卡简介的更多相关文章
- 【原创】Linux环境下的图形系统和AMD R600显卡编程(1)——Linux环境下的图形系统简介
Linux/Unix环境下最早的图形系统是Xorg图形系统,Xorg图形系统通过扩展的方式以适应显卡和桌面图形发展的需要,然而随着软硬件的发展,特别是嵌入式系统的发展,Xorg显得庞大而落后.开源社区 ...
- Linux环境下的图形系统和AMD R600显卡编程(1)——Linux环境下的图形系统简介
转:https://www.cnblogs.com/shoemaker/p/linux_graphics01.html Linux/Unix环境下最早的图形系统是Xorg图形系统,Xorg图形系统通过 ...
- 【原创】Linux环境下的图形系统和AMD R600显卡编程(2)——Framebuffer、DRM、EXA和Mesa简介【转】
转自:http://www.cnblogs.com/shoemaker/p/linux_graphics02.html 1. Framebuffer Framebuffer驱动提供基本的显示,fram ...
- 【原创】Linux环境下的图形系统和AMD R600显卡编程(5)——AMD显卡显命令处理机制
通常通过读写设备寄存器对设备进行编程,在X86系统上,有专门的IO指令进行编程,在其他诸如MIPS.SPARC这类系统上,通过将设备的寄存器映射到内存地址空间直接使用读写内存的方式对设备进行编程. R ...
- 【原创】Linux环境下的图形系统和AMD R600显卡编程(9)——R600显卡的3D引擎和图形流水线
1. R600 3D引擎 R600核心是AMD一款非常重要的GPU核心,这个核心引入了统一处理器架构,其寄存器和指令集同以前的GPU 都完全不同,对其编程也有比较大的区别. 图1显示了R600 GPU ...
- Linux环境下的图形系统和AMD R600显卡编程(2)——Framebuffer、DRM、EXA和Mesa简介
转:https://www.cnblogs.com/shoemaker/p/linux_graphics02.html 1. Framebuffer Framebuffer驱动提供基本的显示,fram ...
- 【原创】Linux环境下的图形系统和AMD R600显卡编程(6)——AMD显卡GPU命令格式
前面一篇blog里面描述了命令环缓冲区机制,在命令环机制下,驱动写入PM4(不知道为何会取这样一个名字)包格式的命令对显卡进行配置.这一篇blog将详细介绍命令包的格式. 当前定义了4中命令包,分别是 ...
- 【原创】Linux环境下的图形系统和AMD R600显卡编程(10)——R600显卡的3D引擎编程
3D图形处理流水线需要流经多个硬件单元才能得到最后的渲染结果,流水线上的所有的硬件单元必须被正确编程,才能得到正确的结果. 总体上看,从图形处理流水线的源头开始,需要准备好vertex和index,在 ...
- 【原创】Linux环境下的图形系统和AMD R600显卡编程(7)——AMD显卡的软件中断
CPU上处理的中断可以分成“硬件中断”和“软件中断”两类,比如网卡产生的中断称为硬件中断,而如果是软件使用诸如"int 0x10"(X86平台上)这样的指令产生中断称为软件中断,硬 ...
随机推荐
- 用for循环计算(1-3+5-7...99)的结果(两种方法)
1) sum=0 count=1 for i in range(1,100,2): if count % 2==0: sum = sum - i else: sum = sum + i count = ...
- android systemtrace 报错
折腾了很久,妈的,终于可以跑出来systemtrace了.如果你跟我一样,老是生成trace失败,那么,按我说的啦: 坑就在,你必须选一个路径存放trace.html,你不选一个,他就生成不了. 打开 ...
- 静态html引入js添加随机数后缀防止缓存
在web项目开发中,页面引入js被修改时,为避免浏览器缓存引起的问题,在引入js时,给js名后面加上随机数,以保证每次都发送新的请求. 在jsp中,一般通过后台取随机数即可,代码如下: <scr ...
- error LNK2001: unresolved external symbol @__security_check_cookie
Q:VS2005编译的静态库, 在vc++6.0中连接出现错误 error LNK2001: unresolved external symbol @__security_check_cookie@l ...
- shell编程——参数传递
1.Linux Shell参数引用 $0 这个程式的执行名字$n 这个程式的第n个参数值,n=1..9$* 这个程式的所有参数$# 这个程式的参数个数$$ 这个程式的PID$! 执行上一个背景指令的P ...
- 使用 jQuery Mobile 与 HTML5 开发 Web App 系列文章目录
使用 jQuery Mobile 与 HTML5 开发 Web App 系列文章目录 时间:2012年9月20日 分类:JavaScript 标签:HTML5‚ jQuery Mobile‚ Web ...
- 《Cracking the Coding Interview》——第3章:栈和队列——题目4
2014-03-18 05:28 题目:你肯定听过汉诺威塔的故事:三个柱子和N个从小到大的盘子.既然每次你只能移动放在顶上的盘子,这不就是栈操作吗?所以,请用三个栈来模拟N级汉诺威塔的玩法.放心,N不 ...
- 【Regularization】林轩田机器学习基石
正则化的提出,是因为要解决overfitting的问题. 以Linear Regression为例:低次多项式拟合的效果可能会好于高次多项式拟合的效果. 这里回顾上上节nonlinear transf ...
- Http状态码枚举(摘自 Microsoft 程序集 System.dll)
// 摘要: // 包含为 HTTP 定义的状态代码的值. public enum HttpStatusCode { // 摘要: // 等效于 HTTP 状态 100. System.Net.Htt ...
- drf解决跨域问题 使用 django-corse-headers扩展
跨域CORS 使用django-corse-headers扩展 安装 pip install django-cors-headers 添加应用 INSTALLED_APPS = ( ... 'cors ...