1. R600 3D引擎

  R600核心是AMD一款非常重要的GPU核心,这个核心引入了统一处理器架构,其寄存器和指令集同以前的GPU 都完全不同,对其编程也有比较大的区别。

  图1显示了R600 GPU 核心的硬件逻辑图,R600 GPU 包含并行数据处理阵列(DPP array)、命令处理器、内存控制器以及其他逻辑部件,R600的命令处理器读取驱动编写命令并解析命令,R600还要将硬件产生的“软中断”发送给CPU。R600的内存控制器能够访问R600 GPU核上的所有内存(VRAM内存,或者称本地内存)以及用户配置的系统内存(GTT内存),为了满足GPU 读写的需要,R600 GPU还要完成DMA控制器的功能。

  CPU上运行的程序不能够直接写R600 GPU的本地内存,但是CPU程序能够命令R600将数据或者程序拷贝到R600 本地内存或者从本地内存拷贝数据到系统内存上。完整的能够在R600上运行的程序包含两个部分:一部分是在主机(CPU)上运行的程序,一部分是在R600处理器上运行的程序,处理图形应用时这部分程序称为Shader 程序,进行GPU 通用计算时,这部分程序称为Kernel 程序。

图1

  本节内容全部来自AMD手册“R600 Instruction Set Architecture”。

2. R600 图形流水线

  本节内容来自文档“Radeon R6xx/R7xx Acceleration”,阅读这篇文档之前,读者最好了解过3D图形流水线。

  输入数据大体上按照“顶点处理”、“图元组装”、“光栅化”、“片段处理”、“输出”的过程流经图形硬件,在Shader Model 4.0中加入了Geometry shader和Tesselation shader,这两部分暂时不予以考虑。图2是AMD R600的图形流水线:

  

图2

命令处理

  命令处理器阶段处理环形命令缓冲区和间接缓冲区中的命令流,命令处理器处理这些命令流的时候通常会产生一系列的写寄存器活动(后面会讨论一些寄存器的读写问题,有些寄存器只能使用命令流的形式写,而且无法读)。驱动设置好index buffer(GTT内存)并将index buffer告知硬件,被命令触发后,“顶点组装和细分器(vertex grouper and tesselator, VGT)”根据index buffer的地址将索引数据DMA到SPI (shader pipe interpolator,将为shader分配资源)上,同时将图元的连接信息发送给“图元组装器”(primitive assembly)。

顶点处理

  所有的着色处理(shader processing,也即GPU核上进行的各种运算)都是在统一着色器块(unified shader block)中进行的,统一着色器块包含Sequencer (SQ,控制shader运行)和Shader pipe(SP)模块,每一个shader程序都能够访问一些通用寄存器,这些通用寄存器是在shader 程序运行之前(由SPI)动态分配的,SPI会往这些寄存器中加载合适的参数,这些参数包括顶点数据的基地址。然后SPI会为SQ启动程序执行过程,shader程序需要做的第一件事情就是取顶点数据,然后针对这个顶点运行shader程序,顶点处理shader的输出被放置到“着色器输出缓存”(shader export,SX)中(由于pixel 处理过程和vertex处理过程在同样的硬件上运行,所以pixel shader的输出也是放到SX 中),R600的顶点处理过程的输出包含两部分:Position Cache 放置顶点的坐标信息,Parameter Cache放置顶点的其他属性信息。

在没有Geometry shader的情况下,顶点数据的处理按照下面流程进行:

  • VGT获取到一个指向index buffer的指针,VGT 遍历所有的索引并一个个发送到SPI 里面
  • SPI将其输入缓存中的索引数据组成称为wavefront的向量(wavefront最多64个顶点)
  • 当wavefront准备好后,SPI根据驱动提供的大小(驱动向 SQ_PGM_RESOURCE_VS 寄存器写入的)分配GPR(通用寄存器,所有的通用寄存器都是32*4=128bit的,可以存放一个四维的浮点数向量)和线程空间(thread space),然后这些索引被放入到GPR中(GPR 的id 是由谁指定的),shader core 被通知一个新的wavefront 准备好了;
  • Shader core对Wavefront上的每个顶点运行顶点处理程序
    • 顶点处理器根据GRP中的索引取出顶点数据(使用fetch指令或者单独的fetch程序)
    • 顶点数据被取到GPR中
    • Shader程序的其他部分继续运行
    • Shader程序在SX的position Cache中分配空间,并将顶点的坐标信息(XYZW)输出到这片空间
    • Shader程序在SX的Parameter cache中分配空间,将顶点的其他属性信息(颜色,纹理)发送到这片空间,程序退出
  • SPI被告知一个wavefront的所有顶点处理完毕,SPI释放掉GPR

  配置好渲染状态后,除了第4步外,上面的过程对用户(驱动程序)来说是透明的,第4步是按照用户编写的shader的程序的流程执行的。

