Emulation issues and roadblocks

From Emulation General Wiki
Revision as of 13:22, 10 July 2026 by Ahayri (talk | contribs)
Jump to navigation Jump to search
For modern techniques and methods used for emulation, see High and low-level emulation#Future Outlook.
For ways to support or contribute to an emulation or similar project, see Support emulation projects.

placeholder text

Platforms that need attention

Main article: Category:Partially emulated
There are several systems that require more attention from the emulation community. While multiple emulators may exist, none of them appear particularly promising. These systems for which a PC cannot yet fully replicate the experience, because emulators are incomplete, or lack support for key hardware features, peripherals, or specialized components. As a result, certain software or functions remain usable only on original hardware.

Windows XP

Main article: Windows NT 5.x emulators

For PC games up to roughly 1997, emulators such as 86Box and DOSBox#Forks accurately recreate the hardware environment of the era. Beginning around 1998, however, PC games increasingly depended on hardware-accelerated 3D graphics, SSE instructions, and substantially more CPU performance. A fully cycle-accurate implementation of an entire Windows XP-era PC including the CPU, chipset and graphics hardware is impractical due to the computational cost of faithfully reproducing that generation of x86 systems.

Instead, modern PC emulation generally relies on either hardware-assisted virtualization (such as KVM or WHPX) or dynamic binary translation (DBT). Hardware-assisted virtualization executes guest code directly on the host processor and therefore provides substantially higher CPU performance, but requires compatible host hardware and introduces a dependency on the host operating system's virtualization facilities. Generic dynamic binary translation engines such as QEMU's TCG/MTTCG provide a flexible software-only foundation but generally do not deliver sufficient performance in their standard form. Nevertheless, projects such as Xemu, RPCS3 and Cemu demonstrate that carefully optimized, workload-specific dynamic recompilers can achieve practical performance even for systems that very complex.

Unlike console emulators, Windows XP emulation targets the same general x86 instruction set used by modern desktop processors. Although privilege levels, segmentation, paging, exceptions, self-modifying code and other architectural differences still require translation, guest instructions can often be mapped to relatively efficient native host code. Rather than attempting cycle-accurate execution, a specialized recompiler could instead optimize frequently executed code paths through techniques such as larger translation blocks, aggressive block linking, profile-guided optimization and guest operating system-aware fast paths. The performance target is also substantially lower than native execution on modern processors. Many games released in that era were designed to run on hardware comparable to a Pentium 4 or Athlon XP paired with a DirectX 8 or DirectX 9 graphics accelerator. Consequently, a software emulator does not necessarily need to approach native CPU performance; it instead needs to provide performance broadly comparable to contemporary hardware while minimizing translation overhead. The largest remaining technical challenge for the 1998–2005 era is efficient 3D graphics acceleration. While projects such as QEMU 3dfx demonstrate that application-level API pass-through is feasible, these solutions typically rely on guest-side wrapper libraries, manual configuration, and external translation layers. Other projects including SoftGPU, Gallium Nine, and experimental virtio-gpu implementations explore different approaches to accelerating legacy graphics APIs. A fully integrated software emulator combining a high-performance dynamic recompiler with a paravirtualized graphics architecture remains an area of active research rather than an established solution.

Approach 1: User-Space API Pass-Through

