본문으로 건너뛰기
PS5PCEM
부분그래픽

AGC와 PM4 명령 스트림

PS5 타이틀은 자기 메모리에 GPU 패킷을 만들어 버퍼를 제출합니다. PS5PCEM은 이 PM4 스트림을 디코딩하고, 레지스터 상태를 유지하며, 드로와 디스패치를 순서대로 실행합니다.

2026년 10월 10일까지의 저장소 노트

스트림이 곧 그래픽 API입니다

타이틀이 삼각형마다 고수준 드로 함수를 호출해야 하는 것은 아닙니다. 타이틀은 패킷을 씁니다. 레지스터 업데이트, 드로, 디스패치, 펜스, 플립입니다. 어느 계층이 버퍼를 만들었든 GPU는 같은 스트림을 봅니다. 디코더는 오피코드의 의미가 문서화된 패킷에만 이름을 붙이고 나머지는 숫자로 둡니다. 추적에 지어낸 이름이 들어가는 것은 오피코드 숫자보다 나쁩니다.

패킷 본문 길이는 1만큼 치우친 값으로 저장되므로 빈 본문은 인코딩할 수 없습니다. 모든 단계에서 범위를 검사합니다. 들어맞지 않는 본문은 보고합니다. 잘라 내지 않는 이유는, 잘린 본문이 뒤따르는 모든 패킷을 어긋나게 해 추적이 거짓말을 하게 되기 때문입니다.

상태, 대기, 간접 버퍼

레지스터 상태는 0 쓰기를 포함해 제출 사이에서도 유지됩니다. 실행기는 직접 레지스터 목록, 네이티브와 레거시 간접 목록, acquire와 release, 32비트와 64비트 대기, 쓰기, 이벤트, SetFlip을 적용합니다. 충족되지 않은 대기는 차단 상태와 재개할 정확한 워드를 반환합니다. 진행을 꾸며 내려고 게스트 메모리를 수정하지 않습니다.

간접 버퍼는 일반 4-dword 형식과 조건부 14-dword 형식 모두 재귀적으로 따라갑니다. 체인 패킷은 부모를 끝냅니다. 중첩은 16프레임에서 멈춥니다. 차단된 자식은 루트에서 리프까지의 고정된 경로를 반환하므로, 재개할 때 이미 실행된 드로를 다시 실행하지 않습니다. 스케줄러는 각 루트 명령 버퍼와 거기서 닿는 간접 버퍼를 복사하므로, 대기가 아직 차단된 동안 타이틀이 아레나를 재활용해도 됩니다.

레지스터에서 드로까지

드로나 디스패치 시점에 레지스터 스냅샷은 타입이 있는 리소스가 됩니다. 128비트 버퍼·샘플러 디스크립터, 256비트 이미지 디스크립터, 컬러 타깃 8개, 깊이와 스텐실, 뷰포트, 시저, 컬링, 블렌드, 그리고 PS5 스위즐과 MSAA 필드입니다. 쓰이지 않은 color-control과 clip-control은 AGC 기본값을 물려받습니다. 명시적인 비활성화는 비활성화로 남습니다. CPU 워커 두 개가 그래픽과 컴퓨트 명령을 준비합니다. Vulkan 소유자 하나가 이를 제출하므로 실행과 완료의 순서가 유지됩니다.

셰이더 메타데이터는 리소스 테이블과 사용자 데이터 레지스터를 제공합니다. 스칼라 출처 추적은 셰이더의 한정된 앞부분을 훑고, 그 앞부분이 실제로 건드리는 게스트 메모리만 불러오며, 알 수 없는 분기에서는 디스크립터를 지어내지 않고 멈춥니다. 그 결과를 변환기와 Vulkan 백엔드가 사용합니다.

구현된 것

  • 치우친 본문 길이와 모든 패킷에 대한 엄격한 범위 검사를 갖춘 PM4 디코딩.
  • 지속되는 레지스터 뱅크, 차단 대기, 16프레임까지의 재귀 간접 버퍼.
  • 드로 시점의 타입 있는 버퍼, 이미지, 컬러 타깃, 깊이, 뷰포트, 블렌드, MSAA 상태.
  • 준비 워커 두 개와 순서를 지키는 Vulkan 제출 소유자 하나.

아직 빠진 것

  • 의미가 문서화되지 않은 오피코드는 이름 없이 남습니다.
  • 차단된 대기를 가짜 펜스 값을 써서 풀지 않습니다.
  • 레이어, 메타데이터, 일부 이미지 연산은 아직 불완전합니다. 각각 별도 페이지가 있습니다.

관련 메커니즘

이 페이지들에 대하여

본문은 PS5PCEM 저장소의 아키텍처 노트와 2026년 10월 보고서를 따릅니다. 특정 테스트를 통과했다고 해서 새로운 프레임 속도나 새로운 완주를 뜻하지는 않습니다.

모든 기술