片段处理

  顶点处理完成后,顶点数据被发送到“图元组装器”(PA)中进行图元组装(注意到过程1已经将顶点连接信息发送给了图元组装器),PA的输出被发送给“扫描转换器”(scan convert,SC)进行扫描转换(光栅化过程,差值计算),SC会检查“深度缓存”(Depth buffer,DB)确定片段的可用性,这个检查过程会进行Early Z、Re-Z和HiZ处理(可以这么理解,SC 检查z buffer,如果片段的深度值比depth buffer 中的值还要大,则该片段被遮挡,在没有开启blending的情况下,这个片段可以扔掉,后续就不用处理了,如果开启了blending 的,则还要进行后续处理)。光栅化出来的片段被发送给SPI,再进入到shader core 里面进行最后的片段处理。片段处理器会进行取纹理、ALU计算以及内存读写操作。完成后,片段的几何信息(在屏幕坐标系中的坐标以及深度值)和颜色信息通过SX (vertex shader也会输出到SX中)发送到DB和CB中进行最后的处理。

  顶点数据经过顶点处理流程后,进入光栅化阶段,由Scan Converter对各属性数据进行差值,形成片段数据,片段数据流经片段处理阶段着色,形成可选的像素(或者称为片段 fragment)。

  由于R600是统一处理器架构,顶点处理和片段处理都在同样的硬件上进行,因此片段处理的过程和顶点处理的过程是类似的。R600片段处理阶段(包括光栅化阶段)按照如下流程进行:

  • “图元组装器”(PA)从SX的position buffer中读出顶点的坐标信息,从VGT中读取出顶点连接信息,有了这两方面的信息后,就可以组装出图元;
  • 组装出来的图元被发送到SC进行初步的扫描转换;(初步的扫描转换做了些什么工作,将大图元分成小的块tile)
  • 初步扫描转换出来的块(tiles,有合适的翻译??)被送到SPI中进行最后的插值
    • SPI分配GPR和线程空间(thread space)(根据驱动指定的大小);
    • SC和SPI从SX的parameter cache中读取顶点的属性数据;
    • SPI针对顶点属性计算出插值出来的每个像素的属性
    • 将插值后的属性加载到GPR
  • Shader core被告知一个pixel wavefront到来,准备执行pixel shader
  • Shader core对wavefront里面的每一个片段运行pixel shader,pixel shader的结束部分包含将片段属性(颜色)输出到SX 的指令
  • SPI被告知wavefront里面的所有片段处理完成,SPI释放GPR和线程空间

  Pixel shader程序将计算的结果输出到SX后将会被送往指定的Render Target,可以一次最多配置8个Render Target。

最后的渲染

  Pixel shader的输出被放到DB和CB中进行最后的处理(对应图1、图2和图3中的raseter operation 和merging 过程),这部分处理包括alpha 测试、深度测试和最后的融合(blending)。