Historically, developing complete virtual graphics drivers for closed-source legacy Windows environments (particularly Windows 9x and XP) has been significantly more complex than implementing user-space API forwarding. Projects such as QEMU 3dfx therefore adopted an API Pass-Through (or Forwarding) approach.[1]

  • This approach injects custom user-space library stubs into individual game directories or system locations to intercept graphics API calls before they reach the guest's virtual display driver.*
  • For Direct3D acceleration, this method relies on a complex manual "ddthru" configuration. Users must modify Windows ACPI settings through Device Manager, install proxy libraries (such as ddraw.dll, ddrawwq.dll, and dsound.dll) into %SYSTEMROOT%\system32, and use tools such as wine-get to deploy matching WineD3D wrapper DLLs into individual game directories. Because the guest desktop is rendered through a virtual 2D display driver such as BoxVNT, which provides no native 3D acceleration, the pass-through layer intercepts graphics API calls before they reach the virtual display device and forwards them to host-side rendering backends.
  • When an application invokes a supported graphics API, the injected libraries intercept those API calls and forward them to compatible host-side wrapper libraries (such as dgVoodoo2, nGlide, or Mesa), where they are translated into graphics commands executable by the host GPU.
  • Drawbacks: Because interception occurs above the graphics driver layer, compatibility depends on successfully replacing or proxying application-visible libraries. The resulting configuration process is often complex, requiring manual installation of wrapper DLLs, per-game configuration, and system modifications. Compatibility can vary between titles, particularly for applications that rely on undocumented behavior or interact directly with graphics resources outside the expected API pathways. In addition, implementations frequently rely on host virtualization technologies (such as WHPX or KVM), introducing another software layer whose behavior and timing characteristics are outside the emulator's direct control.
+───────────────────────────────────────────────────────────────────────────+
|                           GUEST OS (Windows XP)                           |
|                                                                           |
|   [ Manual Device Manager Tweak ] ──► (Switches Kernel to ACPI PC)        |
|                                                                           |
|   [ 2D Desktop / GUI Pipeline ] ────► [ BoxVNT Virtual Display Driver ]   |
|                                                                           |
|   [ Target Retro Game Folder ]                                            |
|   ├── game.exe                                                            |
|   └── [ Injected Stubs ] (wine-get: d3d8.dll / d3d9.dll / ddraw.dll)      |
|            │                                                              |
|            ▼ (Intercepts graphics API calls before BoxVNT)                |
|   [ Global System Directory ] (%SYSTEMROOT%\system32)                     |
|   └── [ Proxy Wrappers ] (ddraw.dll, ddrawwq.dll, etc.)                   |
+─────────────────────────────────┬─────────────────────────────────────────+
                                  │
                                  ▼ (Forwards intercepted API calls)
    =====================================================================
                     HOST VIRTUALIZATION BOUNDARY
    =====================================================================
                                  │
                                  ▼
+─────────────────────────────────┴─────────────────────────────────────────+
|                            HOST OS / EMULATOR                             |
|                                                                           |
|   [ QEMU API Pass-Through Backend ]                                       |
|            │                                                              |
|            ▼ (Routes calls to host wrapper libraries)                     |
|   [ Translation Layer ] (dgVoodoo2, nGlide, Mesa, etc.)                   |
|            │                                                              |
|            ▼                                                              |
|   [ Host GPU ] ─────────────► [ Emulator Display Window ]                 |
+───────────────────────────────────────────────────────────────────────────+

Approach 2: Paravirtualized GPU Device

An alternative architectural approach is to virtualize the guest graphics device itself rather than modifying individual applications or replacing system libraries. Following the same general design philosophy as modern paravirtualized GPU implementations (such as VirtualBox's VBoxVGA or QEMU's VirGL), the guest OS exposes a virtual graphics adapter whose driver presents a standard graphics device to Windows while forwarding rendering commands to the emulator. Unlike existing virtual GPU implementations, however, this approach specifically targets legacy Windows 9x/XP graphics APIs within a software-emulated environment.

  • Guest-side virtual graphics driver: The guest installs an OS-compliant virtual graphics driver consisting of a User-Mode Driver (UMD) and a Kernel-Mode Miniport Driver (KMD). Applications continue using the original Microsoft Direct3D runtime (such as d3d8.dll or d3d9.dll) without modification. Rendering requests naturally flow through the registered virtual graphics device instead of requiring per-game DLL replacement or API hooks.
  • Shared-memory command transport: Rather than performing expensive hypercalls for every rendering operation, the emulator exposes a shared-memory command queue (such as a ring buffer). The guest graphics driver serializes rendering commands, resource updates, and synchronization events into this queue, allowing the host to consume them asynchronously with minimal virtualization overhead.
  • Host-side virtual GPU renderer: The emulator reconstructs the guest rendering state from the command stream and executes it using a dedicated virtual GPU renderer implemented on top of a modern graphics API such as Vulkan or OpenGL. Unlike application-level wrapper projects, the renderer operates entirely within the emulator rather than inside the guest operating system.
