4. Adreno 650 硬件架构:计算单元(SP)、纹理单元(TP)、渲染输出单元(ROP)、命令处理器(CP)
Adreno 650 是高通骁龙 865/SA8155 平台集成的 GPU 核心,其硬件架构采用分块渲染(Tile-Based Rendering, TBR)与立即模式混合的设计哲学。理解其内部四大核心模块——计算单元(SP)、纹理单元(TP)、渲染输出单元(ROP)和命令处理器(CP)——是驱动开发中实现图形 API 高效映射的基础。
驱动开发视角: 在编写 GPU 驱动时,SP 对应着色器指令发射,TP 对应纹理采样指令,ROP 对应深度/模板/颜色混合操作,CP 则负责解析命令缓冲区(Command Buffer)并调度整个渲染流程。任何 API 调用最终都会分解为这四类硬件的微操作。
4.1 计算单元(Shader Processor, SP)
SP 是 Adreno 650 中执行可编程着色器(Vertex/Fragment/Compute Shader)的核心阵列。每个 SP 内部包含多个 ALU(算术逻辑单元)和寄存器文件,支持 SIMD(单指令多数据)执行模型。
- 架构规模: Adreno 650 通常配置 2 个 SP,每个 SP 包含 384 个 ALU(总计 768 ALU),支持 Wave32(32 线程为一组)执行模式。
- 执行模型: 采用统一着色器架构,顶点、像素和计算着色器共享 SP 资源,通过指令调度器动态分配。
- 关键特性: 支持分支预测、线程组共享内存(LDS)、原子操作,以及 Vulkan 1.1 要求的 subgroup 操作。
驱动映射要点: 驱动需要将 SP 的寄存器文件映射为 API 中的 uniform 缓冲区、着色器局部变量和临时寄存器。Wave32 模式要求驱动在编译着色器时考虑线程束(Warp)大小,避免分支发散导致性能下降。
4.2 纹理单元(Texture Processor, TP)
TP 负责处理所有纹理采样、过滤和寻址操作。它从 SP 接收纹理坐标,从内存读取纹素数据,经过硬件过滤后返回采样结果。
| 特性 | 规格 | 驱动影响 |
|---|---|---|
| 纹理单元数量 | 4 个 TP(每个 SP 关联 2 个) | 驱动需合理分配纹理描述符到各 TP |
| 最大纹理尺寸 | 16K x 16K | 驱动需处理大纹理的分块加载(Mipmap) |
| 过滤模式 | 双线性、三线性、各向异性(最高 16x) | 驱动需将 API 过滤枚举映射为 TP 控制寄存器 |
| 压缩格式 | ASTC、ETC2、BC1-BC7 | 驱动需在纹理上传时进行硬件压缩协商 |
| 采样器状态 | 独立于纹理描述符 | 驱动需维护采样器对象与纹理对象的绑定表 |
性能陷阱: TP 的纹理缓存(Texture Cache)大小为 16KB 每 TP。驱动开发时,若纹理访问模式不连续(如随机采样),会导致缓存抖动,性能骤降。建议在着色器中使用纹理数组(Texture Array)或合并纹理访问。
4.3 渲染输出单元(Render Output Unit, ROP)
ROP 负责像素的最终输出操作,包括深度测试、模板测试、颜色混合、多重采样解析(MSAA resolve)以及将结果写回帧缓冲区。在 Adreno 650 中,ROP 与 GMEM(图形内存)紧密耦合。
- 深度/模板测试: 支持 24 位深度和 8 位模板,硬件比较器可配置为 Less/Greater/Equal 等模式。
- 颜色混合: 支持标准混合方程(Add/Subtract/Min/Max)以及独立 Alpha 混合。
- 多重采样: 支持 2x/4x MSAA,ROP 在 GMEM 中完成解析(Resolve)操作。
- 分块渲染: ROP 将帧缓冲区划分为 32x32 或 64x64 像素的 Tile,在 GMEM 中完成渲染后一次性写回系统内存。
驱动关键寄存器: ROP 控制寄存器包括
GRAS_DEPTH_CNTL(深度测试配置)、RB_BLEND_CNTL(混合控制)、RB_STENCIL_CNTL(模板控制)。驱动需在每次 Draw Call 前根据 API 状态更新这些寄存器。
4.4 命令处理器(Command Processor, CP)
CP 是 Adreno 650 的硬件调度核心,负责从驱动提交的命令缓冲区(Command Buffer)中解析并分发渲染命令到 SP、TP、ROP 等单元。CP 本质上是一个可编程的 DMA 引擎,支持条件执行、循环和间接绘制。
| CP 特性 | 描述 | 驱动接口 |
|---|---|---|
| 命令缓冲区格式 | PM4 包(Packet)格式,包含类型、长度和数据 | 驱动通过 kgsl_context_queue_command 提交 PM4 包 |
| 上下文切换 | 支持硬件上下文(Context),保存/恢复寄存器状态 | 驱动使用 KGSL_CONTEXT_SAVE/RESTORE 命令 |
| 同步机制 | 时间戳(Timestamp)和栅栏(Fence) | 驱动通过 CP 的 WAIT_FOR_IDLE 和 WAIT_MEM_WRITES 实现同步 |
| 间接绘制 | 支持从 GPU 内存读取绘制参数 | 驱动映射 Vulkan 的 vkCmdDrawIndirect |
| 条件渲染 | 根据 GPU 内存中的条件值决定是否执行命令 | 驱动映射 OpenGL 的 GL_CONDITIONAL_RENDER |
驱动调试要点: CP 解析 PM4 包时,若遇到非法操作码或长度不匹配,会导致 GPU 挂起(Hang)。驱动开发时,建议在关键命令序列后插入
CP_NOP 包并配合时间戳检查,以定位问题命令。
4.5 四大单元协同工作流
在典型的渲染帧中,CP 首先解析驱动提交的命令缓冲区,将顶点着色器任务分发给 SP;SP 处理完成后,TP 根据纹理坐标采样;光栅化后的像素片段再次由 SP 执行片段着色器;最后 ROP 完成深度/模板测试和颜色混合,将结果写入 GMEM。CP 在帧结束时触发 Resolve,将 GMEM 内容写回系统内存。
驱动开发总结: 四大单元的寄存器映射和状态管理是驱动核心工作。SP 对应
PC(Primitive Controller)和 VPC(Vertex Parameter Cache)寄存器组;TP 对应 SQ(Sequence Unit)纹理状态;ROP 对应 RB(Render Backend)寄存器;CP 对应 CP 前缀的 PM4 包。理解这些硬件单元的边界和交互,是编写高效、稳定 GPU 驱动的基础。