PlayStation 2 GS 에뮬레이션 – Vulkan 컴퓨트 에뮬레이션의 최종 경계
- 2020년에 paraLLEl-RDP를 작성하여 N64 RDP를 Vulkan 컴퓨트로 구현함. 매우 빠르고 정확하며 업스케일링 지원도 추가됨.
- PlayStation 2를 위한 유사한 프로젝트를 구상하게 됨. 현재까지 GSdx가 20년 동안 표준이었음.
- paraLLEl-GS는 PS2 GS의 첫 번째 컴퓨트 구현은 아님. 2014년에 OpenCL로 시도된 적이 있으나 완료되지 않음.
기본 GS 개요
GS는 픽셀 처리 몬스터
- GS는 엄청난 필레이트와 대역폭으로 유명함. 2000년에는 초당 10억 픽셀 이상을 처리할 수 있었음.
- VRAM은 작지만 다양한 DMA 엔진을 사용하여 지속적으로 스트리밍되도록 설계됨.
GS 픽셀 파이프라인은 기본적이지만 특이함
- GS는 N64 RDP보다 단순함. 단일 텍스처와 단일 사이클 컴바이너를 가짐.
- 블렌딩은 1.0을 초과할 수 있음. 0x80은 1.0으로 처리되고 최대 0xff까지 갈 수 있음.
- 목적지 알파 테스트, 조건부 블렌딩, 알파 보정 등 다양한 특이한 기능이 있음.
D3D9 스타일 래스터 규칙
- 클립 공간에서 단순한 형태로 제공되는 프리미티브. VU1 유닛이 변환과 클리핑을 수행함.
- X/Y: 12.4 고정 소수점, Z: 24비트 또는 32비트 uint, FOG: 8비트 uint, RGBA: 8비트, STQ: 정규화된 좌표로 원근 텍스처링.
버텍스 큐
- GS는 OpenGL 1.0과 유사한 느낌을 줌. TRIANGLE_FAN을 지원함.
- XYZ 레지스터 쓰기는 버텍스 상태를 고정하고 큐를 진행시킴.
재미있는 스위즐링 포맷
- 24비트 색상 또는 깊이로 렌더링할 때 상위 8비트를 텍스처로 사용할 수 있음.
- 픽셀 좌표는 "페이지"로 배열됨. 페이지는 8 KiB, 32 블록으로 세분화됨.
프레임버퍼 캐시와 텍스처 캐시
- 프레임버퍼 렌더링과 텍스처를 위한 전용 캐시가 있음. 게임은 종종 피드백 루프를 수행함.
텍스처링
- 텍스처링은 친숙하면서도 아케인함. 텍셀 중심은 반 픽셀에 있음.
- REGION_CLAMP와 REGION_REPEAT 같은 특수 주소 지정 모드가 있음.
CLUT
- 현재 팔레트를 저장하는 1 KiB 캐시가 있음. VRAM에서 CLUT 캐시로 명시적 복사 단계가 필요함.
TEXFLUSH
- 텍스처 캐시를 동기화하고 무효화하는 명령이 있음. TEXFLUSH를 무시하고 최소한의 캐싱을 선택함.
GIF를 사용한 레지스터 조작
- GIF를 통해 GS 하드웨어와 상호작용함. GIF 패킷의 헤더는 쓰기 대상 레지스터와 루프 수를 설정함.
Trongle – GS
- OpenGL 1.0의 단순함을 그리워하는 사람들을 위한 API.
- 테스트 목적으로 .gs 덤프 형식을 생성하는 도구를 추가함.
구현 세부 사항
렌더링 파이프라인
- CPU에서 VRAM으로 데이터 동기화, VRAM으로 데이터 업로드, CLUT 캐시 업데이트, VRAM에서 VkImages로 언스위즐링, 렌더링, GPU에서 CPU로 VRAM 동기화.
페이지 트래커
- VRAM을 페이지 단위로 나누어 추적함. 페이지 상태를 추적하여 잠재적 위험을 처리함.
텍스처 캐싱
- 각 페이지에는 관련된 VkImages 목록이 있음. 페이지의 텍스처가 무효화되면 이미지가 파괴되고 VRAM에서 다시 언스위즐링됨.
CLUT 업데이트
- 텍스처 업로드를 배치하기 위해 CLUT 업로드도 배치함. 1024개의 CLUT 스냅샷을 사용함.
VRAM에서 텍스처 언스위즐링
- Vulkan을 사용하여 새로운 VkImage를 할당하고 컴퓨트 셰이더로 처리함.
삼각형 설정 및 비닝
- paraLLEl-RDP와 마찬가지로 타일 기반 렌더러임. 삼각형 설정을 위해 속성 배열을 제공함.
GN⁺의 정리
- 이 글은 PlayStation 2의 GS 에뮬레이션을 다루며, 특히 Vulkan 컴퓨트 셰이더를 사용한 구현에 중점을 둠.
- PS2 GS는 복잡한 픽셀 파이프라인과 특이한 기능들로 인해 에뮬레이션이 어려움.
- 이 프로젝트는 GS의 다양한 특성을 이해하고 이를 에뮬레이션하기 위한 다양한 기술적 접근 방식을 설명함.
- PS2 에뮬레이션에 관심이 있는 사람들에게 유용하며, 특히 Vulkan을 사용한 고성능 에뮬레이션에 대한 통찰을 제공함.