+───────────────────────────────────────────────────────────────────────────+
|                           GUEST OS (Windows XP)                           |
|                                                                           |
|   [ Retro Game ]                                                          |
|         │                                                                 |
|         ▼                                                                 |
|   [ Microsoft Direct3D Runtime ]                                          |
|   (d3d8.dll / d3d9.dll)                                                   |
|         │                                                                 |
|         ▼                                                                 |
|   [ Virtual Graphics Driver ]                                             |
|   (UMD + Kernel Miniport Driver)                                          |
+─────────────────────────────────┬─────────────────────────────────────────+
                                  │
                                  ▼
                  =================================
                   SHARED MEMORY COMMAND QUEUE
                  =================================
                                  │
                                  ▼
+─────────────────────────────────┴─────────────────────────────────────────+
|                           HOST OS / EMULATOR                              |
|                                                                           |
|   [ Command Queue Consumer ]                                              |
|            │                                                              |
|            ▼                                                              |
|   [ Virtual GPU Command Decoder ]                                         |
|            │                                                              |
|            ▼                                                              |
|   [ Virtual GPU Renderer ]                                                |
|            │                                                              |
|            ▼                                                              |
|   [ Vulkan / OpenGL Backend ]                                             |
|            │                                                              |
|            ▼                                                              |
|   [ Host GPU ] ─────────────► [ Emulator Display Window ]                 |
+───────────────────────────────────────────────────────────────────────────+

Unlike application-level API forwarding, the virtual graphics driver does not simply relay Direct3D API calls to the host. Instead, it implements a complete virtual graphics device whose command stream serves as the interface between the guest operating system and the emulator. The guest driver translates Direct3D operations into commands understood by the virtual GPU, while the emulator reconstructs those commands and executes them using a modern graphics backend such as Vulkan or OpenGL. This avoids the considerably more difficult task of emulating the register-level behavior and rendering pipeline of a physical GPU while still allowing Windows and applications to interact with what appears to be standard graphics hardware.

Since rendering is performed entirely on the host GPU, completed frames generally do not need to be copied back into the guest frame buffer except when required for compatibility (for example, guest software that reads the front buffer directly). Instead, the emulator presents the rendered output directly within its own display window while maintaining guest-visible synchronization state.

The primary challenge is implementation complexity rather than raw GPU performance. A complete virtual graphics device must faithfully virtualize Direct3D state management, resource creation, synchronization primitives, presentation, capability reporting, shader handling, and device-loss behavior so that Windows and applications observe behavior consistent with physical hardware. Although modern GPUs provide orders of magnitude more rendering performance than hardware from the Windows XP era, overall performance depends primarily on efficient command serialization, state tracking, and translation rather than GPU throughput alone.

Compared to application-level API forwarding, this approach offers several advantages:

  • The original Microsoft graphics runtime remains untouched, avoiding per-game DLL replacement and compatibility hacks.
  • Graphics virtualization occurs at the device-driver level, allowing all applications to use the same rendering pipeline automatically.
  • The virtual GPU provides a stable hardware abstraction for the guest while the emulator translates its command stream into modern graphics APIs, eliminating the need to emulate an entire legacy GPU architecture.
  • Shared-memory command transport minimizes synchronization overhead compared to frequent VM exits or hypercalls.
  • Rendering logic resides entirely within the emulator, resulting in a more centralized and maintainable graphics architecture.

