Skip to content

[Bug]: Virtual Display not attached to desktop on Windows ARM (Snapdragon X) – not visible via DXGI / EnumDisplayMonitors #483

@rohitsangwan01

Description

@rohitsangwan01

Which OS?

Win11 Pro

Which release?

24H2

Driver Version

latest

Device Specifications

OS: Windows 11 ARM64
Device: Snapdragon X (Adreno X1-45 GPU)
Driver: Virtual Display Driver (latest from this repo)
Architecture: Native ARM64 build

Describe the bug

On Windows 11 ARM (Snapdragon X / Adreno GPU), the Virtual Display Driver successfully creates a display device and monitor, but it is not attached to the desktop.

As a result:

  • The display does NOT appear in:

    • EnumDisplayMonitors
    • DXGI (IDXGIAdapter::EnumOutputs)
    • Higher-level libraries like display-info
  • But it does appear in:

    • EnumDisplayDevices

This suggests the display exists but is not promoted to an active desktop output.

Observed Behavior

With Virtual Display Enabled

  • EnumDisplayDevices:

    • Shows \\.\DISPLAY8

    • Description: Virtual Display Driver

    • Monitor present:

      \\.\DISPLAY8\Monitor0
      Generic PnP Monitor
      Flags: 0x2
      
  • EnumDisplayMonitors:

    Total monitors: 1
    (only primary display)
    
  • ❌ DXGI:

    Adapter 0: Qualcomm(R) Adreno(TM) X1-45 GPU
      Output 0: \\.\DISPLAY1
    
  • display-info crate:

    Found 1 displays
    

Key Finding

The virtual display is present but not attached to the desktop.

From EnumDisplayDevices:

  • Primary display:

    Flags: 0x5  (attached + active)
    
  • Virtual display:

    Flags: 0x2  (NOT attached to desktop)
    

This explains why all modern APIs ignore it.


Additional Notes

  • Windows Settings UI can show the display
  • But it is not treated as an active desktop output
  • Issue reproducible consistently on ARM64, but not on x86

Thanks for the great project 👍

Steps to reproduce

No response

Expected behavior

No response

Log File

Here is log Output from my debug program

=== SYSTEM INFO ===
ARCH: aarch64
OS: windows
Pointer Width: 64-bit
=== display-info crate ===
Found 1 displays
#0: DisplayInfo { id: 2776250164, raw_handle: HMONITOR(65537), x: 0, y: 0, width: 1440, height: 810, rotation: 0.0, scale_factor: 2.0, frequency: 120.0, is_primary: true }



Before Adding Virtual Display


Win32: EnumDisplayMonitors
Monitor 1: \.\DISPLAY1
Total monitors: 1



=== Win32: EnumDisplayDevices ===
Adapter 0:
Name: \.\DISPLAY1
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x5
Monitor 0:
Name: \.\DISPLAY1\Monitor0
Desc: Generic PnP Monitor
Flags: 0x3
Adapter 1:
Name: \.\DISPLAY2
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x0
Adapter 2:
Name: \.\DISPLAY3
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x0
Adapter 3:
Name: \.\DISPLAY4
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x0
Adapter 4:
Name: \.\DISPLAY5
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x0
Adapter 5:
Name: \.\DISPLAY6
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x0
Adapter 6:
Name: \.\DISPLAY7
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x0
Adapter 7:
Name: \.\DISPLAY8
Desc: Virtual Display Driver
Flags: 0x0



DXGI
Adapter 0: Qualcomm(R) Adreno(TM) X1-45 GPU
Output 0: \.\DISPLAY1
Desktop Coords: left=0 top=0 right=1440 bottom=810
Attached: true
Adapter 1: Qualcomm(R) Adreno(TM) X1-45 GPU
Adapter 2: Microsoft Basic Render Driver





After Adding Virtual Display



=== Win32: EnumDisplayMonitors ===
Monitor 1: \.\DISPLAY1
Total monitors: 1



=== Win32: EnumDisplayDevices ===
Adapter 0:
Name: \.\DISPLAY1
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x5
Monitor 0:
Name: \.\DISPLAY1\Monitor0
Desc: Generic PnP Monitor
Flags: 0x3
Adapter 1:
Name: \.\DISPLAY2
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x0
Adapter 2:
Name: \.\DISPLAY3
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x0
Adapter 3:
Name: \.\DISPLAY4
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x0
Adapter 4:
Name: \.\DISPLAY5
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x0
Adapter 5:
Name: \.\DISPLAY6
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x0
Adapter 6:
Name: \.\DISPLAY7
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x0
Adapter 7:
Name: \.\DISPLAY8
Desc: Virtual Display Driver
Flags: 0x0
Monitor 0:
Name: \.\DISPLAY8\Monitor0
Desc: Generic PnP Monitor
Flags: 0x2



=== DXGI ===
Adapter 0: Qualcomm(R) Adreno(TM) X1-45 GPU
Output 0: \.\DISPLAY1
Desktop Coords: left=0 top=0 right=1440 bottom=810
Attached: true
Adapter 1: Qualcomm(R) Adreno(TM) X1-45 GPU
Adapter 2: Microsoft Basic Render Driver




===================== WITH VDD ===================================

C:\Users\nbehn\Downloads>arm_display_test.exe
=== SYSTEM INFO ===
ARCH: aarch64
OS: windows
Pointer Width: 64-bit
=== display-info crate ===
Found 1 displays
#0: DisplayInfo { id: 2776250164, raw_handle: HMONITOR(65537), x: 0, y: 0, width: 1440, height: 810, rotation: 0.0, scale_factor: 2.0, frequency: 120.0, is_primary: true }

====================================================

=== Win32: EnumDisplayMonitors ===
Monitor 1: \.\DISPLAY1
Total monitors: 1

====================================================

=== Win32: EnumDisplayDevices ===
Adapter 0:
Name: \.\DISPLAY1
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x5
Monitor 0:
Name: \.\DISPLAY1\Monitor0
Desc: Generic PnP Monitor
Flags: 0x3
Adapter 1:
Name: \.\DISPLAY2
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x0
Adapter 2:
Name: \.\DISPLAY3
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x0
Adapter 3:
Name: \.\DISPLAY4
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x0
Adapter 4:
Name: \.\DISPLAY5
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x0
Adapter 5:
Name: \.\DISPLAY6
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x0
Adapter 6:
Name: \.\DISPLAY7
Desc: Qualcomm(R) Adreno(TM) X1-45 GPU
Flags: 0x0
Adapter 7:
Name: \.\DISPLAY8
Desc: Virtual Display Driver
Flags: 0x0
Monitor 0:
Name: \.\DISPLAY8\Monitor0
Desc: Generic PnP Monitor
Flags: 0x2

====================================================

=== DXGI ===
Adapter 0: Qualcomm(R) Adreno(TM) X1-45 GPU
Output 0: \.\DISPLAY1
Desktop Coords: left=0 top=0 right=1440 bottom=810
Attached: true
Adapter 1: Qualcomm(R) Adreno(TM) X1-45 GPU
Adapter 2: Microsoft Basic Render Driver

====================================================

Done.

Press 'q' then Enter to exit...

Contact Details

No response

Metadata

Metadata

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions