PlayStation 2 GS emülasyonu – Vulkan compute emülasyonunun son sınırı
- 2020'de paraLLEl-RDP yazılarak N64 RDP, Vulkan compute ile hayata geçirildi. Çok hızlı ve doğruydu; ayrıca upscaling desteği de eklendi.
- Bunun ardından PlayStation 2 için benzer bir proje fikri ortaya çıktı. Bugüne kadar GSdx, 20 yıldır standarttı.
- paraLLEl-GS, PS2 GS'nin ilk compute tabanlı uygulaması değil. 2014'te OpenCL ile bir deneme yapılmıştı ancak tamamlanmadı.
GS'e temel bakış
GS bir piksel işleme canavarı
- GS, olağanüstü fillrate ve bant genişliğiyle biliniyor. 2000 yılında saniyede 1 milyardan fazla piksel işleyebiliyordu.
- VRAM küçük olsa da, çeşitli DMA motorları kullanılarak sürekli akış sağlayacak şekilde tasarlanmıştı.
GS piksel pipeline'ı temel ama sıra dışı
- GS, N64 RDP'den daha basit. Tek bir texture ve tek çevrimli bir combiner'a sahip.
- Blending 1.0'ın üzerine çıkabiliyor. 0x80, 1.0 olarak ele alınıyor ve en fazla 0xff'e kadar çıkabiliyor.
- Hedef alpha testi, koşullu blending, alpha düzeltmesi gibi çeşitli sıra dışı özellikleri var.
D3D9 tarzı raster kuralları
- Primitive'ler clip space içinde basit bir biçimde veriliyor. Dönüşüm ve clipping işlemlerini VU1 birimi yapıyor.
- X/Y: 12.4 fixed-point, Z: 24 bit veya 32 bit uint, FOG: 8 bit uint, RGBA: 8 bit, STQ: normalize koordinatlarla perspective texturing.
Vertex kuyruğu
- GS, OpenGL 1.0'a benzer bir his veriyor. TRIANGLE_FAN destekleniyor.
- XYZ register yazımı, vertex durumunu sabitliyor ve kuyruğu ilerletiyor.
Eğlenceli swizzle formatları
- 24 bit renk veya derinlik ile render ederken üstteki 8 bit texture olarak kullanılabiliyor.
- Piksel koordinatları "sayfalar" halinde düzenleniyor. Sayfalar 8 KiB boyutunda ve 32 bloğa ayrılmış durumda.
Framebuffer cache ve texture cache
- Framebuffer render'ı ve texture'lar için ayrılmış cache'ler bulunuyor. Oyunlar sık sık feedback loop kullanıyor.
Texturing
- Texturing hem tanıdık hem de epey arcane. Texel merkezleri yarım piksel üzerinde bulunuyor.
- REGION_CLAMP ve REGION_REPEAT gibi özel adresleme modları var.
CLUT
- Geçerli paleti tutan 1 KiB'lik bir cache var. VRAM'den CLUT cache'ine açık bir kopyalama adımı gerekiyor.
TEXFLUSH
- Texture cache'ini senkronize edip geçersiz kılan bir komut bulunuyor. TEXFLUSH göz ardı edilerek minimum cache kullanımı tercih ediliyor.
GIF ile register manipülasyonu
- GS donanımıyla GIF üzerinden etkileşime giriliyor. GIF paketinin başlığı, yazılacak hedef register'ları ve döngü sayısını belirliyor.
Trongle – GS
- OpenGL 1.0'ın sadeliğini özleyenler için bir API.
- Test amacıyla .gs dump formatı üreten bir araç eklendi.
Uygulama ayrıntıları
Render pipeline'ı
- CPU'dan VRAM'e veri senkronizasyonu, verinin VRAM'e yüklenmesi, CLUT cache güncellemesi, VRAM'den VkImage'lara unswizzle işlemi, render ve GPU'dan CPU'ya VRAM senkronizasyonu.
Sayfa izleyici
- VRAM, sayfa bazında bölünerek izleniyor. Olası tehlikeleri ele almak için sayfa durumları takip ediliyor.
Texture caching
- Her sayfanın ilişkili bir VkImage listesi bulunuyor. Bir sayfadaki texture geçersiz kılındığında görüntü yok ediliyor ve VRAM'den yeniden unswizzle ediliyor.
CLUT güncellemesi
- Texture yüklemelerini toplu yapmak için CLUT yüklemeleri de toplu yapılıyor. 1024 CLUT snapshot'ı kullanılıyor.
VRAM'den texture unswizzle işlemi
- Yeni bir VkImage ayırmak ve bunu compute shader ile işlemek için Vulkan kullanılıyor.
Üçgen kurulumu ve binning
- paraLLEl-RDP'de olduğu gibi bu da tile tabanlı bir renderer. Üçgen kurulumu için attribute dizileri sağlanıyor.
GN⁺ özeti
- Bu yazı, PlayStation 2'nin GS emülasyonunu ele alıyor ve özellikle Vulkan compute shader kullanan uygulamaya odaklanıyor.
- PS2 GS, karmaşık piksel pipeline'ı ve sıra dışı özellikleri nedeniyle emüle edilmesi zor bir yapı.
- Proje, GS'nin çeşitli özelliklerini anlamaya ve bunları emüle etmeye yönelik farklı teknik yaklaşımları açıklıyor.
- PS2 emülasyonuna ilgi duyanlar için faydalı; özellikle Vulkan ile yüksek performanslı emülasyon konusunda içgörü sunuyor.
1 yorum
Hacker News görüşleri