Recreating Voodoo Graphics and a Late-1990s Gaming PC on an FPGA
FPGA로 되살린 Voodoo Graphics — 1990년대 후반 게이밍 PC를 프로그래머블 로직 위에 재현
개발자 nand2mario가 3dfx Voodoo Graphics(SST-1)를 SystemVerilog로 구현한 zSST를 공개했습니다. 자체 제작한 z486 CPU와 결합해 Xilinx KV260 보드 위에서 DOS PC와 Voodoo 그래픽이 함께 동작하는 z486 XL을 완성했으며, Tomb Raider가 오리지널 3dfx 렌더러로 구동됩니다. 렌더링 산술보다 메모리 시스템 설계가 더 어려웠다는 점이 핵심 교훈입니다.
- 주제
본문
저자는 한 달간 z486_MiSTer 코어의 기능과 성능을 다듬다가 3D 그래픽 카드라는 새로운 도전에 나섰습니다. Need for Speed II SE에서 받은 Voodoo의 인상을 FPGA로 재현하기 위해, 3dfx Voodoo Graphics(SST-1)의 SystemVerilog 구현체인 zSST를 개발했습니다. z486 CPU와 주변 PC 하드웨어를 합친 z486 XL은 Xilinx KV260 보드의 프로그래머블 로직에서 동작하는 Voodoo 탑재 DOS PC이며, Tomb Raider가 원래의 3dfx 렌더러로 실행됩니다. zSST는 준비된 삼각형 렌더링, 텍스처 필터링과 밉매핑, 뎁스·알파 테스트, 포그, 블렌딩, 디더링, 프레임버퍼 접근, 버퍼 스왑을 지원하고 고정소수점·부동소수점 셋업 인터페이스를 모두 구현했습니다.
다섯 개 레지스터가 움직이는 렌더러
Voodoo는 3D 작업 대부분을 호스트 CPU에 남기고 삼각형을 픽셀로 바꾸는 일에 집중합니다. 명령 인터페이스는 triangleCMD(준비된 삼각형 렌더링), ftriangleCMD(부동소수점 셋업 경유), nopCMD(파이프라인 플러시), fastfillCMD(사각형 클리어), swapbufferCMD(버퍼 전환)의 다섯 레지스터로 구성됩니다. Glide의 grDrawTriangle 호출 전에 CPU가 기하 변환·조명·클리핑·투영을 끝내야 하며, GeForce 256 이후 GPU와 달리 하드웨어 T&L 엔진은 없습니다. 원본 카드는 FBI(프레임버퍼)와 TREX(TMU, 텍스처) 두 ASIC으로 작업을 나눠 50MHz에서 클럭당 1픽셀, 즉 50MPix/s의 피크를 냈습니다.
부동소수점 얼굴 뒤의 고정소수점 파이프라인
소프트웨어는 IEEE 단정밀도 값을 넘길 수 있지만 내부 연산은 고정소수점으로 동작합니다. 화면 좌표는 12.4, 색상은 12.12, 깊이는 20.12, 텍스처 좌표 S/W·T/W는 14.18, 1/W는 2.30 형식을 씁니다. 삼각형이 준비되면 스캔라인 진행은 대부분 미리 계산된 증분을 더하는 정수 덧셈입니다. TMU는 원근 보정을 위해 S/W·T/W·1/W를 보간한 뒤 나누고, 밉 레벨을 선택해 바이리니어 필터링으로 인접 4텍셀을 혼합합니다. zSST는 4단 프런트엔드로 원근·LOD 계산을 파이프라이닝하고, FBI 측은 F0~F4의 6단으로 크로마키 검사, 컬러·알파 컴바인, 알파/뎁스 테스트, 포그 조회와 적용, 블렌딩, 디더·쓰기 마스크를 처리합니다. 포그 조회와 적용을 나눈 것은 클럭 목표를 맞추기 위한 설계 결정입니다.
진짜 어려운 부분: 메모리 공급
픽셀 파이프라인 자체보다 데이터 공급이 더 많은 시간을 삼켰습니다. 원본 카드는 FBI·TMU 각각 전용 64비트 EDO 경로를 두고, 텍셀을 2×2 체스판 패턴(행·열의 홀짝 조합)으로 4개 뱅크에 분산해 어떤 2×2 창에서도 충돌 없이 4텍셀을 동시에 읽었습니다. KV260에는 전용 EDO가 없고 Linux·PC 코어·디스플레이 주사가 공유 DDR을 AXI로 다툽니다. 128비트 100MHz 포트의 이론 대역폭은 1.6GB/s지만 64바이트 읽기는 189MiB/s에 그치고 첫 데이터까지 약 280ns(28클럭)가 걸립니다. 이에 zSST는 8KiB 텍스처 캐시(64바이트 라인), 최대 8건의 계류 중인 캐시라인 페치와 재시도용 replay queue, 순서 복원용 64엔트리 ROB를 두고, 프레임버퍼 쪽에는 4KiB 읽기 캐시와 16비트 갱신을 128비트로 묶는 write combiner·포워딩을 적용했습니다. FBI·TMU는 HP2 포트를 공유하고 PC는 HP0, 스캔아웃은 HP3을 씁니다.
성능 측정과 남은 과제
시뮬레이션 벤치마크에서 zSST는 100MHz 기준 텍스처 삼각형 78.5MPix/s, 뎁스 테스트·블렌딩 포함 72.8MPix/s를 기록했습니다. 원본의 50MHz 추정치 43/37MPix/s와는 작업 조건이 달라 직접 비교는 아니라고 저자는 밝힙니다. 실기에서 Tomb Raider Level 2는 20초간 237회의 버퍼 스왑, 초당 약 12회로 CPU 병목이 지목됐습니다. 비Voodoo 게임 기준 Doom 최고 디테일 38.5FPS, Quake 8.1FPS로 85MHz DE10-Nano 빌드보다 약 20% 빠르며, UltraRAM의 512KiB 라이트백 L2가 기여했습니다. zSST는 약 29,500 LUT와 97 DSP 슬라이스를 쓰고, zSST와 z486 XL 모두 오픈소스로 공개됐습니다.
Hacker News 반응
- @functionmouse — 31kHz VGA 출력을 지원할지 궁금하며, 자신의 SuperStation One에 시대에 맞는 PC를 넣고 싶다고 말합니다.
- @mysterydip — 그 가능성은 생각하지 못했지만 실현된다면 정말 멋질 것이라고 호응합니다.
- @hexapus — 대부분의 코어가 VGA 포트로 원본 출력을 유지하므로 될 것 같고, 안 되더라도 vga_scaler를 강제로 켜면 된다고 답합니다.
- @wk_end — Tomb Raider(1996)가 사실상 Pentium을 요구했고 486에서 데모 실행이 거부됐던 기억을 들어, 이 FPGA 486이 Pentium 추가 명령어를 지원하는지 질문합니다.
- @rasz — 필수가 아니라 Pentium 60이 권장 최소사양이라고 정정하며, 파이프라인 FPU 덕에 Pentium 60에서 30fps, 486DX2@66에서 15fps, DX4@100에서 20fps 수준이었다고 덧붙입니다.
원문: Hacker News / 번역·요약: Trawling