For more information about PC emulation and their reverse engineering;

Other projects and emulated systems that have helped, or may potentially help, PC emulators in the future;

PlayStation 2

Despite a large interest in sixth generation consoles as a whole and the PlayStation 2 in particular, it remains one of the more difficult consoles to emulate accurately. The PlayStation 2's main processor, the Emotion Engine (EE), is built around the 64-bit R5900 running at 294MHz (299MHz on later revisions). Although derived from the MIPS architecture, the R5900 is not a standard MIPS III or MIPS IV implementation; instead, it is a heavily customized design featuring proprietary Multimedia Instructions (MMI), non-IEEE-754 floating-point behavior, and numerous architectural extensions unique to the PlayStation 2.

Architecturally, the R5900 exposes the standard MIPS coprocessor interface consisting of COP0 (system control), COP1 (Floating-Point Unit), and COP2 (Vector Unit 0). Beyond the CPU core, the Emotion Engine also incorporates numerous dedicated hardware engines, including Vector Unit 1 (VU1), the Image Processing Unit (IPU), Vector Interface Units (VIF0/VIF1), the Graphics Interface (GIF), the Direct Memory Access Controller (DMAC), on-die instruction and data caches, and 16KB of scratchpad RAM. These components operate largely independently, communicating through DMA and dedicated internal interconnects while synchronizing only at specific execution points. Accurately reproducing their execution order, synchronization behavior and timing requires considerable computational resources.

Furthermore, the proprietary extensions and execution semantics of the R5900 differ substantially from conventional x86 and ARM processors, creating significant challenges for dynamic recompilation. Beyond instruction translation itself, many PlayStation 2 titles depend on subtle interactions between otherwise independent hardware blocks. Consequently, interrupt timing, DMA scheduling, VIF/GIF packet processing and bus synchronization are often just as important to compatibility as correct instruction execution. The PS2's heavily parallel design frequently leads to the misconception that its emulation should scale linearly across modern multi-core CPUs. In practice, many hardware components require extremely precise synchronization, limiting how aggressively emulator developers can distribute workloads across threads without introducing timing inaccuracies or race-condition-related bugs.[2]

Vector Units (VU0 / VU1)

The Emotion Engine derives much of its computational performance from its two programmable Vector Units. Within emulation, these processors represent one of the architecture's primary computational bottlenecks, much like the SPUs in PlayStation 3 emulation. Because they execute independently of the main R5900 core while maintaining strict synchronization requirements, reproducing their behavior accurately without sacrificing host performance remains one of the emulator's most demanding tasks.

  • VU0 can operate either as the R5900's COP2 vector coprocessor or independently through its own microprogram execution mode. It was commonly used for matrix mathematics, collision detection, physics calculations (which was vital for the physics-driven design trends of the sixth generation) and general gameplay logic.
  • VU1 is a fully programmable vector processor dedicated primarily to geometry processing. Fed through VIF1, it transforms and prepares vertex data before forwarding command streams to the Graphics Synthesizer through the Graphics Interface (GIF). This forward-thinking programmable geometry pipeline contrasted sharply with contemporary PC graphics cards from NVIDIA and ATI, which relied on rigid, fixed-function pipelines before eventually adopting programmable shaders years later.

Both Vector Units receive data through dedicated Vector Interface (VIF) processors, which unpack DMA streams, perform data conversions and execute microcode commands before dispatching work to the VUs. Correctly reproducing VIF behavior (including DMA interactions, unpacking rules and synchronization semantics) is essential for both rendering accuracy and game logic.

PCSX2 maps many Vector Unit operations onto host SIMD instruction sets such as SSE and AVX to improve performance. One of the project's largest architectural improvements was replacing the older SuperVU implementation with the significantly more accurate microVU recompilers. Additional optimizations such as Multi-Threaded VU (MTVU) and "Instant VU1" were introduced to offset the increased computational cost. However, because the EE's floating-point implementation and vector arithmetic differ substantially from standard IEEE 754 behavior, efficiently translating VU programs still requires handling numerous hardware-specific edge cases.

