✅ 什么是 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 中:
-
当 TA 写 PB 时需要新的一页:
-
向 FW 请求 FreeList 页面;
-
FreeList 从空闲 pool 中分配物理页;
-
FW 通过 SMMU 映射(VA→PA);
-
TA 继续写入。
如果 FreeList 没页了 → PB 分配失败
这会导致:
-
TA kick 失败
-
FW 返回 TA_OOM
-
3D 无数据运行
-
GPU 可能 hang
-
PB 页表映射错误
-
TA 写到非法地址
-
GPU 报 Mem Access Fault → DPC → PCIe 错误
✅ PB 的生命周期(完整)
- CPU 发起 CCB Kick
包含 drawcall + state + uniforms。
- FW 解析 Kick → 调度 TA
- TA 写入 PB
-
binning tile
-
写 tile list
-
写 ISP/USC 参数
-
写 index list
期间随时可能分配 PB page。
- TA 完成后 → FW 调度 3D
3D 读取 PB,按 tile 执行 shading。
- 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]
JINHU