본문으로 건너뛰기
PS5PCEM

구현

PS5PCEM의 작동 방식

각 페이지는 에뮬레이터가 실제로 실행하는 하나의 메커니즘을 다룹니다. 콘솔이 무엇을 하는지, Zig 코드가 무엇을 하는지, 무엇이 아직 빠져 있는지.

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

펌웨어와 HLE

HLE는 타이틀이 임포트하는 펌웨어 호출에 PS5PCEM이 응답하는 방식입니다. 숫자 NID 하나하나가 호스트 스택에서 실행되는 Zig 함수가 되며, Windows에서도 게스트의 System V 호출 규약이 유지됩니다.

작동 방식

PS5PCEM의 AMPR은 콘솔의 카운터 명령과 완료 명령을 프로세스 안에서 소프트웨어로 모델링한 것입니다. 카운터 128개가 저장, 원자적 필드 업데이트, 쌍 읽기, 마스크 대기를 제출 순서대로 받아들입니다.

작동 방식

APR은 타이틀 파일을 한 번 해결한 뒤, 이후 명령 버퍼에는 프로세스 안에서만 쓰는 식별자를 넣습니다. 지연된 AMPR 읽기는 호스트 디스크립터를 영원히 붙잡지 않고, 같은 읽기 전용 /app0 파일을 다시 엽니다.

작동 방식

마운트된 저장 슬롯은 쓰기 가능한 /savedata0이 됩니다. 타이틀은 일반 파일 API를 쓰며, 다음 실행 때 타이틀이 알리는 제품 코드 아래에서 같은 파일을 찾습니다.

작동 방식

libSceFont는 타이틀이 제공한 TrueType과 OpenType 글꼴을 FreeType으로 래스터화합니다. 시스템 글꼴 요청에는 라틴, 그리스, 키릴 문자용으로 함께 제공되는 Noto Sans 대체 글꼴을 사용합니다.

작동 방식

PNG 인코더는 피치가 있는 RGBA나 BGRA 픽셀로 8비트 RGB 또는 RGBA 파일을 씁니다. 디코더는 인터레이스가 아닌 그레이스케일, 팔레트, RGB, RGBA 이미지를 검사된 게스트 버퍼로 읽습니다.

작동 방식

RTC는 달력 필드를 검사하고, Windows FILETIME을 변환하며, 틱에 대해 검사된 산술을 합니다. 게스트는 호스트의 일광 절약 시간 변환 없이 일관된 시계를 봅니다.

작동 방식

Windows에서 libSceFiber의 각 파이버는 실제 Windows 파이버이므로, 전환 시 게스트 레지스터와 게스트 스택이 유지됩니다. 사용자 수준 스레드는 같은 pthread 경로로 시작됩니다.

작동 방식

커널 AIO API는 읽기 묶음을 받아 식별자를 반환합니다. PS5PCEM은 인터페이스가 허용하는 대로 제출 시점에 묶음을 수행하고, 타이틀은 완료된 결과를 가져갑니다.

작동 방식

그래픽

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

작동 방식

PlayStation 5 셰이더는 RDNA2 기계어입니다. PS5PCEM은 GFX10 계열을 디코딩하고, 제어 흐름 그래프를 만들며, 지원되는 연산을 Vulkan용 SPIR-V 1.5로 낮춥니다.

작동 방식

S_SETPC_B64로 이어지는 페치 셰이더를 포함한 병합된 NGG 정점 프로그램을 하나의 그래픽 단계로 변환합니다. 익스포트 프로그램은 자신만의 사용자 데이터 창을 유지합니다.

작동 방식

명시적 밉 형식을 포함한 IMAGE_LOAD_BY2, BY4, PCK2, PCK4가 측정된 네이티브 2D 형식에서 실행됩니다. BY 로드는 연속된 텍셀을 반환하고, PCK 로드는 그 원시 비트를 레지스터 하나에 패킹합니다.

작동 방식

IMAGE_GATHER4H와 IMAGE_GATHER4H_PCK는 가로 방향 텍셀 그룹에서 채널 하나를 모읍니다. 측정된 직접 1D·2D 범위는 GPU 디스패치 1,242회로 검증됩니다.

작동 방식

S_SWAPPC_B64와 S_CALL_B64는 완전한 반환 주소를 저장하고, ENDPGM 뒤에 있는 피호출자를 포함해 범위가 정해진 로컬 서브루틴을 실행합니다. 검증된 AGC 페치 셰이더도 같은 방식으로 링크할 수 있습니다.

작동 방식

Vulkan 백엔드는 실행 중에 드라이버를 불러오고, Vulkan 1.2를 요구하며, 스왑체인으로 게스트 프레임을 표시합니다. 렌더 타깃, 스토리지 이미지, 파이프라인은 드로 사이에 상주합니다.

