【原创】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平台上)这样的指令产生中断称为软件中断,硬 ...
随机推荐
- 对文件 I/O,标准 I/O 的缓冲的理解
1.标准I/O缓冲区 要理解标准I/O,就要先知道文件I/O的业务逻辑. 下面图示为文件I/O 如执行下面的代码: write(fd, buf2, sizeof(buf2)); 图中 buf:就是bu ...
- C# 打开帮助文档,打开电脑中其他应用或者文件
打开帮助文档 System.Diagnostics.Process.Start(Directory.GetCurrentDirectory() + "\\" + "hel ...
- C# 控件置于最顶层、最底层、隐藏、显示
控件置于最顶层.最底层 pictureBox1.BringToFront();//将控件放置所有控件最前端 pictureBox1.SendToBack();//将控件放置所有控件最底端 控件隐藏.显 ...
- 理解JAVA与C的运行机制
1.java的运行机制 java的编译过程,将java的源程序(扩展名为.java的文件),由java编译程序将java的字节码文件(.class文件)在jvm上运行,机器码有cpu运行, jvm编译 ...
- TCP close seq问题
测试mt_hls一条流时,发现会话的时长总是对应不上. 仔细观察发现: 注意 1.包1735 (客户端) 发送FIN 请求,seq = 2435582428 2.包1736,1737,1738 (服务 ...
- 更新域名解析以后,IP在cmd中ping不正确,清理DNS缓存
1清除ARP缓存,cmd下使用命令arp -d*代替执行. 2清除NETBT,cmd下使用命令nbtstat -R代替执行. 再清除DNS缓存,cmd下使用命令ipconfig /flushdns代替 ...
- 抓取网站访问者的QQ号码
开源,是一种精神.但不开源,并不是没有精神,而可能是代码写得惨不忍睹,我属于后者.(首先申明:对代码提出意见可接受,虚心接受,但不能人身攻击啊!) 最近闲的蛋疼,喜欢到处看看做得好的站点, 莫 ...
- python 3 使用cmp函数报错
python3 中已经不使用cmp函数进行比较大小,使用operator模块 import operator lt(a,b) 相当于 a<b 从第一个数字或字母(ASCII)比大小 le(a,b ...
- Python全栈 MySQL 数据库 (引擎、事物、pymysql模块、orm)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 存储引擎(处理表的处理器) 基本操作: ...
- 第三节 MVC应用程序架构和测试
在查看如何测试单个功能之后,您可能会问,整个Web应用程序如何? 如前所述,有以下级别的测试: 单元测试 集成测试 功能测试 在开始编写测试时考虑这一点很重要. 可能还有其他类型的测试,但现在让我们关 ...