PlayStation 2 GS एमुलेशन – Vulkan compute एमुलेशन की अंतिम सीमा
- 2020 में paraLLEl-RDP लिखा गया, जिसमें N64 RDP को Vulkan compute के साथ इम्प्लीमेंट किया गया। यह बहुत तेज़ और सटीक था, और इसमें upscaling सपोर्ट भी जोड़ा गया।
- इसके बाद PlayStation 2 के लिए एक समान प्रोजेक्ट की कल्पना की गई। अब तक GSdx 20 वर्षों से मानक बना हुआ था।
- paraLLEl-GS, PS2 GS का पहला compute इम्प्लीमेंटेशन नहीं है। 2014 में OpenCL के साथ एक प्रयास किया गया था, लेकिन वह पूरा नहीं हुआ।
बुनियादी GS अवलोकन
GS पिक्सेल प्रोसेसिंग का मॉन्स्टर है
- GS अपने विशाल fillrate और bandwidth के लिए प्रसिद्ध है। 2000 में यह प्रति सेकंड 1 अरब से अधिक पिक्सेल प्रोसेस कर सकता था।
- VRAM छोटा है, लेकिन इसे कई DMA engines का उपयोग करके लगातार streaming के लिए डिज़ाइन किया गया है।
GS पिक्सेल पाइपलाइन बुनियादी है, लेकिन अजीब भी है
- GS, N64 RDP की तुलना में सरल है। इसमें single texture और single-cycle combiner है।
- Blending 1.0 से ऊपर जा सकता है। 0x80 को 1.0 की तरह ट्रीट किया जाता है, और यह अधिकतम 0xff तक जा सकता है।
- इसमें destination alpha test, conditional blending, alpha correction जैसी कई असामान्य विशेषताएँ हैं।
D3D9-स्टाइल raster नियम
- primitives को clip space में सरल रूप में दिया जाता है। VU1 unit transform और clipping करता है।
- X/Y: 12.4 fixed-point, Z: 24-bit या 32-bit uint, FOG: 8-bit uint, RGBA: 8-bit, STQ: normalized coordinates के साथ perspective texturing।
वर्टेक्स queue
- GS, OpenGL 1.0 जैसा एहसास देता है। यह TRIANGLE_FAN को सपोर्ट करता है।
- XYZ register write वर्टेक्स state को फिक्स कर देता है और queue को आगे बढ़ाता है।
दिलचस्प swizzling formats
- 24-bit color या depth में render करते समय ऊपरी 8 bits को texture के रूप में इस्तेमाल किया जा सकता है।
- पिक्सेल coordinates को "pages" में व्यवस्थित किया जाता है। हर page 8 KiB का होता है और 32 blocks में विभाजित होता है।
framebuffer cache और texture cache
- framebuffer rendering और textures के लिए dedicated cache मौजूद हैं। गेम अक्सर feedback loop चलाते हैं।
texturing
- Texturing परिचित भी है और रहस्यमय भी। Texel center half-pixel पर होता है।
- इसमें REGION_CLAMP और REGION_REPEAT जैसे विशेष addressing modes हैं।
CLUT
- मौजूदा palette को स्टोर करने के लिए 1 KiB cache होता है। VRAM से CLUT cache में explicit copy step की आवश्यकता होती है।
TEXFLUSH
- texture cache को synchronize और invalidate करने के लिए एक command है। TEXFLUSH को अनदेखा किया गया और minimal caching चुनी गई।
GIF के साथ register manipulation
- GS hardware के साथ interaction, GIF के माध्यम से होता है। GIF packet header यह सेट करता है कि किन registers पर write होगा और loop count क्या होगा।
Trongle – GS
- उन लोगों के लिए API जो OpenGL 1.0 की सादगी को मिस करते हैं।
- testing के लिए .gs dump format बनाने वाला एक tool जोड़ा गया।
इम्प्लीमेंटेशन विवरण
rendering pipeline
- CPU से VRAM में data synchronize करना, VRAM में data upload करना, CLUT cache update करना, VRAM से VkImages में unswizzle करना, rendering, और GPU से CPU में VRAM synchronize करना।
page tracker
- VRAM को page units में बाँटकर track किया जाता है। संभावित hazards को संभालने के लिए page state को track किया जाता है।
texture caching
- हर page के साथ संबंधित VkImages की एक list होती है। जब किसी page का texture invalidate होता है, तो image को destroy कर दिया जाता है और VRAM से फिर से unswizzle किया जाता है।
CLUT updates
- texture uploads को batch करने के लिए CLUT uploads को भी batch किया जाता है। 1024 CLUT snapshots का उपयोग किया जाता है।
VRAM से texture unswizzling
- Vulkan का उपयोग करके एक नया VkImage allocate किया जाता है और compute shader से प्रोसेस किया जाता है।
triangle setup और binning
- paraLLEl-RDP की तरह, यह भी tile-based renderer है। triangle setup के लिए attribute arrays प्रदान किए जाते हैं।
GN⁺ का सारांश
- यह लेख PlayStation 2 के GS एमुलेशन पर केंद्रित है, खासकर Vulkan compute shaders का उपयोग करने वाले इम्प्लीमेंटेशन पर।
- PS2 GS का एमुलेशन उसके जटिल पिक्सेल पाइपलाइन और असामान्य फीचर्स के कारण कठिन है।
- यह प्रोजेक्ट GS की विभिन्न विशेषताओं को समझने और उनका एमुलेशन करने के लिए अपनाए गए कई तकनीकी दृष्टिकोणों को समझाता है।
- PS2 एमुलेशन में रुचि रखने वालों के लिए यह उपयोगी है, खासकर Vulkan आधारित high-performance एमुलेशन के बारे में insight देने के लिए।
1 टिप्पणियां
Hacker News टिप्पणियाँ