Emulasi GS PlayStation 2 – Garis Batas Terakhir Emulasi Komputasi Vulkan
- Pada 2020, penulis membuat paraLLEl-RDP dan mengimplementasikan N64 RDP dengan komputasi Vulkan. Hasilnya sangat cepat, akurat, dan bahkan ditambah dukungan upscaling.
- Lalu muncul gagasan untuk membuat proyek serupa untuk PlayStation 2. Sampai sekarang, GSdx telah menjadi standar selama 20 tahun.
- paraLLEl-GS bukan implementasi komputasi pertama untuk PS2 GS. Pernah ada percobaan dengan OpenCL pada 2014, tetapi tidak pernah selesai.
Gambaran dasar GS
GS adalah monster pemrosesan piksel
- GS terkenal karena fillrate dan bandwidth yang luar biasa. Pada tahun 2000, perangkat ini mampu memproses lebih dari 1 miliar piksel per detik.
- VRAM-nya kecil, tetapi dirancang agar terus di-streaming menggunakan berbagai mesin DMA.
Pipeline piksel GS itu dasar, tetapi aneh
- GS lebih sederhana daripada N64 RDP. Ia memiliki satu tekstur dan combiner satu siklus.
- Blending dapat melebihi 1.0. Nilai 0x80 diperlakukan sebagai 1.0 dan bisa naik hingga maksimum 0xff.
- Ada berbagai fitur aneh seperti destination alpha test, conditional blending, dan alpha correction.
Aturan raster ala D3D9
- Primitive diberikan dalam bentuk sederhana di clip space. Unit VU1 menangani transformasi dan clipping.
- X/Y: fixed-point 12.4, Z: uint 24-bit atau 32-bit, FOG: uint 8-bit, RGBA: 8-bit, STQ: tekstur perspektif dengan koordinat ternormalisasi.
Antrean vertex
- GS terasa mirip OpenGL 1.0. Ia mendukung TRIANGLE_FAN.
- Penulisan ke register XYZ mengunci status vertex dan memajukan antrean.
Format swizzle yang menarik
- Saat merender dengan warna atau depth 24-bit, 8 bit teratas bisa dipakai sebagai tekstur.
- Koordinat piksel disusun dalam "page". Satu page berukuran 8 KiB dan dibagi lagi menjadi 32 blok.
Cache framebuffer dan cache tekstur
- Ada cache khusus untuk rendering framebuffer dan untuk tekstur. Game sering menjalankan feedback loop.
Texturing
- Texturing terasa familier sekaligus sangat arcane. Pusat texel berada pada setengah piksel.
- Ada mode addressing khusus seperti REGION_CLAMP dan REGION_REPEAT.
CLUT
- Ada cache 1 KiB untuk menyimpan palet saat ini. Diperlukan tahap penyalinan eksplisit dari VRAM ke cache CLUT.
TEXFLUSH
- Ada perintah untuk menyinkronkan dan menginvalidasi cache tekstur. Penulis memilih mengabaikan TEXFLUSH dan memakai caching seminimal mungkin.
Manipulasi register dengan GIF
- Interaksi dengan hardware GS dilakukan melalui GIF. Header paket GIF mengatur register tujuan penulisan dan jumlah loop.
Trongle – GS
- API untuk orang-orang yang merindukan kesederhanaan OpenGL 1.0.
- Ditambahkan alat untuk menghasilkan format dump .gs demi keperluan pengujian.
Detail implementasi
Pipeline rendering
- Sinkronisasi data dari CPU ke VRAM, unggah data ke VRAM, pembaruan cache CLUT, unswizzle dari VRAM ke VkImage, rendering, sinkronisasi VRAM dari GPU ke CPU.
Pelacak page
- VRAM dilacak dengan membaginya per page. Status tiap page dipantau untuk menangani potensi hazard.
Caching tekstur
- Setiap page memiliki daftar VkImage terkait. Jika tekstur pada sebuah page diinvalidasi, image dihancurkan dan di-unswizzle ulang dari VRAM.
Pembaruan CLUT
- Untuk melakukan batching unggahan tekstur, unggahan CLUT juga dibatch. Digunakan 1024 snapshot CLUT.
Unswizzle tekstur dari VRAM
- Vulkan dipakai untuk mengalokasikan VkImage baru dan memprosesnya dengan compute shader.
Penyiapan dan binning segitiga
- Seperti paraLLEl-RDP, ini adalah tile-based renderer. Array atribut disediakan untuk penyiapan segitiga.
Ringkasan GN⁺
- Artikel ini membahas emulasi GS PlayStation 2, khususnya implementasi yang menggunakan compute shader Vulkan.
- PS2 GS sulit diemulasikan karena pipeline pikselnya yang kompleks dan berbagai fitur yang tidak lazim.
- Proyek ini menjelaskan berbagai karakteristik GS serta beragam pendekatan teknis untuk mengemulasikannya.
- Bermanfaat bagi orang yang tertarik pada emulasi PS2, terutama yang ingin memahami emulasi berperforma tinggi dengan Vulkan.
1 komentar
Komentar Hacker News