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)大小,避免分支发散导致性能下降。
Adreno 650 SP 内部结构 Shader Processor 0 ALU 阵列 192 ALU 寄存器文件 64KB 指令调度器(Wave32) LDS 16KB 原子单元 Global/Shared Shader Processor 1 (结构与 SP0 对称) SP 间通过跨核心总线共享数据,驱动需管理线程组在 SP 间的分布

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)或合并纹理访问。
纹理单元(TP)数据流 SP 纹理请求 纹理处理器 坐标计算 + 过滤 纹理缓存(16KB) 系统内存(GMEM) 采样结果返回 SP 驱动需确保纹理描述符(TEX_DESCRIPTOR)在采样前已加载到 TP 控制寄存器

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 状态更新这些寄存器。
ROP 渲染输出流水线 像素片段 深度/模板测试 24/8 位 颜色混合 Add/Sub/Min/Max MSAA 解析 2x/4x GMEM Tile 写入(32x32 / 64x64) 系统内存帧缓冲区(Resolve 后) 驱动需在 Tile 渲染完成后触发 Resolve 命令,将 GMEM 内容写回系统内存

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 包并配合时间戳检查,以定位问题命令。
命令处理器(CP)调度流程 驱动提交 PM4 包 CP 解析引擎 操作码解码 命令分发器 SP 着色器 TP 纹理 ROP 输出 ME 微引擎 同步机制:时间戳(Timestamp) + 栅栏(Fence) + 等待内存写入 驱动通过 CP_WAIT_MEM_WRITES 确保所有写操作完成

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 驱动的基础。