Looking Glass Host not finding iGPU

Note: Links in code tags because I’m apparently not allowed to post links

When I try to start the looking glass host on the W10 Guest machine using GVT-G (iGPU Passthrough), I don’t get any errors in the terminal, it appears to start but it actually doesn’t, here is a paste of the logfiles however which do contain the actual errors:

http://hastebin.com/xerejarupu.less

This is the furthest I was able to get:
https://cdn.discordapp.com/attachments/677483619920510976/882343594365698083/unknown.png

Here is the full xml config for the VM:

<domain type="kvm">
  <name>Windoze_GVT</name>
  <uuid>3c5e73bd-fba0-4cf0-b024-a38814cc8d90</uuid>
  <title>Windoze GVT</title>
  <description>Windoze 10 With GVT-G</description>
  <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-6.1">hvm</type>
    <loader readonly="yes" type="pflash">/usr/share/edk2-ovmf/x64/OVMF_CODE.fd</loader>
    <nvram>/var/lib/libvirt/qemu/nvram/Windoze_GVT_VARS.fd</nvram>
    <boot dev="hd"/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <hyperv>
      <relaxed state="on"/>
      <vapic state="on"/>
      <spinlocks state="on" retries="8191"/>
    </hyperv>
    <vmport state="off"/>
  </features>
  <cpu mode="host-model" check="partial"/>
  <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="file" device="disk">
      <driver name="qemu" type="raw"/>
      <source file="/home/rabcor/Windoze/vm-files/Windoze.img"/>
      <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="sata" index="0">
      <address type="pci" domain="0x0000" bus="0x00" slot="0x1f" function="0x2"/>
    </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-to-pci-bridge">
      <model name="pcie-pci-bridge"/>
      <address type="pci" domain="0x0000" bus="0x06" slot="0x00" function="0x0"/>
    </controller>
    <controller type="virtio-serial" index="0">
      <address type="pci" domain="0x0000" bus="0x03" slot="0x00" function="0x0"/>
    </controller>
    <interface type="network">
      <mac address="52:54:00:cb:a9:1d"/>
      <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="qxl" ram="65536" vram="65536" vgamem="16384" heads="1" primary="yes"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x0"/>
    </video>
    <hostdev mode="subsystem" type="mdev" managed="no" model="vfio-pci" display="off">
      <source>
        <address uuid="71abd338-d32e-4a56-8f9a-5830d16a2828"/>
      </source>
      <address type="pci" domain="0x0000" bus="0x05" slot="0x00" function="0x0"/>
    </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">512</size>
      <address type="pci" domain="0x0000" bus="0x07" slot="0x01" function="0x0"/>
    </shmem>
  </devices>
</domain>

Edit: I have the drivers installed.
https://cdn.discordapp.com/attachments/677483619920510976/891730955964928020/unknown.png
https://cdn.discordapp.com/attachments/677483619920510976/891756645275795546/unknown.png

Pointless information (I was stupid)

Note: I was an idiot and forgot to properly follow the install instructions to the end for looking glass client. If you have any of the below issues, make sure you followed the steps for shared memory file permissions here:

https://looking-glass.io/docs/stable/install/#client

On the host I also can’t turn on the looking glass client normally; I get these errors:

[E]    740717104           ivshmem.c:157  | ivshmemOpenDev                 | Failed to open: /dev/shm/looking-glass
[E]    740717107           ivshmem.c:158  | ivshmemOpenDev                 | Permission denied
[E]    740717109              main.c:711  | lg_run                         | Failed to map memory

Not sure how smart that is, but if I change ownership of /dev/shm/looking-glass to my user, I can launch the looking glass client, but it’s sorta meaningless if the host isn’t working, changing group ownership over the file to a group my user is part of was not enough.
I tried setting up the VM again but with libvirt this time instead of launching qemu via commandline to see if the situation would improve but it is the same, although after changing ownership of /dev/shm/looking-glass I can no longer launch the VM, it will give me this error when I launch the VM:

 Error starting domain: internal error: qemu unexpectedly closed the monitor: 2021-09-26T15:46:19.002233Z qemu-system-x86_64: can't open backing store /dev/shm/looking-glass for guest RAM: Permission denied

