2P by neo 17일전 | favorite | 댓글 1개

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을 사용한 고성능 에뮬레이션에 대한 통찰을 제공함.
Hacker News 의견
  • "GS" 약어가 무엇을 의미하는지 궁금함
  • 프로그래머블 블렌딩을 기도했음
    • 픽셀 셰이더를 처음 배운 2000년대 초부터 프로그래머블 텍스처 디코딩도 기도했음
    • GPU가 레이 트레이싱을 먼저 도입했음
    • 프로그래머블 블렌딩은 고정 기능 블록을 대체하는 것임
    • 여전히 텍스처 셰이더를 기다리고 있음
  • GS의 버스가 2560비트로 매우 넓었음
    • PS3는 블렌딩 면에서 GS보다 떨어지는 느낌이었음
  • 누군가가 dynarmic을 다시 작성하고 블로그에 글을 쓰길 바람
  • 이 접근 방식이 Dolphin의 ubershader와 어떻게 비교되는지 궁금함
  • "top-left raster"가 무엇을 의미하는지 궁금함