Floating-Point Accuracy & The "SoftFPU" Solution

A major hurdle in PlayStation 2 emulation is accurately reproducing floating-point behavior. Neither the Emotion Engine FPU nor the Vector Units implement IEEE 754 arithmetic; instead, they exhibit unique behavior for underflows, overflows, rounding and exceptional values such as NaNs and infinities. Even minor inaccuracies can result in exploded geometry, broken collision detection, corrupted animation or failed game logic. [2]

Historically, PCSX2 relied on configurable clamping and rounding modes to approximate hardware behavior. While these database driven per-game compatibility hacks resolved many visual and gameplay issues, they did not faithfully reproduce the hardware.[3][4][5][6]

To eliminate these approximations, developers introduced accurate software implementations of the hardware FPU.

  • SoftFPU (Interpreter): A software implementation that reproduces EE floating-point behavior at the bit level, aims to eliminate many legacy game-specific floating-point hacks. While highly accurate, its interpreted execution incurs a substantial performance penalty, making it impractical as the default floating-point backend for general emulation, although it remains useful for debugging and titles with known floating-point accuracy issues.
    • SoftFPU Recompiler (JIT): A long-term approach that translates SoftFPU semantics directly into optimized native machine code. By preserving accurate floating-point behavior while retaining dynamic recompilation performance, aims making it practical as the default floating-point backend for general emulation. Developer DiscoStarslayer has already experimented with this concept within his pcsx2-reliquary fork.[3]

Subsystems & Security

  • IOP (I/O Processor): A MIPS R3000A core (originally the PlayStation 1 main processor) running at 36.864 MHz or 33.8688 MHz. It manages peripheral communication, file I/O, and backward compatibility. In later slim revisions (SCPH-7500X and onward), it was replaced by a PowerPC 405 core running a MIPS emulation layer.
    • USB Controller: Provides USB 1.1 connectivity for peripherals such as keyboards, mice, microphones, EyeToy cameras, storage devices and specialty controllers. Although the controller itself is well understood, accurate emulation depends on faithfully reproducing USB device behavior and timing. Modern versions of PCSX2 support a broad range of USB peripherals through integrated device emulation.
    • IEEE 1394 (i.LINK): Early PlayStation 2 models included an IEEE 1394 interface intended primarily for multiplayer connectivity. Only a small number of commercial titles utilized the port, making it a relatively low priority for emulator development compared to other subsystems.
    • DEV9C: The expansion interface controller responsible for the network adapter and hard disk drive (HDD) systems. Emulating its sub-registers is documented extensively across historical progress reports.[7][8]
    • CDVD: The PlayStation 2's CD/DVD subsystem is responsible for reading game data from optical media and exposing it to software through the I/O Processor (IOP). The CDVD hardware works alongside several system modules such as `CDVDMAN` and `CDVDFSV`, allowing games to access files, stream assets, and read disc metadata. While optical drive emulation is generally considered a more mature area of PlayStation 2 emulation than the Emotion Engine, Vector Units, or Graphics Synthesizer, accurate CDVD behavior remains important for compatibility. Some titles continuously stream data from disc during gameplay, requiring the emulator to provide data at rates and timings consistent with software expectations. Improper handling of disc reads can lead to loading issues, audio synchronization problems, or streaming-related bugs in affected titles. The PlayStation 2 supported multiple media formats, including CD-ROM, DVD-5, and DVD-9 discs. Internally, PCSX2 emulates the system software interfaces used by games to communicate with the CDVD hardware rather than attempting to model every physical characteristic of the optical drive at a mechanical level. Modern versions generally provide highly compatible CD/DVD emulation, and CDVD behavior is no longer considered one of the primary obstacles to PlayStation 2 emulation.
