跳到正文
PS5PCEM
部分可用图形

AGC 与 PM4 命令流

PS5 游戏在自己的内存里构建 GPU 包并提交这块缓冲区。PS5PCEM 解码这条 PM4 流,保持寄存器状态,并按顺序执行绘制和分派。

仓库笔记截至 2026年10月10日

这条流就是图形 API

游戏不必为每个三角形调用一次高层绘制函数。它写入的是包:寄存器更新、绘制、分派、栅栏和翻页。无论哪一层产生了这块缓冲区,GPU 看到的都是同一条流。解码器为操作码已有文档含义的包命名,其余的留作数字。在跟踪里发明一个名字,比留下操作码更糟。

包体长度按加一的偏置存放,因此空包体无法编码。每一步都检查自己的边界。放不下的包体会被报告。它不会被截断,因为截断的包体会挪动后面的每一个包,跟踪就会说谎。

状态、等待与间接缓冲区

寄存器状态跨提交保留,包括写零。执行器应用直接寄存器列表、原生和旧式间接列表、acquire 与 release、32 位和 64 位等待、写入、事件以及 SetFlip。未满足的等待返回阻塞,以及恢复时要使用的精确字。客户机内存不会被修改来制造进度。

间接缓冲区会被递归跟随,包括普通的 4 dword 形式和有条件的 14 dword 形式。链式包结束父级。嵌套止于十六层。被阻塞的子级返回一条从根到叶的固定路径,因此恢复时不会重放已经发生的绘制。调度器复制每个根命令缓冲区以及它能够到达的间接缓冲区,这样在等待仍被阻塞时,游戏可以回收这块区域。

从寄存器到一次绘制

在绘制或分派时,寄存器快照变成带类型的资源:128 位缓冲区和采样器描述符、256 位图像描述符、八个颜色目标、深度和模板、视口、剪裁、剔除、混合,以及 PS5 交织模式和 MSAA 字段。缺失的 color-control 与 clip-control 写入沿用 AGC 默认值。显式禁用仍然是禁用。两个 CPU 工作线程准备图形和计算命令。一个 Vulkan 所有者提交它们,使执行和完成保持有序。

着色器元数据提供资源表和用户数据寄存器。标量来源沿着色器的一个有界前缀行走,只加载这个前缀实际触及的客户机内存,并在未知分支上停下,而不是发明一个描述符。其结果供翻译器和 Vulkan 后端使用。

已经实现的部分

  • PM4 解码,包体长度带偏置,每个包都有硬边界。
  • 持久的寄存器组、阻塞的等待,以及最多十六层的递归间接缓冲区。
  • 绘制时的带类型缓冲区、图像、颜色目标、深度、视口、混合和 MSAA 状态。
  • 两个准备用的工作线程,以及一个有序的 Vulkan 提交所有者。

尚未实现的部分

  • 没有文档含义的操作码保持无名。
  • 阻塞的等待从不会靠写入假栅栏值来清除。
  • 层、元数据和若干图像操作仍然不完整。它们有自己的页面。

相关机制

这些页面说明什么

文字依据 PS5PCEM 仓库中的架构说明和 2026 年 10 月的报告。单项测试通过并不等于新的帧率,也不等于新的通关。

全部技术