PowerVR Rogue 架构 DDK 的 Parameter Buffer

2025-11-27 4 0

✅ 什么是 Parameter Buffer?

Parameter Buffer(PB)是 PowerVR GPU 最核心的数据结构之一,用于存放 GPU 流水线执行所需的“参数数据”。

PowerVR 是 Tile Based Deferred Rendering(TBDR)架构。所有渲染都被分为:

  • TA(Tile Accelerator / Front-end) 用来收集 drawcall 数据、处理顶点、确定每个 tile 有哪些三角形。

  • 3D(Raster/Fragment Back-end) 使用 TA 生成的 tile 数据,执行分块光栅化和着色。

PB 就是 TA 和 3D 间共享的核心数据缓冲区

🔥 PB 不是 CPU 或 GPU Shader 的 Buffer,它是 PowerVR 专用结构

PB 是 PowerVR 特有架构内的数据格式。它完全由 Firmware(FW)组织,CPU 无权直接解释内容。

PB = 固定格式的二进制结构,由 TA 阶段写入,3D 阶段读取。

✅ PB 在渲染管线的角色

简化如下:

CPU → CCB Kick → FW → TA → (写 PB) → 3D → (读 PB)

PB 的核心作用:

✔ 2.1 存储 TA 输出的 Tiling 信息

  • 哪些三角形属于哪个 tile

  • Tile list

  • Binning 结果

✔ 2.2 存储 HW 需要的状态参数

如:

  • Shader program 控制项

  • Buffer/Texture 地址

  • Varying 设置

  • Render target 设置

  • ISP(Image Synthesis Processor)参数

  • 高级特性标志(MSAA、Depth/Stencil 配置)

✔ 2.3 存储每个 drawcall 的 HW 命令

类似于:

  • “渲染对象 X 使用这些状态”

  • “将顶点 VBO 地址告诉 HW”

  • “设置 ISP 控制寄存器”

  • “设置 USC(Unified Shading Cluster)的 shader 程序地址”

🧠 总结一句话:

PB = TA 写入的一块包含“tile 结构 + 状态指令”的 GPU 执行数据,由 3D 读取执行。

✅ Parameter Buffer 的内存布局

PB 被划分为多个 4KB Page(或 16KB) 的页面。

PB 页面来自:

FreeList → PMR(物理页)→ FW → SMMU 映射 → TA 写入

每页包含:

+----------------------+
| PB Header            |
| (, offset, type...)  |
+----------------------+
| State update chunks  |
+----------------------+
| Tile info            |
+----------------------+
| Geometry lists       |
+----------------------+
| Next PB page pointer |
+----------------------+

最后的 pointer 指向下一页(链表结构)。

✔ PB 是 “链表页” 结构

支持任意长度,不需要连续物理内存。

✅ Parameter Buffer 与 FreeList 的关系

PB 不存在静态大小,是 动态扩展 的。

TA pass 中:

  1. 当 TA 写 PB 时需要新的一页:

  2. 向 FW 请求 FreeList 页面;

  3. FreeList 从空闲 pool 中分配物理页;

  4. FW 通过 SMMU 映射(VA→PA);

  5. TA 继续写入。

如果 FreeList 没页了 → PB 分配失败

这会导致:

  • TA kick 失败

  • FW 返回 TA_OOM

  • 3D 无数据运行

  • GPU 可能 hang

  • PB 页表映射错误

  • TA 写到非法地址

  • GPU 报 Mem Access Fault → DPC → PCIe 错误

✅ PB 的生命周期(完整)

  1. CPU 发起 CCB Kick

包含 drawcall + state + uniforms。

  1. FW 解析 Kick → 调度 TA
  2. TA 写入 PB
  • binning tile

  • 写 tile list

  • 写 ISP/USC 参数

  • 写 index list

期间随时可能分配 PB page。

  1. TA 完成后 → FW 调度 3D

3D 读取 PB,按 tile 执行 shading。

  1. 3D 完成,一个 PB page 引用计数 -1

如果所有引用都被释放:

PMR 页回收 → FreeList 中空闲

🧨 PB 调试(工程必备)

如果你看到:

  • pcieport DPC

  • GPU fatal error

  • ISP parameter fetch exception

  • TA OOM

通常问题都是:

❗ PB 地址映射错误(MMU/SID 错)

  • PB 页表错误

  • VA→PA 映射不一致

  • TBU/TLB stale

  • SID 配置不同 TBUs 不一致

❗ FreeList 页不足

  • CCB kick 大量提交

  • TA 数据爆炸(大模型 / 大 mesh)

  • 页回收不及时

❗ FW 参数解析错(定制 firmware 时常见)

📘 简化 PB 流程图

graph TD
    CPU[CPU writes CCB Kick] --> FW[FW parses kick]
    FW --> TA[TA pass starts]
    TA --> PB_Write[TA writes Parameter Buffer]

    PB_Write --> FL_REQ[Need page? Request FreeList]
    FL_REQ -->|OK| PB_Page[Alloc PB Page]
    PB_Page --> TA

    FL_REQ -->|Fail| TA_OOM[TA OOM]
    TA_OOM --> FW_ERR[FW returns error]

    PB_Write --> TA_DONE[TA pass done]
    TA_DONE --> D3[3D pass reads PB]

    D3 --> PB_Consume[PB pages consume & ref--]
    PB_Consume -->|ref=0| FL_Free[Return to FreeList]

相关文章

发布评论