# 플레이스테이션 2 GS 에뮬레이션 – Vulkan 컴퓨트 에뮬레이션의 최종 경계

> Clean Markdown view of GeekNews topic #16585. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=16585](https://news.hada.io/topic?id=16585)
- GeekNews Markdown: [https://news.hada.io/topic/16585.md](https://news.hada.io/topic/16585.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-09-03T09:55:58+09:00
- Updated: 2024-09-03T09:55:58+09:00
- Original source: [themaister.net](https://themaister.net/blog/2024/07/03/playstation-2-gs-emulation-the-final-frontier-of-vulkan-compute-emulation/)
- Points: 2
- Comments: 1

## Topic Body

### 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을 사용한 고성능 에뮬레이션에 대한 통찰을 제공함.

## Comments



### Comment 28510

- Author: neo
- Created: 2024-09-03T09:55:58+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=41413662) 
- "GS" 약어가 무엇을 의미하는지 궁금함
- 프로그래머블 블렌딩을 기도했음
  - 픽셀 셰이더를 처음 배운 2000년대 초부터 프로그래머블 텍스처 디코딩도 기도했음
  - GPU가 레이 트레이싱을 먼저 도입했음
  - 프로그래머블 블렌딩은 고정 기능 블록을 대체하는 것임
  - 여전히 텍스처 셰이더를 기다리고 있음
- GS의 버스가 2560비트로 매우 넓었음
  - PS3는 블렌딩 면에서 GS보다 떨어지는 느낌이었음
- 누군가가 dynarmic을 다시 작성하고 블로그에 글을 쓰길 바람
- 이 접근 방식이 Dolphin의 ubershader와 어떻게 비교되는지 궁금함
- "top-left raster"가 무엇을 의미하는지 궁금함
