Graphics pipeline from Windows VM(guest) to physical GPU on the host

Render Graphics on Guest Windows VM from physical GPU on host.
Graphics Pipeline UMD(User Mode Driver)
  Developer writes the Application using openGL APIs(old styled) or using modern apps(using Direct 3D/12) APIs
  Zink(from Mesa) for openGL & DX12 Translator for Direct3D/12 are used for translation of commands to Vulkan
  Vulkan ICD converts vulkan commands to serilization stream
  Venus Client serialized the commands to venus protocol stream

KMD(Kernel Mode Driver)
  WDDM Miniport: Venus stream reaches kernel mode in Guest VM.
  Venus stream reaches VirtIO GPU via scheduler & resource manager

Hypervisor:
QEMU recieves the venus stream. Provides shared memory rings(virtqueues) for rendering

Host OS:
Virglrenderer: This is loaded by QEMU. Provides 2 main rendering backends(1. Virgl(for OpenGL virtulization), 2. Venus (for Vulkan virtualization))

Vulkan: This is graphics most recent rendering library provided by Khronos Group

This flow can be refined

From Guest VM to Host Host to Guest VM

Windows App (D3D/GL)
   ↓ openGL API calls
[UMD: vkd3d-proton / Zink]
   ↓ (Vulkan commands)
[Venus Client]
   ↓ (Venus stream)
[VioGPU KMD → VirtIO]
   ↓ (VirtIO transport)
[QEMU VirtIO-GPU]
   ↓ (Venus stream)
[Virglrenderer (Venus Server)]
   ↓ (Vulkan commands)
[Host Vulkan Driver → GPU]
            

[QEMU VirtIO-GPU device]
   │ (transports → Venus stream)
[Virglrenderer + Venus Server]
   │ (de-serializes → Vulkan)
[Host Vulkan Driver]
   │ (executes → GPU)
[Physical GPU Hardware]
   │
[Framebuffer → VirtIO-GPU]
   │ (returns → Guest display)
[Windows DWM → Desktop Output]
          

Pipeline Stages

Terms: VirtIO, openGL, Vulkan

Stage Process Runs inside
1. Convert Windows Direct3D/OpenGL commands into Vulkan commands

        Windows VM(Windows Apps)
               \/
          calls openGL APIs
                \/
          UMD(User-Mode Driver) intercept API calls
                \/                        \/
                vkd3d-proton(for D3D)   Zink(for GL)
                    | convert to vulkan APIs |
                    |------|          |------|
                           \/        \/
                           vulkan command stream
      
guest Windows VM (user space)
2. Vulkan commands stream to binary stream for the hypervisor

                vulkan command stream
                        \/
                    Venus Client
                        \/
                    Venus Stream(binary format optimized for VirtIO transport)
                       
            
guest Windows VM (user space)
3. Deliver stream to host


              |-------- Guest VM (Windows) -------------------------------------|
              |      Venus Stream(binary format optimized for VirtIO transport) |
              |         \/                                                      |
              |     VirtIO buffer object                                        |
              |----------|------------------------------------------------------|
                        \/
                  |-------------------|      
                  |   VirtIO I/O ring |
                  | shared memory     |
                  |------|------------|
                         \/stream
              |---------------- Host OS (kernel)--------------------------------|
              |                                                                 |
              |-----------------------------------------------------------------|
            
Host OS