PowerVR 是 Tile Based Deferred Rendering (TBDR) 架构,所有渲染都被拆成两个阶段:
CPU → FW → TA → Parameter Buffer → 3D → framebuffer
TA 负责准备数据 3D 负责执行 shading / 输出像素
🟥 第一部分:TA(Tile Accelerator)——前端流水线
⭐ TA 是 PowerVR 的“前端 GPU”
它类似于:
- Tiling engine
- Primitive setup
- Geometry binning
- 参数序列化器(写入 Parameter Buffer)
✔ TA 不渲染像素
它不执行 shading,不输出颜色。
✔ TA 的职责是准备 3D 所需的数据: 🔶 1. Primitive Assembly
-
接收 USC(Vertex Shader)处理后的顶点
-
做 primitive setup(按三角形、patch、line 等)
-
计算 Screen-space bounding box
🔶 2. Tiling / Binning
将三角形划分到屏幕 tile 中:
tile_x = floor(vertex.x / tile_width)
tile_y = floor(vertex.y / tile_height)
每个 tile 都会建立一个 “triangle list”。
🔶 3. ISP 参数准备
TA 会生成 ISP(Image Synthesis Processor)所需的参数:
-
Z-buffer control
-
Stencil control
-
Alpha test
-
Blend mode
-
MSAA resolve 参数
-
Depth slope
-
Polygon offset
这些信息会写到 PB(Parameter Buffer)。
🔶 4. 生成 Tile Lists
每个 tile 都得到:
tile → list of triangles
tile → render states
所有这些结构化数据均写入 PB 页面链表。
🔥 TA 的 PB 写入机制涉及多个关键点(非常重要)
-
从 FreeList 分配 PB 页面 每次 tile list 或 ISP chunk 写满一页,就向 FreeList 要新页。
-
通过 MMU 写 PB TA 使用 GPU 侧 VA 写 PB,TBU 会进行 VA→PA 映射。
-
若 SMMU/SID 异常 → 会发生 MMU_Fault, PCIE DPC, TA OOM, Tiling fault
-
TA 完成后通知 FW,生成 TA_DONE event
TA 的输入和输出 输入:
-
CCB 中的 FW 命令(transform, drawcall)
-
Vertex shader 输出的顶点
-
Buffer/Texture 地址
输出:
-
Parameter Buffer(核心)
-
TA control stream(内部)
-
Tile lists for 3D
TA(Tile Accelerator)硬件模块图
graph TD
TA[Tile Accelerator] --> VCD[Vertex Control & Dispatch]
VCD --> VSOut[USC Vertex Shader Output Buffer]
VSOut --> PrimSetup["Primitive Setup<br/>Triangle/Line Assembly"]
PrimSetup --> BBox[Screen-space BBox Calc]
BBox --> Tiler["Tiler / Binning Engine"]
Tiler --> TileLists[Tile List Builder]
TileLists --> ISPParam[ISP Parameter Generator]
ISPParam --> PBWrite[PB Write Engine]
PBWrite --> FLReq[FreeList Alloc Page]
FLReq --> PBWrite
PBWrite --> MMUMAP["MMU/TBU VA→PA Translation"]
MMUMAP --> MemWrite[Write PB to Physical Memory]
MemWrite --> TA_DONE[TA Complete Interrupt]
🟦 第二部分:3D Pipeline(Tile Renderer)——后端流水线
当 TA 结束后:
FW: “Okay, 3D can start shading”
然后进入硬件的后端阶段。
⭐ 3D 的职责(是真正做渲染的硬件)
- 读取 PB 数据
包括:
-
ISP control 数据(渲染状态)
-
每个 tile 的 triangle list
-
Uniform/Program 数据
-
Varying 配置
- 逐 tile 渲染
PowerVR 的核心优势:
3D 只在一个 tile 内做 shading,不需要全屏缓存。
流程:
Load tile → Render → Store tile → Next tile
- 实际渲染发生在 ISP + USC(Shader Core):
-
ISP:Early Z,Stencil,Visibility test
-
USC:执行 Fragment Shader 的主计算
- 执行所有像素 shading
包括:
-
Texture sampling
-
Lighting
-
BRDF
-
Shader program
-
Blending
- 将 tile 输出到 framebuffer
3D 完整过程是:
Load tile from FB/TMU → Shade → Write tile out
📦 3D 对 Parameter Buffer 的使用
3D 是 PB 的消费者:
-
PB 的 tile list 告诉 3D 每个 tile 有哪些三角形
-
PB 的 ISP 参数告诉 3D 如何裁剪、如何深度测试
-
PB 的 state chunk 描述了 shader 和 uniform
如果 PB 分配或写入异常:
-
3D 无法找到 tile list → 直接 GPU hang
-
ISP 参数不正确 → Tile shading 错误
-
PB page 映射错误 → “3D page fault” → PCIe DPC
3D Pipeline(Tile Renderer)硬件模块图
graph TD
TR[Tile Renderer] --> PBRead[PB Read Engine]
PBRead --> MMU2["MMU/TBU VA→PA Translation"]
SMMU2 --> TLRead[Tile List Reader]
TLRead --> ISP[ISP Visibility / Depth Test]
ISP --> Hidden[Hidden Surface Removal]
Hidden --> USCFetch[USC Fragment Shader Fetch]
USCFetch --> USCExec[USC Fragment Shader Exec]
USCExec --> TMU[Texture Unit / Samplers]
TMU --> Blend[Blender / Color Combiner]
Blend --> TileStore[Tile Store Unit]
TileStore --> MemWrite2[Write Tile to FB Memory]
MemWrite2 --> DONE[3D Complete Interrupt]
🟩 TA 与 3D 的关系总结
| 阶段 | 角色 | 输入 | 输出 | 是否使用 PB |
|---|---|---|---|---|
| TA | 前端 | drawcall、顶点、状态 | PB(tile lists)、ISP参数 | 写 PB(producer) |
| 3D | 后端 | PB | Framebuffer(tile shading) | 读 PB(consumer) |
TA 写,3D 读 PB = TA 和 3D 的桥梁
📘 提供 TA → PB → 3D 的完整时序图(旧版 Mermaid 兼容)
sequenceDiagram
participant CPU
participant FW as Firmware
participant TA
participant PB as ParameterBuffer
participant FL as FreeList
participant D3 as 3D Renderer
CPU->>FW: Submit CCB Kick (drawcall)
FW->>TA: Schedule TA task
TA->>PB: Write tile/ISP/state chunks
TA->>FL: Request PB page (alloc)
FL-->>TA: Return PB page
TA->>PB: Continue writing
TA-->>FW: TA_DONE
FW->>D3: Schedule 3D
D3->>PB: Read PB (tile list, parameters)
D3->>D3: Tile shading (ISP + USC)
D3-->>FW: 3D_DONE
🧨 常见调试问题与原因总结
| 现象 | 根因 |
|---|---|
| TA OOM | FreeList 空(正常)或 MMU page fault(更常见) |
| 3D hang | PB 指针损坏、PB page 映射失败 |
| PCIe DPC | GPU 发起非法 DMA(PB 或 RT/ZS 地址错误) |
| DMA失败 | SID 配置/页表不一致,影响 TA/3D DMA |
| ISP parameter exception | PB chunk 格式错误(通常 freeList/pageMapping issue) |
JINHU