深入了解汽车系统级芯片SoC连载之八 gpu是什么的硬件芯片( 三 )


顶点渲染单元(也叫顶点着色或顶点着色引擎)主要负责绘制图形,也就是建立模型 。一个是像素渲染管道(也叫像素渲染管道),主要负责用颜色填充顶点绘制的图形 。然后添加纹理贴图单元,粘贴纹理,一个漂亮的图形就出来了 。微软DIRECTX10出来后,顶点渲染和像素渲染会淡出我们的视线,因为它会采用统一的架构 。也就是说,内核中的一组特殊通道负责顶点渲染和像素渲染 。但道理还是一样的 。
这就引出了GPU的两个关键参数:像素填充率和纹理填充率 。当然越高越好,这样显示图像的帧率更高,更精细,分辨率更高 。
像素填充率=显卡的显示核心频率乘以像素渲染流水线的数量(即光栅单位) 。单位是gbpixel/s
纹理填充率=核心频率乘以像素渲染流水线数再乘以纹理映射单元数 。单位是gbtexture/s 。
[/hGPU的GPU开销是绘制调用驱动开销 。
很长一段时间,人们都认为ARM也就是MALI的GPU不如高通的Adreno 。其实MALI只是在像素填充率和纹理填充率上更强,但是ARM的缺点是Draw调用的驱动成本太高 。调用一次图像编程接口(graphics API)命令GPU进行渲染的过程称为Draw调用 。图像编程接口(graphics API)是GPU硬件的抽象,地位类似于C语言,属于GPU编程的中低层 。几乎所有的GPU都可以同时配合OpenGL和DirectX 。OpenGL是纯图形API;DirectX是各种API的集合,其中DirectX包括图形API——Direct3D和Direct2D 。DirectX支持Windows和Xbox;OpenGL支持Windows、MacOS、Linux等平台,Android和iOS上允许使用OpenGL的简化版OpenGL ES 。OpenGL相对好用,门槛低;DirectX入门难,门槛高 。OpenGL渲染效率比较低,功能少;DirectX相对高效,有很多特性 。例如,DirectX12提供了底层API,允许用户通过绕过显卡驱动程序在一定程度上操纵底层硬件 。
对于图像生成的应用,第一步,CPU将一个网格的顶点数据从硬盘加载到内存中(这一步的原因是大规模3D渲染时内存可能不足) 。
第二步,CPU为这个网格设置渲染状态(每个网格不等于每个模型/图片,因为有批处理) 。所谓渲染状态,包括编译成二进制文件的纹理贴图、材质属性和着色器 。与渲染状态一起,与照明和相机相关的信息也传输到GPU 。图形API可以在更深层次上定义渲染状态所需的数据 。
第三步,CPU将网格顶点数据和渲染状态打包,按照指定的格式将数据包发送给DMA,DMA将数据包传输给显卡 。DMA(直接内存访问) 。
指令到达GPU驱动后,驱动会先检查指令的合法性 。如果指令不合法,驱动程序将通过DMA向CPU发送错误消息 。如果指令合法,驱动程序通过DMA确认收到Draw调用,然后将指令放入GPU缓冲区 。
一段时间后,当显卡有空空闲流水线,或者CPU明确发出flush命令时,驱动程序将缓冲区中的指令发送给GPU,GPU通过主机接口接收命令,开始处理命令 。
GPU将所有顶点存储在顶点缓冲区中,GPU中的“图元分布器”开始通过顶点生成三角形,并分批次发送给一个或多个GPU 。如果显卡里没有GPC,直接分发给短信 。SM得到数据后,光束管理器安排多边形引擎提取三角形数据并存储在SM的L1缓存中,然后启动顶点着色器阶段 。
GPU会依次处理缓存中的每个网格,网格的处理顺序和CPU的提交顺序有关 。因此,CPU总是最后提交透明对象 。在一个帧中的所有绘制调用被处理后,显示器将在屏幕上打印图像 。
draw call的性能瓶颈是CPU,不是GPU 。每次CPU进行Draw调用时,都会调用DMA将数据输入到内存中 。每次调用时,显存映射寻址、DMA控制块注入、等待DMA响应等系统消耗会浪费时间段,多次Draw调用会消耗很多次 。同时,DMA擅长一次传输大量数据,不擅长多次传输少量数据 。这使得有必要减少Draw调用以优化显示性能 。

推荐阅读