Media Type Typical Capacity Emulation Considerations
CD-ROM ~650–700 MB May require preservation of raw sector layouts and auxiliary disc data depending on the title.
DVD-5 ~4.7 GB The most common PlayStation 2 format and generally straightforward to emulate.
DVD-9 ~8.5 GB Dual-layer media requiring correct handling of layer transitions and disc layout information.
  • Emotion Engine peripherals
    • IPU (Image Processing Unit): A dedicated hardware MPEG-2 macroblock decoder used primarily for full-motion video (FMV), home media playback, and real-time texture decompression. Because the IPU operates asynchronously alongside the main CPU core, matching its exact decoding throughput and signaling timing is vital. Edge-case and minor bugs in IPU emulation still persist within PCSX2 (skipped or stuttering FMVs, out-of-sync audio during cutscenes, or total system lockups when a game attempts to initialize a movie sequence).
    • SPU2 (Sound Processing Unit 2): A dedicated dual-core audio processor handling digital sound effects, streaming ADPCM audio, and real-time reverb processing. Maintaining tight synchronization loops between the SPU2 and the main CPU (Emotion Engine) represents one of the architecture's complex emulation hurdles.
  • System Controllers & Security
    • MechaCon: A dedicated security microcontroller responsible for console authentication, boot security, optical disc authentication, and coordinating security features such as MagicGate memory card authentication and KELF decryption. Because portions of its operation rely on proprietary cryptographic material, complete emulation presents unique legal and technical challenges.[9][10]
    • MagicGate: Sony's authentication and encryption technology used primarily by PlayStation 2 memory cards. Community projects have implemented varying degrees of MagicGate support, although these generally require user-supplied cryptographic material dumped from original hardware. See the #DVD player and Konami Python 2 sections.
    • Syscon: A dedicated system controller responsible for power management, the real-time clock, thermal monitoring, and coordinating system startup and shutdown. Most commercial software interacts with Syscon only indirectly through the BIOS.

Graphics Synthesizer (GS) & paraLLEl-GS Solution

The Graphics Synthesizer (GS) acts completely differently from traditional graphics card architectures. Commands reach the GS through the Graphics Interface (GIF), which arbitrates multiple rendering paths and packet streams originating from the Emotion Engine and VU1. Correctly emulating GIF packet processing, state tracking, and path interactions is necessary for accurate rendering behavior. Crucial to feeding the GS is the Direct Memory Access Controller (DMAC), which routes data packets across the system bus. On real hardware, games frequently relied on massive, precisely timed bursts of data to transfer vertex textures and geometry data without stalling the processors.

Rather than utilizing a conventional fixed pipeline or complex shader cores, the GS achieved its results through raw, uncompressed fill rate power. It used a massive 2,560-bit internal data bus hooked directly to 4 MB of embedded DRAM (eDRAM), pushing an unprecedented 48 GB/s of bandwidth. This allowed developers to bypass standard hardware bottlenecks and implement intricate visual anomalies such as real-time frame buffer read-modify-write operations, which allowed for visual effects that contemporary PCs struggled to reproduce like the heat-haze distortion in Gran Turismo 3.

Translating this extreme bus width and eDRAM behavior into high-level emulation (with the GSdx renderer) using hardware APIs like DirectX, OpenGL, or Vulkan historically forced PCSX2 to rely on lots of hacks (such as offset hacks, skipdraw functions, and frame-buffer blending approximations). While PCSX2 eventually abandoned its legacy plugin architecture entirely, and internal core GS emulation has significantly improved in recent years with introducing robust solutions for notoriously difficult hardware behaviors like complex alpha blending and render-to-texture targets[11][12], some accuracy and compatibility issues remain. This ongoing reliance on game-specific hacks creates a cumbersome maintenance burden for developers and testers similar to clamping and rounding modes situation, who must constantly update and manage the database-driven compatibility database. On top of that, a notable subset of titles still strictly require a pure CPU Software Renderer to avoid game-breaking visual bugs, forcing a heavy reliance on the host CPU's single-threaded performance, significantly increasing hardware requirements while stripping away modern visual enhancement options such as high-resolution upscaling.