【原创】Linux环境下的图形系统和AMD R600显卡编程(9)——R600显卡的3D引擎和图形流水线的更多相关文章

  1. 【原创】Linux环境下的图形系统和AMD R600显卡编程(1)——Linux环境下的图形系统简介

    Linux/Unix环境下最早的图形系统是Xorg图形系统,Xorg图形系统通过扩展的方式以适应显卡和桌面图形发展的需要,然而随着软硬件的发展,特别是嵌入式系统的发展,Xorg显得庞大而落后.开源社区 ...

  2. Linux环境下的图形系统和AMD R600显卡编程(1)——Linux环境下的图形系统简介

    转:https://www.cnblogs.com/shoemaker/p/linux_graphics01.html Linux/Unix环境下最早的图形系统是Xorg图形系统,Xorg图形系统通过 ...

  3. 【原创】Linux环境下的图形系统和AMD R600显卡编程(2)——Framebuffer、DRM、EXA和Mesa简介【转】

    转自:http://www.cnblogs.com/shoemaker/p/linux_graphics02.html 1. Framebuffer Framebuffer驱动提供基本的显示,fram ...

  4. 【原创】Linux环境下的图形系统和AMD R600显卡编程(5)——AMD显卡显命令处理机制

    通常通过读写设备寄存器对设备进行编程,在X86系统上,有专门的IO指令进行编程,在其他诸如MIPS.SPARC这类系统上,通过将设备的寄存器映射到内存地址空间直接使用读写内存的方式对设备进行编程. R ...

  5. 【原创】Linux环境下的图形系统和AMD R600显卡编程(3)——AMD显卡简介

    早期的显卡仅用于显示,后来显卡中加入了2D加速部件,这些部件用于做拷屏,画点,画线等操作.随着游戏.三维模拟以及科学计算可视化等需要,对3D的需求逐渐增加,早期图形绘制工作由CPU来完成,要达到真实感 ...

  6. 【原创】Linux环境下的图形系统和AMD R600显卡编程(10)——R600显卡的3D引擎编程

    3D图形处理流水线需要流经多个硬件单元才能得到最后的渲染结果,流水线上的所有的硬件单元必须被正确编程,才能得到正确的结果. 总体上看,从图形处理流水线的源头开始,需要准备好vertex和index,在 ...

  7. Linux环境下的图形系统和AMD R600显卡编程(2)——Framebuffer、DRM、EXA和Mesa简介

    转:https://www.cnblogs.com/shoemaker/p/linux_graphics02.html 1. Framebuffer Framebuffer驱动提供基本的显示,fram ...

  8. 【原创】Linux环境下的图形系统和AMD R600显卡编程(6)——AMD显卡GPU命令格式

    前面一篇blog里面描述了命令环缓冲区机制,在命令环机制下,驱动写入PM4(不知道为何会取这样一个名字)包格式的命令对显卡进行配置.这一篇blog将详细介绍命令包的格式. 当前定义了4中命令包,分别是 ...

  9. 【原创】Linux环境下的图形系统和AMD R600显卡编程(7)——AMD显卡的软件中断

    CPU上处理的中断可以分成“硬件中断”和“软件中断”两类,比如网卡产生的中断称为硬件中断,而如果是软件使用诸如"int 0x10"(X86平台上)这样的指令产生中断称为软件中断,硬 ...

随机推荐

  1. git重新下载项目

    file-new-project from version control - git 修改网址为需要的网址

  2. 17-比赛1 D - IPC Trainers (贪心 + 优先队列)

    题目描述 本次印度编程训练营(Indian Programming Camp,IPC)共请到了 N 名教练.训练营的日程安排有 M 天,每天最多上一节课.第 i 名教练在第 Di 天到达,直到训练营结 ...

  3. JS实现禁用滑动条但滑动条不消失的效果

    //方法 //滑动条 // left: 37, up: 38, right: 39, down: 40, // spacebar: 32, pageup: 33, pagedown: 34, end: ...

  4. 18 Django-组件拾遗

    一 Django的form组件 forms组件 二 Django的model form组件 这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,先来一个简单的 ...

  5. android stadio open recent 在同一窗口打开

    Android staido 有一个功能是open recent ,默认是下面这样的: 就出来一个框,给你选择,是在新的窗口打开,还是在当前窗口打开.如果你选了当前窗口,并且点了Remember,do ...

  6. CodeIgniter学习笔记五:分页,文件上传,session,验证码

    一.分页 示例代码: //装载类文件 $this -> load -> library('pagination'); $controller = $this->router-> ...

  7. [译]8-spring bean的作用域

    在spring中使用<bean/>标签定义bean的时候,可以使用scope属性来定义bean的作用域.如果想要每次 从spring容器得到一个新创建的bean实例,可以指定scope=& ...

  8. 孤荷凌寒自学python第二十八天python的datetime.date模块

     孤荷凌寒自学python第二十八天python的datetime.date模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.toordinal() 此方法将访问从公元1年1月1日至当 ...

  9. Spring Cloud Config 搭建Config 服务

    配置中心: open API 配置生效监控 一致性的K-V存储 统一配置的实时推送 配置全局恢复.备份.历史版本 高可用集群 通过config 获取配置,流程: 下面介绍,基于spring cloud ...

  10. 转载:PHP 协程实现

    转自:https://newt0n.github.io/2017/02/10/PHP-%E5%8D%8F%E7%A8%8B%E5%8E%9F%E7%90%86/ 实现 PHP 协程需要了解的基本内容. ...