Traceback (most recent call last):
  File "/usr/share/virt-manager/virtManager/asyncjob.py", line 65, in cb_wrapper
    callback(asyncjob, *args, **kwargs)
  File "/usr/share/virt-manager/virtManager/asyncjob.py", line 101, in tmpcb
    callback(*args, **kwargs)
  File "/usr/share/virt-manager/virtManager/object/libvirtobject.py", line 57, in newfn
    ret = fn(self, *args, **kwargs)
  File "/usr/share/virt-manager/virtManager/object/domain.py", line 1329, in startup
    self._backend.create()
  File "/usr/lib/python3.9/site-packages/libvirt.py", line 1353, in create
    raise libvirtError('virDomainCreate() failed')
libvirt.libvirtError: internal error: qemu unexpectedly closed the monitor: 2021-09-26T15:46:19.002233Z qemu-system-x86_64: can't open backing store /dev/shm/looking-glass for guest RAM: Permission denied

Looks like the same issue as this:

Seeing as this is the second report without drivers on the Window side I’m starting to doubt myself if they are necessary. But it wouldn’t make sense for me if they weren’t since how else would you even use the GPU properly?

But I do have the drivers installed…

https://cdn.discordapp.com/attachments/677483619920510976/891730955964928020/unknown.png

Also this is not a duplicate, his setup is entirely different (besides a different gpu vendor, there’s also the fact he actually doesn’t have drivers installed) it’s just that the host logs are giving similar errors.

Hm that’s odd… the reason I was saying that was because

Device Descripion: Microsoft Basic Render Driver

Which if the iGPU driver was loaded properly should state Intel and the GPU model, no? Am I mixing things here?

Yeah, it is odd. And this is the first time I try to use looking glass so I don’t really know what it should be displaying, just that it isn’t working.

Guess this answers why though, looking glass is not trying to use the iGPU, so surely it has to be a configuration issue somewhere right?

Means your iGPU isn’t passed in correctly/ or you haven’t installed it’s driver (if it is).

The shmem device is just a piece of memory where the Linux client app can read the framebuffer data deposited by the piece of software running in the VM; it needs to be accessible by yourself/your user that’s running the client app that shows you the data, as well as the Linux user that’s running qemu daemon in order to be able to pass it along to the VM as a kind of a pci attached external memory device.

Once windows guest detects this device, it’ll need drivers in order to expose it to looking glass software that can then configure/use the GPU to dump frame data into this memory.


So,

Step 1 should really be “make sure you’re passing the GPU correctly and that it’s working from the windows guest VM without looking glass stuff”. (e.g. Linux host binds the vfio driver to it that qemu can pass through to guest, instead of a Linux graphics/video driver… and make sure this guest GPU is working and you get display output on the physical output of the guest GPU).

Step 2. Do all the looking glass stuff.

Can you confirm step 1 is working for you ?
i.e. is windows able to use the passthrough GPU without any shmem and looking glass stuff, just qemu/and or libvirt that ends up controlling qemu? … and you get close to bare metal 3d performance and you’re happy with the setup?

2 Likes

Well as displayed in the screenshot earlier, yes. I have correctly passed through the iGPU, installed the drivers, and confirmed the drivers are working and the device is show in the device manager.

I did some tests using freerdp and it was working, but I’m not happy with the setup because I couldn’t get any spice or rdp client to display at 60fps (not to mention that on freerdp which gave me the best performance I had to deal with ungodly amounts of tearing), which is why I am now trying to use looking glass to get a better experience.

Also I fixed the initial issues with ivshmem I was having on the host/in virt manager, I was just a big dummy and missed a step in the installation instructions.

I’m confused why you need to use looking-glass after using GVT-G.

Can you guide me on how to install nvidia drivers in qemu virtual windows.

nvidi driver installer prompts nvidia gpu not detected, and stops installation

You install them the same way you would on windows.

If you get errors it’s because you didn’t passthrough your gpu correctly. How to passthrough your gpu correctly is not really a looking glass thing. Try: https://forum.level1techs.com/t/vfio-in-2019-pop-os-how-to-general-guide-though-draft/142287

Oh, I always thought looking-glass and the host shared a gpu.

If I needed two gpus, I would consider the other one.