2 poin oleh GN⁺ 2024-09-03 | 1 komentar | Bagikan ke WhatsApp

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

 
GN⁺ 2024-09-03
Komentar Hacker News
  • Bertanya-tanya apa arti singkatan "GS"
  • Berharap ada programmable blending
    • Sejak pertama kali belajar pixel shader pada awal 2000-an, juga berharap ada programmable texture decoding
    • GPU malah lebih dulu mengadopsi ray tracing
    • Programmable blending berarti menggantikan blok fixed-function
    • Masih menunggu texture shader
  • Bus pada GS sangat lebar, yaitu 2560-bit
    • PS3 terasa lebih lemah dibanding GS dalam hal blending
  • Berharap seseorang menulis ulang dynarmic dan menulis blog post tentangnya
  • Bertanya-tanya bagaimana pendekatan ini dibandingkan dengan ubershader milik Dolphin
  • Bertanya-tanya apa yang dimaksud dengan "top-left raster"