ysh329 / OpenCL-101

Learn OpenCL step by step.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

【渲染】Arm Mali: Tile-Based Rendering

ysh329 opened this issue · comments

基于分块的渲染

本文介绍了基于分块(tiled-based)渲染的GPU优缺点,并拿桌面级的即时渲染模式的GPU在优缺点上进行了比较,以及未来挑战。

Mali-gpu使用基于分片的渲染架构。这意味着GPU渲染过程会将帧缓冲区(framebuffers)输出为几个不同的较小子区域,这些较小子区域称为分块(tile)。完成后将每个分块写入内存,Mali gpu的分块很小,每个分块仅为16x16像素。

即时模式(Immediate Mode)GPUs

传统的桌面级GPU架构通常被称为即时模式架构。该模式将渲染作为一个严格的命令流进行处理,在每次draw调用中对每个基本体(primitive)依次执行顶点(Vertex)和片段(Fragment)着色器。

下面是对该过程的伪代码示例,忽略并行处理和流水线:

for draw in renderPass:
    for primitive in draw:
        for vertex in primitive:
            execute_vertex_shader(vertex)
        if primitive not culled:
            for fragment in primitive:
                execute_fragment_shader(fragment)

根据伪代码可以看出即时渲染过程是从renderPass发起,每个readerPass发起一个Draw绘图调用去绘制每个图元(Primitive),图元在OpenGL中可以是线、三角形等等,具体如下表。对每个图元使用顶点shader绘制顶点,每绘制完一个图元的所有顶点信息后,则绘制该图元的片段信息。从顶点到图元的绘制过程是一个pipeline

image

下图展示了即时模式在硬件层面的数据流和内存交互,更能体现出从顶点到图元的绘制过程是一个pipeline**:

image

下面我们结合上图,分析一下即时模式渲染的优缺点:

优点

顶点着色器和其他与几何体相关的着色器的输出可以保留在GPU内部的芯片上。直到FIFO管道中的下一阶段要用的数据准备好前,这些着色器的输出可以一直存储在FIFO缓冲区中。这意味着GPU使用较少的外部内存带宽来存储和检索中间的几何结果;

缺点

每个绘图(draw)调用中的三角位置都不同,导致片段(Fragment)shader在屏幕上变换位置来执行shader工作。发生这种情况是因为流(stream)中的三角可能覆盖屏幕的任何部分,而三角按绘图调用的顺序处理。

这意味着活动工作集的大小为整个缓冲区的大小。例如,考虑一个1,440p解像度的设备,其颜色使用每象素32位(BPP),包装深度/模具使用32位(BPP)。这就产生了一个30MB的总工作集,这个工作集太大而无法保留在芯片上,因此必须在DRAM中存储在芯片外。

对于每个混合、深度测试和模具测试操作,GPU必须从该工作集获取当前碎片的象素坐标数据的当前值。

一般而言,所有阴影部分都访问此工作集。因此,在高精度下,由于对每个碎片执行多个读-修改-写操作,因此放置在此内存上的带宽负载可能非常高。然而,缓存可以通过将最近访问的部分框架缓冲区保持在接近GPU的位置来减轻高带宽负载。