PowerVR 渲染管线核心:TA(Tile Accelerator)与 3D(Tile Renderer)

2025-11-28 1 0

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 写入机制涉及多个关键点(非常重要)

  1. 从 FreeList 分配 PB 页面 每次 tile list 或 ISP chunk 写满一页,就向 FreeList 要新页。

  2. 通过 MMU 写 PB TA 使用 GPU 侧 VA 写 PB,TBU 会进行 VA→PA 映射。

  3. 若 SMMU/SID 异常 → 会发生 MMU_Fault, PCIE DPC, TA OOM, Tiling fault

  4. 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 的职责(是真正做渲染的硬件)

  1. 读取 PB 数据

包括:

  • ISP control 数据(渲染状态)

  • 每个 tile 的 triangle list

  • Uniform/Program 数据

  • Varying 配置

  1. 逐 tile 渲染

PowerVR 的核心优势:

3D 只在一个 tile 内做 shading,不需要全屏缓存。

流程:

Load tile → Render → Store tile → Next tile
  1. 实际渲染发生在 ISP + USC(Shader Core):
  • ISP:Early Z,Stencil,Visibility test

  • USC:执行 Fragment Shader 的主计算

  1. 执行所有像素 shading

包括:

  • Texture sampling

  • Lighting

  • BRDF

  • Shader program

  • Blending

  1. 将 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)

相关文章

发布评论