Looking glass mysteriously not producing any image

Everything appears like it should be working as far as I can tell, but when I run the looking glass client I just get the looking glass logo, it doesn’t record any image from the windows guest.

Below are some outputs/logs

From Linux (Host):

$ looking-glass-client 
[I]   7368406642              main.c:1785 | main                           | Looking Glass (B6)
[I]   7368406662              main.c:1786 | main                           | Locking Method: Atomic
[I]   7368406838           cpuinfo.c:37   | lgDebugCPU                     | CPU Model: AMD Ryzen 9 6900HX with Radeon Graphics
[I]   7368406841           cpuinfo.c:38   | lgDebugCPU                     | CPU: 1 sockets, 8 cores, 16 threads
[I]   7368419793              main.c:1162 | lg_run                         | Using font: /usr/share/fonts/TTF/DejaVuSansMono.ttf
[I]   7368419861           ivshmem.c:128  | ivshmemOpenDev                 | KVMFR Device     : /dev/shm/looking-glass
[I]   7368427739             audio.c:159  | audio_init                     | Using AudioDev: PipeWire
[I]   7368427784                ps.c:245  | purespice_connect              | Connecting to socket 127.0.0.1:5900
[I]   7368437705               rsa.c:178  | rsa_encryptPassword            | Using Nettle
[I]   7368438291                ps.c:268  | purespice_connect              | Connected
[I]   7368438440             agent.c:103  | agent_connect                  | Connected to the spice guest agent
[I]   7368438497      channel_main.c:167  | onMessage_mainName             | Guest name: Windoze
[I]   7368438527      channel_main.c:183  | onMessage_mainUUID             | Guest UUID: 3a4df2c2-34e2-4294-99e2-8a36009b2ae9
[I]   7368447424                ps.c:644  | ps_connectChannel              | RECORD channel connected
[I]   7368455235                ps.c:644  | ps_connectChannel              | PLAYBACK channel connected
[I]   7368462939                ps.c:644  | ps_connectChannel              | INPUTS channel connected
[I]   7368463049           channel.c:312  | onMessage_notify               | [notify] keyboard channel is insecure
[I]   7368463130               egl.c:267  | egl_initialize                 | Double buffering is off
[I]   7368463145              main.c:1116 | tryRenderer                    | Using Renderer: EGL
[I]   7368464458               x11.c:230  | x11CheckEWMHSupport            | EWMH-complient window manager detected: KWin
[I]   7368464557               x11.c:463  | x11Init                        | X11 XInput 2.0 in use
[I]   7368468616               x11.c:1433 | x11GetEGLDisplay               | Using eglGetPlatformDisplayEXT
[I]   7368521265               egl.c:745  | egl_renderStartup              | Multisampling enabled, max samples: 4
[I]   7368522175               egl.c:828  | egl_renderStartup              | Single buffer mode
[I]   7368523995               egl.c:855  | egl_renderStartup              | EGL     : 1.5
[I]   7368524020               egl.c:856  | egl_renderStartup              | Vendor  : AMD
[I]   7368524048               egl.c:857  | egl_renderStartup              | Renderer: AMD Radeon Graphics (rembrandt, LLVM 14.0.6, DRM 3.49, 6.1.1-1-MANJARO)
[I]   7368524071               egl.c:858  | egl_renderStartup              | Version : OpenGL ES 3.2 Mesa 22.3.1
[I]   7368524098               egl.c:859  | egl_renderStartup              | EGL APIs: OpenGL OpenGL_ES 
[I]   7368524130               egl.c:930  | egl_renderStartup              | Debug messages disabled, enable with egl:debug=true
[I]   7368557822           eglutil.c:35   | swapWithDamageInit             | Using EGL_KHR_swap_buffers_with_damage
[I]   7368755326              main.c:1566 | lg_run                         | Guest Information:
[I]   7368755367              main.c:1567 | lg_run                         | Version  : B6
[I]   7368755391              main.c:1588 | lg_run                         | UUID     : 3a4df2c2-34e2-4294-99e2-8a36009b2ae9
[I]   7368755445              main.c:1597 | lg_run                         | CPU Model: AMD Ryzen 9 6900HX with Radeon Graphics
[I]   7368755473              main.c:1598 | lg_run                         | CPU      : 4 sockets, 4 cores, 4 threads
[I]   7368755502              main.c:1600 | lg_run                         | Using    : DXGI Direct3D 11
[I]   7368755530              main.c:1636 | lg_run                         | OS       : Windows
[I]   7368755555              main.c:1638 | lg_run                         | OS Name  : Windows 10 Enterprise LTSC 2021 (Build: 19044) 
[I]   7368755580              main.c:1660 | lg_run                         | Starting session
[I]   7513525301           channel.c:258  | channel_internal_disconnect    | PLAYBACK channel disconnected
[I]   7513525409           channel.c:258  | channel_internal_disconnect    | RECORD channel disconnected
[I]   7513638783           channel.c:258  | channel_internal_disconnect    | MAIN channel disconnected
[I]   7513638862           channel.c:258  | channel_internal_disconnect    | INPUTS channel disconnected
[I]   7513638932                ps.c:550  | purespice_process              | Shutdown

From Windows (looking-glass-host.txt)

[I]      9047402              time.c:85   | windowsSetTimerResolution      | System timer resolution: 488.2 μs
[I]      9048847               app.c:771  | app_main                       | Looking Glass Host (B6)
[I]      9049917           cpuinfo.c:37   | lgDebugCPU                     | CPU Model: AMD Ryzen 9 6900HX with Radeon Graphics
[I]      9051184           cpuinfo.c:38   | lgDebugCPU                     | CPU: 4 sockets, 4 cores, 4 threads
[I]      9052946           ivshmem.c:132  | ivshmemInit                    | IVSHMEM 0* on bus 0x6, device 0x1, function 0x0
[I]      9058439               app.c:788  | app_main                       | IVSHMEM Size     : 64 MiB
[I]      9059096               app.c:789  | app_main                       | IVSHMEM Address  : 0x2A80000
[I]      9059441               app.c:790  | app_main                       | Max Pointer Size : 1024 KiB
[I]      9059784               app.c:791  | app_main                       | KVMFR Version    : 19
[I]      9060121               app.c:809  | app_main                       | Trying           : DXGI
[I]      9065592              dxgi.c:390  | dxgi_init                      | Device Name       : \\.\DISPLAY1
[I]      9066033              dxgi.c:391  | dxgi_init                      | Device Description: NVIDIA GeForce RTX 3070 Ti Laptop GPU
[I]      9066542              dxgi.c:392  | dxgi_init                      | Device Vendor ID  : 0x10de
[I]      9066940              dxgi.c:393  | dxgi_init                      | Device Device ID  : 0x24a0
[I]      9067280              dxgi.c:394  | dxgi_init                      | Device Video Mem  : 8031 MiB
[I]      9067677              dxgi.c:395  | dxgi_init                      | Device Sys Mem    : 0 MiB
[I]      9068062              dxgi.c:396  | dxgi_init                      | Shared Sys Mem    : 8190 MiB
[I]      9209871              dxgi.c:503  | dxgi_init                      | Feature Level     : 0xc100
[I]      9210299              dxgi.c:504  | dxgi_init                      | Capture Size      : 1024 x 768
[I]      9212812              dxgi.c:505  | dxgi_init                      | AcquireLock       : enabled
[I]      9213169              dxgi.c:506  | dxgi_init                      | Debug mode        : disabled
[I]      9214759              dxgi.c:598  | dxgi_init                      | Source Format     : DXGI_FORMAT_B8G8R8A8_UNORM
[I]      9215192              dxgi.c:640  | dxgi_init                      | Request Size      : 1024 x 768
[I]      9216069              dxgi.c:658  | dxgi_init                      | Output Size       : 1024 x 768
[I]      9216493              dxgi.c:666  | dxgi_init                      | Copy backend      : Direct3D 11
[I]      9216923              dxgi.c:667  | dxgi_init                      | Damage-aware copy : enabled
[I]      9217274               app.c:834  | app_main                       | Using            : DXGI Direct3D 11
[I]      9217695               app.c:835  | app_main                       | Capture Method   : Asynchronous
[I]      9219225               app.c:687  | lgmpSetup                      | Max Frame Size   : 30 MiB
[I]      9219638               app.c:385  | captureStop                    | ==== [ Capture Stop ] ====
[I]     24999628              dxgi.c:390  | dxgi_init                      | Device Name       : \\.\DISPLAY1
[I]     25000302              dxgi.c:391  | dxgi_init                      | Device Description: NVIDIA GeForce RTX 3070 Ti Laptop GPU
[I]     25001133              dxgi.c:392  | dxgi_init                      | Device Vendor ID  : 0x10de
[I]     25001586              dxgi.c:393  | dxgi_init                      | Device Device ID  : 0x24a0
[I]     25001924              dxgi.c:394  | dxgi_init                      | Device Video Mem  : 8031 MiB
[I]     25002325              dxgi.c:395  | dxgi_init                      | Device Sys Mem    : 0 MiB
[I]     25002713              dxgi.c:396  | dxgi_init                      | Shared Sys Mem    : 8190 MiB
[I]     25536270              dxgi.c:503  | dxgi_init                      | Feature Level     : 0xc100
[I]     25536712              dxgi.c:504  | dxgi_init                      | Capture Size      : 1024 x 768
[I]     25537071              dxgi.c:505  | dxgi_init                      | AcquireLock       : enabled
[I]     25537412              dxgi.c:506  | dxgi_init                      | Debug mode        : disabled
[I]     25551594              dxgi.c:598  | dxgi_init                      | Source Format     : DXGI_FORMAT_B8G8R8A8_UNORM
[I]     25552225              dxgi.c:640  | dxgi_init                      | Request Size      : 1024 x 768
[I]     25553252              dxgi.c:658  | dxgi_init                      | Output Size       : 1024 x 768
[I]     25553613              dxgi.c:666  | dxgi_init                      | Copy backend      : Direct3D 11
[I]     25553974              dxgi.c:667  | dxgi_init                      | Damage-aware copy : enabled
[I]     25554323               app.c:379  | captureStart                   | ==== [ Capture Start ] ====
[I]     25554743               app.c:312  | frameThread                    | Frame thread started

From Windows (looking-glass-host-service.txt)

[2023-01-14 04:24:30] Startup

And the full virt-manager xml for the qemu VM:

XML
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
  virsh edit Windoze
or other application using the libvirt API.
-->

<domain type='kvm'>
  <name>Windoze</name>
  <uuid>3a4df2c2-34e2-4294-99e2-8a36009b2ae9</uuid>
  <metadata>
    <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
      <libosinfo:os id="http://microsoft.com/win/10"/>
    </libosinfo:libosinfo>
  </metadata>
  <memory unit='KiB'>16777216</memory>
  <currentMemory unit='KiB'>16777216</currentMemory>
  <vcpu placement='static'>8</vcpu>
  <os>
    <type arch='x86_64' machine='pc-q35-7.2'>hvm</type>
    <loader readonly='yes' type='pflash'>/usr/share/edk2/x64/OVMF_CODE.fd</loader>
    <nvram>/var/lib/libvirt/qemu/nvram/Windoze_VARS.fd</nvram>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <hyperv mode='custom'>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='8191'/>
    </hyperv>
    <vmport state='off'/>
  </features>
  <cpu mode='host-passthrough' check='none' migratable='on'/>
  <clock offset='localtime'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
    <timer name='hypervclock' present='yes'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type='block' device='disk'>
      <driver name='qemu' type='raw' cache='none' io='native' discard='unmap'/>
      <source dev='/dev/nvme0n1'/>
      <target dev='sda' bus='sata'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0' model='qemu-xhci' ports='15'>
      <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
    </controller>
    <controller type='pci' index='0' model='pcie-root'/>
    <controller type='pci' index='1' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='1' port='0x10'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0' multifunction='on'/>
    </controller>
    <controller type='pci' index='2' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='2' port='0x11'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x1'/>
    </controller>
    <controller type='pci' index='3' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='3' port='0x12'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x2'/>
    </controller>
    <controller type='pci' index='4' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='4' port='0x13'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x3'/>
    </controller>
    <controller type='pci' index='5' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='5' port='0x14'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x4'/>
    </controller>
    <controller type='pci' index='6' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='6' port='0x15'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x5'/>
    </controller>
    <controller type='pci' index='7' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='7' port='0x16'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x6'/>
    </controller>
    <controller type='pci' index='8' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='8' port='0x17'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x7'/>
    </controller>
    <controller type='pci' index='9' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='9' port='0x18'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0' multifunction='on'/>
    </controller>
    <controller type='pci' index='10' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='10' port='0x19'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x1'/>
    </controller>
    <controller type='pci' index='11' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='11' port='0x1a'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x2'/>
    </controller>
    <controller type='pci' index='12' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='12' port='0x1b'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x3'/>
    </controller>
    <controller type='pci' index='13' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='13' port='0x1c'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x4'/>
    </controller>
    <controller type='pci' index='14' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='14' port='0x1d'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x5'/>
    </controller>
    <controller type='sata' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
    </controller>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
    </controller>
    <controller type='pci' index='15' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='15' port='0x1e'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x6'/>
    </controller>
    <controller type='pci' index='16' model='pcie-to-pci-bridge'>
      <model name='pcie-pci-bridge'/>
      <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
    </controller>
    <interface type='network'>
      <mac address='52:54:00:1d:9a:fb'/>
      <source network='default'/>
      <model type='e1000e'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='spicevmc'>
      <target type='virtio' name='com.redhat.spice.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <input type='tablet' bus='usb'>
      <address type='usb' bus='0' port='1'/>
    </input>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='spice' autoport='yes'>
      <listen type='address'/>
      <image compression='off'/>
    </graphics>
    <sound model='ich9'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x1b' function='0x0'/>
    </sound>
    <audio id='1' type='spice'/>
    <video>
      <model type='none'/>
    </video>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
        <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
      </source>
      <rom bar='off'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0' multifunction='on'/>
    </hostdev>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
        <address domain='0x0000' bus='0x01' slot='0x00' function='0x1'/>
      </source>
      <rom bar='off'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </hostdev>
    <redirdev bus='usb' type='spicevmc'>
      <address type='usb' bus='0' port='2'/>
    </redirdev>
    <redirdev bus='usb' type='spicevmc'>
      <address type='usb' bus='0' port='3'/>
    </redirdev>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    </memballoon>
    <shmem name='looking-glass'>
      <model type='ivshmem-plain'/>
      <size unit='M'>64</size>
      <address type='pci' domain='0x0000' bus='0x10' slot='0x01' function='0x0'/>
    </shmem>
  </devices>
</domain>

First, your VM is misconfigured:

CPU: 4 sockets, 4 cores, 4 threads

That’s not your CPU mapping.

Also, One of the leading reasons that users get black screen in LG is that they do not have a dummy plug connected to their pass-through GPU. Do you have one or maybe a monitor input connected to your pass-through GPU?

I’ve reconfigured the CPU but i doubt that was the problem, my first order of business was getting the vga passthrough working, everything else is just optimization i don’ tfeel i should bother with till i confirm everything is actually working.

I’m on a multiplexed laptop, not sure what that tells you about my setup, but since it’s capable of running on just the dgpu, just the igpu or anything inbetween i imagine i shouldn’t need a dummy plug.

I did not get a black screen, i jsut got the looking glass logo, like it was loading.

The issue you are facing is not a Looking-Glass issue, but rather a Windows one. Windows will not render on the passed-through GPU unless it has something connected to it that presents a valid EDID to the OS. Muxed laptops that can either connect to the iGPU or the dGPU, but not both at the same time will currently not work with LG and as you are viewing your iGPU output for the Linux host, your dGPU is not connected to anything and Windows will not render on it. The only way to do it is to “fool” Windows into thinking that something is actually hooked up there. This is done by a special driver called IDD. There are no free reliable IDD’s out there that I know of. Our lead dev is now considering adding such a feature to LG, but it will take a while till this will be included in the project.

1 Like

Thanks!

In the meantime though are there any non-free IDDs you would recommend?