The introduction of paraLLEl-GS represents a major step toward addressing this fundamental issue. Similar to other low-level compute renderers for other projects, paraLLEl-GS reconstructs the GS inside Vulkan compute shaders instead of forcing it through a traditional rasterization pipeline. This approach achieves the absolute precision of a CPU software renderer while simultaneously providing upscaling, super-sampling, and high-performance execution on mainstream GPU hardware. It has been integrated directly into custom standalone builds and the LRPS2 Libretro core.[13]

CRT Output Video Quirks

Main article: Shaders, presets, and filters#6th and 7th Generation (PS2, GameCube, Xbox, Wii, Xbox_360)

The PS2 frequently leveraged standard-definition CRT video techniques to save memory or compensate for performance limits. Techniques included aggressive dithering patterns, low color depth channels, inter-field blurring (proto-FXAA), non-standard vertical resolutions and continuous interlacing. When outputted onto high-definition flat panels, these features result in noticeable pixel combing and a loss of visual characteristics of the PlayStation 2.[14] Consequently, modern emulation depends heavily on enhancement implementations like post-processing layers, advanced deinterlacing algorithms and comprehensive shader injection frameworks like `librashader` to simulate those visual characteristics. Projects like paraLLEl-GS's CRT simulation aim to natively handle most of these cleanly.[15]

For more information about PlayStation 2 hardware and its reverse engineering;

  1. https://github.com/xemu-project/xemu/blob/master/target/i386/ops_sse.h
    https://github.com/xemu-project/xemu/tree/master/hw/xbox/nv2a
    https://github.com/xemu-project/xemu/blob/master/hw/xbox/xbox_pci.c#L47
  2. https://forums.pcsx2.net/Thread-Why-is-PCSX2-slow
  3. https://wiki.pcsx2.net/PCSX2_Documentation/Nightmare_on_Floating-Point_Street
  4. https://github.com/PSI-Rockin/DobieStation/issues/51
  5. https://github.com/PCSX2/pcsx2/issues/2990
  6. https://github.com/PCSX2/pcsx2/issues/5137
  7. https://pcsx2.net/blog/2025/pcsx2-2.4_2.2/#dev9-fixes
  8. https://pcsx2.net/blog/2023/q1-2022-progress-report#dev9
  9. https://github.com/PCSX2/pcsx2/pull/4274#issuecomment-795316629
  10. https://github.com/PCSX2/pcsx2/pull/10836#issuecomment-1954866179
  11. https://pcsx2.net/blog/2021/q3-2021-progress-report#gs-improvements https://pcsx2.net/blog/2022/q4-2021-progress-report#gs-improvements https://pcsx2.net/blog/2023/q1-2022-progress-report#gs-improvements https://pcsx2.net/blog/2025/pcsx2-2.4_2.2/#will-it-blend https://pcsx2.net/blog/2025/pcsx2-2.4_2.2/#rt-in-rt-support https://github.com/PCSX2/pcsx2/pull/13795 https://github.com/PCSX2/pcsx2/pull/13681 https://github.com/PCSX2/pcsx2/pull/13792 https://github.com/PCSX2/pcsx2/pull/13754 https://github.com/PCSX2/pcsx2/pull/13854 https://github.com/PCSX2/pcsx2/pull/13923
  12. https://pcsx2.net/blog/tags/progress-report/
  13. https://themaister.net/blog/2024/07/03/playstation-2-gs-emulation-the-final-frontier-of-vulkan-compute-emulation/
  14. https://www.libretro.com/index.php/playstation2-and-the-crt-tv/
  15. https://themaister.net/blog/2026/05/09/emulating-old-junk-from-yesteryear-or-my-obsession-making-native-resolution-ps2-emulation-look-good/