2 puan yazan GN⁺ 2024-09-03 | 1 yorum | WhatsApp'ta paylaş

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

 
GN⁺ 2024-09-03
Hacker News görüşleri
  • "GS" kısaltmasının ne anlama geldiğini merak ediyorum
  • Programlanabilir blending için dua etmiştim
    • 2000'lerin başında pixel shader'ı ilk öğrendiğimden beri programlanabilir texture decoding için de dua ediyordum
    • GPU'lar önce ray tracing'i getirdi
    • Programlanabilir blending, sabit işlevli blokların yerini almak demek
    • Hâlâ texture shader'ı bekliyorum
  • GS'nin veri yolu 2560 bit ile çok genişti
    • PS3, blending açısından GS'den daha zayıfmış gibi geliyordu
  • Birinin dynarmic'i baştan yazıp bunun hakkında bir blog yazısı yazmasını istiyorum
  • Bu yaklaşımın Dolphin'in ubershader'ı ile nasıl karşılaştırıldığını merak ediyorum
  • "top-left raster"ın ne anlama geldiğini merak ediyorum