작동 방식

0.3.5 이후에 추가된 실험적인 네이티브 Windows 렌더러입니다. PM4 디코더와 RDNA2 셰이더 변환을 Vulkan과 공유한 뒤, D3D12와 DXGI로 실행하고 화면에 표시합니다. 기본값은 여전히 Vulkan이며, 게임은 아직 이 경로로 실행되지 않습니다.

작동 방식

MSAA

부분

샘플 수가 일치하는 2×, 4×, 8× 컬러와 깊이는 나중의 리졸브까지 호스트 이미지에 남습니다. 아스테릭스는 MSAA 깊이와 스텐실에 이 경로를 사용하며, 이로써 의도치 않은 대규모 리드백이 사라졌습니다.

작동 방식

HTILE, DCC, CMASK, FMASK는 콘솔의 압축 깊이·컬러 메타데이터입니다. PS5PCEM은 포인터를 추적하고, 이해하는 경우에 HTILE을 지우며, 잘못 디타일하게 될 레이아웃은 거부합니다.

작동 방식

PS5 텍스처는 선형 행이 아니라 GFX10 스위즐 패턴으로 저장됩니다. PS5PCEM은 주소 방정식을 CPU에서, 그리고 조건에 맞는 큰 4, 8, 16바이트 표면은 GPU에서 적용합니다.

작동 방식

선택형 페이지 추적기는 16 KiB 게스트 페이지를 감시합니다. 첫 네이티브 CPU 저장이 폴트를 일으키면 세대를 올리고 GPU 사본을 무효화하므로, 바뀌지 않은 페이지를 매 프레임 해시하고 업로드하지 않습니다.

작동 방식

VideoOut

작동

VideoOut은 게스트의 디스플레이 버퍼를 등록하고, 화면 출력 콜백이 프레임을 받아들인 뒤에만 플립을 완료합니다. 호스트 창은 1080p SDR Vulkan 스왑체인입니다.

작동 방식

오디오와 비디오

AudioOut

작동

AudioOut은 게스트 PCM을 Windows 장치에서 48 kHz로 재생합니다. 레거시 포트는 각자 스트림과 큐를 가지므로 음악과 효과음이 함께 재생되고, 언더런이 나도 샘플 순서가 유지됩니다.

작동 방식

ACM 컨볼루션은 FMOD의 분할 리버브를 CPU에서 실행합니다. 공유 입력 묶음은 드라이 신호 하나를 변환하고, float 또는 half-float 임펄스 분할을 적용한 뒤, 웻 결과를 중첩 가산합니다.

작동 방식

AJM은 ATRAC9, MP3, MPEG-4 AAC, Opus를 디코딩합니다. 각 코덱 인스턴스는 자기 상태를 유지하며, 알 수 없는 코덱은 무음 성공으로 보고하지 않고 거부합니다.

작동 방식

NGS2

부분

NGS2는 시스템, 랙, 보이스 핸들을 유지하고, 일반 RIFF/WAVE 데이터를 파싱하며, 소프트웨어 DSP 워커가 헛돌지 않도록 무음 48 kHz 그레인의 속도를 맞춥니다. 보이스 합성 자체는 불완전합니다.

작동 방식

AvPlayer

작동

SceAvPlayer는 FFmpeg로 영상 컨테이너를 디코딩해 타이틀 소유의 NV12 프레임과 48 kHz 스테레오 PCM을 만듭니다. 타이틀이 스트림 하나를 끝내 읽지 않더라도 원본 길이가 지나면 재생이 끝납니다.

작동 방식

CPU, 로더, 도구

Windows x86-64에서는 게스트의 기계어가 직접 실행됩니다. 게스트 pthread마다 호스트 워커 하나가 붙고, Windows가 FS 베이스를 유지하지 않으므로 차단 호출 뒤마다 이를 복원합니다.

작동 방식

로더는 복호화된 PS5 SELF와 순수 ELF64 모듈을 매핑하고, 재배치를 적용하며, HLE 레지스트리를 기준으로 임포트를 해결합니다. 그 뒤 타이틀은 직접 시작하는 모듈에 대해 안정적인 핸들을 받습니다.

작동 방식

DualSense, DualSense Edge, DualShock 4는 USB와 Bluetooth에서 HID로 읽습니다. Xbox 호환 패드는 XInput을 사용합니다. 키보드는 런처 프로필을 통해 스틱에 매핑됩니다.

작동 방식

pkgextractor는 개발 중에 관찰된 디버그 FPKG 레이아웃을 풉니다. 바깥 패키지, 내부 PFS, NAPS 이름 맵, Kraken으로 압축된 페이로드입니다. 암호화된 리테일 패키지는 범위 밖입니다.

작동 방식

이 페이지들에 대하여

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