Skip to content
View in the app

A better way to browse. Learn more.

Unraid

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Can't create VM with "egl-headless" graphical framebuffer

Featured Replies

Hi all,

 

I'm trying to create a VM that uses "egl-headless" graphical framebuffer, combined with VNC or Spice to enable hardware acceleration on the guest with a mediated device (iGPU).

I've followed this guide: https://wiki.archlinux.org/title/Intel_GVT-g

 

As far as I know, starting from Unraid 6.10, QEMU has been compiled with OpenGL support, therefore this should be possible.

 

This is the xml for the VM:

<?xml version='1.0' encoding='UTF-8'?>
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  <name>MacOS Monterey</name>
  <uuid>91b82c42-f5a2-424f-b45f-714ed7c190de</uuid>
  <description>MacOS Monterey</description>
  <metadata>
    <vmtemplate xmlns="unraid" name="Windows 10" icon="default.png" os="osx"/>
  </metadata>
  <memory unit='KiB'>8388608</memory>
  <currentMemory unit='KiB'>8388608</currentMemory>
  <memoryBacking>
    <nosharepages/>
  </memoryBacking>
  <vcpu placement='static'>2</vcpu>
  <cputune>
    <vcpupin vcpu='0' cpuset='0'/>
    <vcpupin vcpu='1' cpuset='1'/>
  </cputune>
  <os>
    <type arch='x86_64' machine='pc-q35-7.1'>hvm</type>
    <loader readonly='yes' type='pflash'>/mnt/user/system/custom_ovmf/Macinabox_CODE-pure-efi.fd</loader>
    <nvram>/etc/libvirt/qemu/nvram/91b82c42-f5a2-424f-b45f-714ed7c190de_VARS-pure-efi.fd</nvram>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='host-passthrough' check='none' migratable='on'>
    <topology sockets='1' dies='1' cores='2' threads='1'/>
    <cache mode='passthrough'/>
  </cpu>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/local/sbin/qemu</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw' cache='writeback'/>
      <source file='/mnt/user/domains/Macinabox Monterey/macos_disk.img'/>
      <target dev='hdc' bus='sata'/>
      <boot order='1'/>
      <address type='drive' controller='0' bus='0' target='0' unit='2'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x1' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' 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='virtio-serial' index='0'>
      <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>
    <interface type='bridge'>
      <mac address='52:54:00:7d:24:fd'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <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='unix'>
      <target type='virtio' name='org.qemu.guest_agent.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='vnc' port='-1' autoport='yes' websocket='-1' listen='0.0.0.0' keymap='en-us'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <graphics type='egl-headless'>
      <gl rendernode='/dev/dri/by-path/pci-0000:00:02.0-render'/>
    </graphics>
    <audio id='1' type='none'/>
    <video>
      <model type='none'/>
    </video>
    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on' ramfb='on'>
      <source>
        <address uuid='42a87f64-e629-4d69-9672-6bef7162d042'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    </hostdev>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
    </memballoon>
  </devices>
  <qemu:commandline>
    <qemu:arg value='-usb'/>
    <qemu:arg value='-device'/>
    <qemu:arg value='usb-kbd,bus=usb-bus.0'/>
    <qemu:arg value='-device'/>
    <qemu:arg value='isa-applesmc,osk=[---HIDDEN---]'/>
    <qemu:arg value='-smbios'/>
    <qemu:arg value='type=2'/>
    <qemu:arg value='-cpu'/>
    <qemu:arg value='Penryn,kvm=on,vendor=GenuineIntel,+kvm_pv_unhalt,+kvm_pv_eoi,+hypervisor,+invtsc,+pcid,+ssse3,+sse4.2,+popcnt,+avx,+avx2,+aes,+fma,+bmi1,+bmi2,+xsave,+xsaveopt,+rdrand,check'/>
  </qemu:commandline>
  <qemu:override>
    <qemu:device alias='hostdev0'>
      <qemu:frontend>
        <qemu:property name='x-igd-opregion' type='bool' value='true'/>
        <qemu:property name='romfile' type='string' value='/mnt/user/data/i915dev/i915ovmf.rom'/>
        <qemu:property name='driver' type='string' value='vfio-pci-nohotplug'/>
        <qemu:property name='ramfb' type='bool' value='true'/>
      </qemu:frontend>
    </qemu:device>
  </qemu:override>
</domain>

 

 

When I first launched the VM I got this error in the libvirt log:

Quote

023-09-02 20:35:42.945+0000: 19990: error : qemuMonitorIORead:423 : Unable to read from monitor: Connection reset by peer
2023-09-02 20:35:42.945+0000: 19990: error : qemuProcessReportLogError:1965 : internal error: qemu unexpectedly closed the monito>
failed to load driver: iris
MESA-LOADER: failed to open kms_swrast: libLLVMMCJIT.so.13: cannot open shared object file: No such file or directory (search pat>
failed to load driver: kms_swrast
MESA-LOADER: failed to open swrast: libLLVMMCJIT.so.13: cannot open shared object file: No such file or directory (search paths />
failed to load swrast driver
2023-09-02T20:35:42.911775Z qemu-system-x86_64: egl: gbm_create_device failed
2023-09-02T20:35:42.911827Z qemu-system-x86_64: egl: render node init failed

 

showing that the MESA library was missing.

 

I installed the MESA library and its dependencies from here: https://slackware.pkgs.org/15.0/slackware-x86_64/mesa-21.3.5-x86_64-2.txz.html

 

Now when I launch the VM I get the following error:

Quote

2023-09-02 20:58:51.463+0000: 9439: error : qemuMonitorIORead:423 : Unable to read from monitor: Connection reset by peer
2023-09-02 20:58:51.463+0000: 9439: error : qemuProcessReportLogError:1965 : internal error: qemu unexpectedly closed the monitor: 2023-09-02T20:58:51.426646Z qemu-system-x86_64: egl: eglGetDisplay failed
2023-09-02T20:58:51.427811Z qemu-system-x86_64: egl: render node init failed

 

The error that triggers all the others is qemu-system-x86_64: egl: eglGetDisplay failed

 

Looking at the source code of QEMU, it happens here: https://github.com/qemu/qemu/blob/9abcf9776d8906c53feacab686f3d50137654b62/ui/egl-helpers.c#L441C51-L441C51

 

Do you know what could be causing this error?

  • Community Expert
2 hours ago, Andrea3000 said:

Hi all,

 

I'm trying to create a VM that uses "egl-headless" graphical framebuffer, combined with VNC or Spice to enable hardware acceleration on the guest with a mediated device (iGPU).

I've followed this guide: https://wiki.archlinux.org/title/Intel_GVT-g

 

As far as I know, starting from Unraid 6.10, QEMU has been compiled with OpenGL support, therefore this should be possible.

 

This is the xml for the VM:

<?xml version='1.0' encoding='UTF-8'?>
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  <name>MacOS Monterey</name>
  <uuid>91b82c42-f5a2-424f-b45f-714ed7c190de</uuid>
  <description>MacOS Monterey</description>
  <metadata>
    <vmtemplate xmlns="unraid" name="Windows 10" icon="default.png" os="osx"/>
  </metadata>
  <memory unit='KiB'>8388608</memory>
  <currentMemory unit='KiB'>8388608</currentMemory>
  <memoryBacking>
    <nosharepages/>
  </memoryBacking>
  <vcpu placement='static'>2</vcpu>
  <cputune>
    <vcpupin vcpu='0' cpuset='0'/>
    <vcpupin vcpu='1' cpuset='1'/>
  </cputune>
  <os>
    <type arch='x86_64' machine='pc-q35-7.1'>hvm</type>
    <loader readonly='yes' type='pflash'>/mnt/user/system/custom_ovmf/Macinabox_CODE-pure-efi.fd</loader>
    <nvram>/etc/libvirt/qemu/nvram/91b82c42-f5a2-424f-b45f-714ed7c190de_VARS-pure-efi.fd</nvram>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='host-passthrough' check='none' migratable='on'>
    <topology sockets='1' dies='1' cores='2' threads='1'/>
    <cache mode='passthrough'/>
  </cpu>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/local/sbin/qemu</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw' cache='writeback'/>
      <source file='/mnt/user/domains/Macinabox Monterey/macos_disk.img'/>
      <target dev='hdc' bus='sata'/>
      <boot order='1'/>
      <address type='drive' controller='0' bus='0' target='0' unit='2'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x1' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' 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='virtio-serial' index='0'>
      <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>
    <interface type='bridge'>
      <mac address='52:54:00:7d:24:fd'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <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='unix'>
      <target type='virtio' name='org.qemu.guest_agent.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='vnc' port='-1' autoport='yes' websocket='-1' listen='0.0.0.0' keymap='en-us'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <graphics type='egl-headless'>
      <gl rendernode='/dev/dri/by-path/pci-0000:00:02.0-render'/>
    </graphics>
    <audio id='1' type='none'/>
    <video>
      <model type='none'/>
    </video>
    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on' ramfb='on'>
      <source>
        <address uuid='42a87f64-e629-4d69-9672-6bef7162d042'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    </hostdev>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
    </memballoon>
  </devices>
  <qemu:commandline>
    <qemu:arg value='-usb'/>
    <qemu:arg value='-device'/>
    <qemu:arg value='usb-kbd,bus=usb-bus.0'/>
    <qemu:arg value='-device'/>
    <qemu:arg value='isa-applesmc,osk=[---HIDDEN---]'/>
    <qemu:arg value='-smbios'/>
    <qemu:arg value='type=2'/>
    <qemu:arg value='-cpu'/>
    <qemu:arg value='Penryn,kvm=on,vendor=GenuineIntel,+kvm_pv_unhalt,+kvm_pv_eoi,+hypervisor,+invtsc,+pcid,+ssse3,+sse4.2,+popcnt,+avx,+avx2,+aes,+fma,+bmi1,+bmi2,+xsave,+xsaveopt,+rdrand,check'/>
  </qemu:commandline>
  <qemu:override>
    <qemu:device alias='hostdev0'>
      <qemu:frontend>
        <qemu:property name='x-igd-opregion' type='bool' value='true'/>
        <qemu:property name='romfile' type='string' value='/mnt/user/data/i915dev/i915ovmf.rom'/>
        <qemu:property name='driver' type='string' value='vfio-pci-nohotplug'/>
        <qemu:property name='ramfb' type='bool' value='true'/>
      </qemu:frontend>
    </qemu:device>
  </qemu:override>
</domain>

 

 

When I first launched the VM I got this error in the libvirt log:

 

showing that the MESA library was missing.

 

I installed the MESA library and its dependencies from here: https://slackware.pkgs.org/15.0/slackware-x86_64/mesa-21.3.5-x86_64-2.txz.html

 

Now when I launch the VM I get the following error:

 

The error that triggers all the others is qemu-system-x86_64: egl: eglGetDisplay failed

 

Looking at the source code of QEMU, it happens here: https://github.com/qemu/qemu/blob/9abcf9776d8906c53feacab686f3d50137654b62/ui/egl-helpers.c#L441C51-L441C51

 

Do you know what could be causing this error?

There is a plugin for GVT have you tried that to see if it helps? Also is gvt supported on your CPU?

  • Author
4 hours ago, SimonF said:

There is a plugin for GVT have you tried that to see if it helps? Also is gvt supported on your CPU?

I have a supported CPU (i3-9100) and I already use the GVT-g plug-in. With that, GVT-g works perfectly in a Windows 10 VM.

The way it works in the Windows 10

VM is that the primary gpu (the one used with VNC access) is an emulated device, while the mediated device is a secondary GPU that is used via RDP to provide hardware rendering.

 

I’m trying to get GVT-g working also with MacOS, and for that the mediated device needs to be the only video device presented to the guest.

For that reason I have to enable display=on in the hostdev entry in the xml and use egl-headless combined with VNC or Spice (as per instructions from

my first post).

 

I don’t even think that the qemu command goes as far as trying to boot the OS, it fails already when trying to setup the display output.

 

From qemu 8.0 the log will show what is the actual error for failing to

get the display, as you can see here: https://github.com/qemu/qemu/blob/83a9cdbd65ceb4a443630aed011a00ef217ed408/ui/egl-helpers.c#L485

 

The error can be one of the following:

switch (error) {
    case EGL_SUCCESS:
        return "EGL_SUCCESS";
    case EGL_NOT_INITIALIZED:
        return "EGL_NOT_INITIALIZED";
    case EGL_BAD_ACCESS:
        return "EGL_BAD_ACCESS";
    case EGL_BAD_ALLOC:
        return "EGL_BAD_ALLOC";
    case EGL_BAD_ATTRIBUTE:
        return "EGL_BAD_ATTRIBUTE";
    case EGL_BAD_CONTEXT:
        return "EGL_BAD_CONTEXT";
    case EGL_BAD_CONFIG:
        return "EGL_BAD_CONFIG";
    case EGL_BAD_CURRENT_SURFACE:
        return "EGL_BAD_CURRENT_SURFACE";
    case EGL_BAD_DISPLAY:
        return "EGL_BAD_DISPLAY";
    case EGL_BAD_SURFACE:
        return "EGL_BAD_SURFACE";
    case EGL_BAD_MATCH:
        return "EGL_BAD_MATCH";
    case EGL_BAD_PARAMETER:
        return "EGL_BAD_PARAMETER";
    case EGL_BAD_NATIVE_PIXMAP:
        return "EGL_BAD_NATIVE_PIXMAP";
    case EGL_BAD_NATIVE_WINDOW:
        return "EGL_BAD_NATIVE_WINDOW";
    case EGL_CONTEXT_LOST:
        return "EGL_CONTEXT_LOST";
    default:
        return "Unknown EGL error";


For older versions of qemu, the log message doesn’t display what the error

actually is (see the GitHub link from the first post).

As far as I can see, there is no way to get qemu 8.0 on Unraid at the moment, is that correct?

  • Community Expert
2 hours ago, Andrea3000 said:

I have a supported CPU (i3-9100) and I already use the GVT-g plug-in. With that, GVT-g works perfectly in a Windows 10 VM.

The way it works in the Windows 10

VM is that the primary gpu (the one used with VNC access) is an emulated device, while the mediated device is a secondary GPU that is used via RDP to provide hardware rendering.

 

I’m trying to get GVT-g working also with MacOS, and for that the mediated device needs to be the only video device presented to the guest.

For that reason I have to enable display=on in the hostdev entry in the xml and use egl-headless combined with VNC or Spice (as per instructions from

my first post).

 

I don’t even think that the qemu command goes as far as trying to boot the OS, it fails already when trying to setup the display output.

 

From qemu 8.0 the log will show what is the actual error for failing to

get the display, as you can see here: https://github.com/qemu/qemu/blob/83a9cdbd65ceb4a443630aed011a00ef217ed408/ui/egl-helpers.c#L485

 

The error can be one of the following:

switch (error) {
    case EGL_SUCCESS:
        return "EGL_SUCCESS";
    case EGL_NOT_INITIALIZED:
        return "EGL_NOT_INITIALIZED";
    case EGL_BAD_ACCESS:
        return "EGL_BAD_ACCESS";
    case EGL_BAD_ALLOC:
        return "EGL_BAD_ALLOC";
    case EGL_BAD_ATTRIBUTE:
        return "EGL_BAD_ATTRIBUTE";
    case EGL_BAD_CONTEXT:
        return "EGL_BAD_CONTEXT";
    case EGL_BAD_CONFIG:
        return "EGL_BAD_CONFIG";
    case EGL_BAD_CURRENT_SURFACE:
        return "EGL_BAD_CURRENT_SURFACE";
    case EGL_BAD_DISPLAY:
        return "EGL_BAD_DISPLAY";
    case EGL_BAD_SURFACE:
        return "EGL_BAD_SURFACE";
    case EGL_BAD_MATCH:
        return "EGL_BAD_MATCH";
    case EGL_BAD_PARAMETER:
        return "EGL_BAD_PARAMETER";
    case EGL_BAD_NATIVE_PIXMAP:
        return "EGL_BAD_NATIVE_PIXMAP";
    case EGL_BAD_NATIVE_WINDOW:
        return "EGL_BAD_NATIVE_WINDOW";
    case EGL_CONTEXT_LOST:
        return "EGL_CONTEXT_LOST";
    default:
        return "Unknown EGL error";


For older versions of qemu, the log message doesn’t display what the error

actually is (see the GitHub link from the first post).

As far as I can see, there is no way to get qemu 8.0 on Unraid at the moment, is that correct?

No the next release will have an updated vers but 6.12 is running with 7.1. Latest QEMU release is now 8.1.

 

Not sure if it is compiled with opengl, will ask.

  • Author
1 hour ago, SimonF said:

No the next release will have an updated vers but 6.12 is running with 7.1. Latest QEMU release is now 8.1.

 

Not sure if it is compiled with opengl, will ask.

Thanks. In the meantime I will keep investigating because I would like to find a solution without having to wait for the next Unraid release

  • Author
On 9/9/2023 at 6:11 PM, SimonF said:

No the next release will have an updated vers but 6.12 is running with 7.1. Latest QEMU release is now 8.1.

 

Not sure if it is compiled with opengl, will ask.

 

Quick update on some findings.

 

1) I took the source code of eglinfo, which is a tool that is part of the mesa-tools and that lists the EGL capabilities of the system (the equivalent of glxinfo or EGL).

2) I modified the source code to implement the creation of the GBM surface in order to query the capabilities of off-screen rendering of the system, instead of on-screen. This is basically the equivalent of what QEMU does, in fact I copied the relevant portion from the QEMU source code. You can find the final code below:

/*
 * eglinfo - like glxinfo but for EGL
 *
 * Brian Paul
 * 11 March 2005
 *
 * Copyright (C) 2005  Brian Paul   All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#include <epoxy/egl.h>
#include <EGL/eglext.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include "gbm.h"

#define MAX_CONFIGS 1000
#define MAX_MODES 1000
#define MAX_SCREENS 10

/* These are X visual types, so if you're running eglinfo under
 * something not X, they probably don't make sense. */
static const char *vnames[] = { "SG", "GS", "SC", "PC", "TC", "DC" };

/**
 * Print table of all available configurations.
 */
static void
PrintConfigs(EGLDisplay d)
{
   EGLConfig configs[MAX_CONFIGS];
   EGLint numConfigs, i;

   eglGetConfigs(d, configs, MAX_CONFIGS, &numConfigs);

   printf("Configurations:\n");
   printf("     bf lv colorbuffer dp st  ms    vis   cav bi  renderable  supported\n");
   printf("  id sz  l  r  g  b  a th cl ns b    id   eat nd gl es es2 vg surfaces \n");
   /*        ^  ^   ^  ^  ^  ^  ^ ^  ^  ^  ^    ^    ^   ^  ^  ^  ^   ^  ^
    *        |  |   |  |  |  |  | |  |  |  |    |    |   |  |  |  |   |  |
    *        |  |   |  |  |  |  | |  |  |  |    |    |   |  |  |  |   |  EGL_SURFACE_TYPE
    *        |  |   |  |  |  |  | |  |  |  |    |    |   |  EGL_RENDERABLE_TYPE
    *        |  |   |  |  |  |  | |  |  |  |    |    |   EGL_BIND_TO_TEXTURE_RGB/EGL_BIND_TO_TEXTURE_RGBA
    *        |  |   |  |  |  |  | |  |  |  |    |    EGL_CONFIG_CAVEAT
    *        |  |   |  |  |  |  | |  |  |  |    EGL_NATIVE_VISUAL_ID/EGL_NATIVE_VISUAL_TYPE
    *        |  |   |  |  |  |  | |  |  |  EGL_SAMPLE_BUFFERS
    *        |  |   |  |  |  |  | |  |  EGL_SAMPLES
    *        |  |   |  |  |  |  | |  EGL_STENCIL_SIZE
    *        |  |   |  |  |  |  | EGL_DEPTH_SIZE
    *        |  |   |  |  |  |  EGL_ALPHA_SIZE
    *        |  |   |  |  |  EGL_BLUE_SIZE
    *        |  |   |  |  EGL_GREEN_SIZE
    *        |  |   |  EGL_RED_SIZE
    *        |  |   EGL_LEVEL
    *        |  EGL_BUFFER_SIZE
    *        EGL_CONFIG_ID
    */
   printf("---------------------------------------------------------------------\n");
   for (i = 0; i < numConfigs; i++) {
      EGLint id, size, level;
      EGLint red, green, blue, alpha;
      EGLint depth, stencil;
      EGLint renderable, surfaces;
      EGLint vid, vtype, caveat, bindRgb, bindRgba;
      EGLint samples, sampleBuffers;
      char surfString[100] = "";

      eglGetConfigAttrib(d, configs[i], EGL_CONFIG_ID, &id);
      eglGetConfigAttrib(d, configs[i], EGL_BUFFER_SIZE, &size);
      eglGetConfigAttrib(d, configs[i], EGL_LEVEL, &level);

      eglGetConfigAttrib(d, configs[i], EGL_RED_SIZE, &red);
      eglGetConfigAttrib(d, configs[i], EGL_GREEN_SIZE, &green);
      eglGetConfigAttrib(d, configs[i], EGL_BLUE_SIZE, &blue);
      eglGetConfigAttrib(d, configs[i], EGL_ALPHA_SIZE, &alpha);
      eglGetConfigAttrib(d, configs[i], EGL_DEPTH_SIZE, &depth);
      eglGetConfigAttrib(d, configs[i], EGL_STENCIL_SIZE, &stencil);
      eglGetConfigAttrib(d, configs[i], EGL_NATIVE_VISUAL_ID, &vid);
      eglGetConfigAttrib(d, configs[i], EGL_NATIVE_VISUAL_TYPE, &vtype);

      eglGetConfigAttrib(d, configs[i], EGL_CONFIG_CAVEAT, &caveat);
      eglGetConfigAttrib(d, configs[i], EGL_BIND_TO_TEXTURE_RGB, &bindRgb);
      eglGetConfigAttrib(d, configs[i], EGL_BIND_TO_TEXTURE_RGBA, &bindRgba);
      eglGetConfigAttrib(d, configs[i], EGL_RENDERABLE_TYPE, &renderable);
      eglGetConfigAttrib(d, configs[i], EGL_SURFACE_TYPE, &surfaces);

      eglGetConfigAttrib(d, configs[i], EGL_SAMPLES, &samples);
      eglGetConfigAttrib(d, configs[i], EGL_SAMPLE_BUFFERS, &sampleBuffers);

      if (surfaces & EGL_WINDOW_BIT)
         strcat(surfString, "win,");
      if (surfaces & EGL_PBUFFER_BIT)
         strcat(surfString, "pb,");
      if (surfaces & EGL_PIXMAP_BIT)
         strcat(surfString, "pix,");
      if (surfaces & EGL_STREAM_BIT_KHR)
         strcat(surfString, "str,");
      if (strlen(surfString) > 0)
         surfString[strlen(surfString) - 1] = 0;

      printf("0x%02x %2d %2d %2d %2d %2d %2d %2d %2d %2d%2d 0x%02x%s ",
             id, size, level,
             red, green, blue, alpha,
             depth, stencil,
             samples, sampleBuffers, vid, vtype < 6 ? vnames[vtype] : "--");
      printf("  %c  %c  %c  %c  %c   %c %s\n",
             (caveat != EGL_NONE) ? 'y' : ' ',
             (bindRgba) ? 'a' : (bindRgb) ? 'y' : ' ',
             (renderable & EGL_OPENGL_BIT) ? 'y' : ' ',
             (renderable & EGL_OPENGL_ES_BIT) ? 'y' : ' ',
             (renderable & EGL_OPENGL_ES2_BIT) ? 'y' : ' ',
             (renderable & EGL_OPENVG_BIT) ? 'y' : ' ',
             surfString);
   }
}


static const char *
PrintExtensions(EGLDisplay d)
{
   const char *extensions, *p, *end, *next;
   int column;

   puts(d == EGL_NO_DISPLAY ? "EGL client extensions string:" :
        "EGL extensions string:");

   extensions = eglQueryString(d, EGL_EXTENSIONS);
   if (!extensions)
      return NULL;

   column = 0;
   end = extensions + strlen(extensions);

   for (p = extensions; p < end; p = next + 1) {
      next = strchr(p, ' ');
      if (next == NULL)
         next = end;

      if (column > 0 && column + next - p + 1 > 70) {
         printf("\n");
         column = 0;
      }
      if (column == 0)
         printf("    ");
      else
         printf(" ");
      column += next - p + 1;

      printf("%.*s", (int) (next - p), p);

      p = next + 1;
   }

   if (column > 0)
      printf("\n");

   return extensions;
}

const char *egl_get_error_string(void)
{
    EGLint error = eglGetError();

    switch (error) {
    case EGL_SUCCESS:
        return "EGL_SUCCESS";
    case EGL_NOT_INITIALIZED:
        return "EGL_NOT_INITIALIZED";
    case EGL_BAD_ACCESS:
        return "EGL_BAD_ACCESS";
    case EGL_BAD_ALLOC:
        return "EGL_BAD_ALLOC";
    case EGL_BAD_ATTRIBUTE:
        return "EGL_BAD_ATTRIBUTE";
    case EGL_BAD_CONTEXT:
        return "EGL_BAD_CONTEXT";
    case EGL_BAD_CONFIG:
        return "EGL_BAD_CONFIG";
    case EGL_BAD_CURRENT_SURFACE:
        return "EGL_BAD_CURRENT_SURFACE";
    case EGL_BAD_DISPLAY:
        return "EGL_BAD_DISPLAY";
    case EGL_BAD_SURFACE:
        return "EGL_BAD_SURFACE";
    case EGL_BAD_MATCH:
        return "EGL_BAD_MATCH";
    case EGL_BAD_PARAMETER:
        return "EGL_BAD_PARAMETER";
    case EGL_BAD_NATIVE_PIXMAP:
        return "EGL_BAD_NATIVE_PIXMAP";
    case EGL_BAD_NATIVE_WINDOW:
        return "EGL_BAD_NATIVE_WINDOW";
    case EGL_CONTEXT_LOST:
        return "EGL_CONTEXT_LOST";
    default:
        return "Unknown EGL error";
    }
}

static int
doOneDisplay(EGLDisplay d, const char *name)
{
   int maj, min;

   printf("%s:\n", name);
   if (!eglInitialize(d, &maj, &min)) {
      printf("eglinfo: eglInitialize failed\n\n");
      return 1;
   }

   printf("EGL API version: %d.%d\n", maj, min);
   printf("EGL vendor string: %s\n", eglQueryString(d, EGL_VENDOR));
   printf("EGL version string: %s\n", eglQueryString(d, EGL_VERSION));
#ifdef EGL_VERSION_1_2
   printf("EGL client APIs: %s\n", eglQueryString(d, EGL_CLIENT_APIS));
#endif

   PrintExtensions(d);

   PrintConfigs(d);
   eglTerminate(d);
   printf("\n");
   return 0;
}

int qemu_egl_rn_fd;
struct gbm_device *qemu_egl_rn_gbm_dev;

int egl_rendernode_init(const char *rendernode)
{
    qemu_egl_rn_fd = -1;
    int rc;

    qemu_egl_rn_fd = open(rendernode, O_RDWR | O_CLOEXEC | O_NOCTTY | O_NONBLOCK);
    if (qemu_egl_rn_fd == -1) {
        printf("egl: no drm render node available\n");
        goto err;
    }

    qemu_egl_rn_gbm_dev = gbm_create_device(qemu_egl_rn_fd);
    if (!qemu_egl_rn_gbm_dev) {
        printf("egl: gbm_create_device failed\n");
        goto err;
    }

    return 0;

err:
    if (qemu_egl_rn_gbm_dev) {
        gbm_device_destroy(qemu_egl_rn_gbm_dev);
    }
    if (qemu_egl_rn_fd != -1) {
        close(qemu_egl_rn_fd);
    }

    return -1;
}

int
main(int argc, char *argv[])
{
   int ret = 0;
   const char *clientext;
   char *rendernode;
   if (argc > 1) {
      rendernode = argv[1];
   }

   clientext = PrintExtensions(EGL_NO_DISPLAY);
   printf("\n");

   if (strstr(clientext, "EGL_EXT_platform_base")) {
      PFNEGLGETPLATFORMDISPLAYEXTPROC getPlatformDisplay =
         (PFNEGLGETPLATFORMDISPLAYEXTPROC) eglGetProcAddress(
            "eglGetPlatformDisplayEXT");
      if (strstr(clientext, "EGL_MESA_platform_gbm") ||
          strstr(clientext, "EGL_KHR_platform_gbm"))
         ret += doOneDisplay(getPlatformDisplay(EGL_PLATFORM_GBM_MESA,
                                               (EGLNativeDisplayType)qemu_egl_rn_gbm_dev, NULL),
                             "GBM platform");
   } else {
      egl_rendernode_init(rendernode);
      EGLDisplay *egl_display = eglGetDisplay((EGLNativeDisplayType)qemu_egl_rn_gbm_dev);

      if (egl_display == EGL_NO_DISPLAY) {
        printf("egl: eglGetDisplay failed: %s\n", egl_get_error_string());

         if (qemu_egl_rn_gbm_dev) {
            gbm_device_destroy(qemu_egl_rn_gbm_dev);
         }
         if (qemu_egl_rn_fd != -1) {
            close(qemu_egl_rn_fd);
         }
         return 0;
      }

      ret =
         doOneDisplay(egl_display, "GBM platform");
   }

   return ret;
}

 

3) I was then able to see what was the error code...which is actually EGL_SUCCESS!! Despite still returning EGL_NO_DISPLAY

4) I then created a Slackware 15.0 VM on Unraid and I passed through the IGPU.

5) Running the code above on the stock Slackware VM produces the following output:

 

EGL client extensions string:
    EGL_EXT_device_base EGL_EXT_device_enumeration EGL_EXT_device_query
    EGL_EXT_platform_base EGL_KHR_client_get_all_proc_addresses
    EGL_EXT_client_extensions EGL_KHR_debug EGL_EXT_platform_device
    EGL_EXT_platform_wayland EGL_KHR_platform_wayland
    EGL_EXT_platform_x11 EGL_KHR_platform_x11 EGL_MESA_platform_xcb
    EGL_MESA_platform_gbm EGL_KHR_platform_gbm
    EGL_MESA_platform_surfaceless

GBM platform:
EGL API version: 1.5
EGL vendor string: Mesa Project
EGL version string: 1.5
EGL client APIs: OpenGL OpenGL_ES 
EGL extensions string:
    EGL_ANDROID_blob_cache EGL_ANDROID_native_fence_sync
    EGL_EXT_buffer_age EGL_EXT_create_context_robustness
    EGL_EXT_image_dma_buf_import EGL_EXT_image_dma_buf_import_modifiers
    EGL_IMG_context_priority EGL_KHR_cl_event2 EGL_KHR_config_attribs
    EGL_KHR_create_context EGL_KHR_create_context_no_error
    EGL_KHR_fence_sync EGL_KHR_get_all_proc_addresses
    EGL_KHR_gl_colorspace EGL_KHR_gl_renderbuffer_image
    EGL_KHR_gl_texture_2D_image EGL_KHR_gl_texture_3D_image
    EGL_KHR_gl_texture_cubemap_image EGL_KHR_image EGL_KHR_image_base
    EGL_KHR_image_pixmap EGL_KHR_no_config_context EGL_KHR_reusable_sync
    EGL_KHR_surfaceless_context EGL_EXT_pixel_format_float
    EGL_KHR_wait_sync EGL_MESA_configless_context EGL_MESA_drm_image
    EGL_MESA_image_dma_buf_export EGL_MESA_query_driver
    EGL_WL_bind_wayland_display
Configurations:
     bf lv colorbuffer dp st  ms    vis   cav bi  renderable  supported
  id sz  l  r  g  b  a th cl ns b    id   eat nd gl es es2 vg surfaces 
---------------------------------------------------------------------
0x01 32  0 10 10 10  2  0  0  0 0 0x30335241--         y  y  y     win
0x02 32  0 10 10 10  2 16  0  0 0 0x30335241--         y  y  y     win
0x03 32  0 10 10 10  2 24  0  0 0 0x30335241--         y  y  y     win
0x04 32  0 10 10 10  2 24  8  0 0 0x30335241--         y  y  y     win
0x05 32  0 10 10 10  2  0  0  2 1 0x30335241--         y  y  y     win
0x06 32  0 10 10 10  2  0  0  4 1 0x30335241--         y  y  y     win
0x07 32  0 10 10 10  2  0  0  8 1 0x30335241--         y  y  y     win
0x08 32  0 10 10 10  2  0  0 16 1 0x30335241--         y  y  y     win
0x09 32  0 10 10 10  2 16  0  2 1 0x30335241--         y  y  y     win
0x0a 32  0 10 10 10  2 16  0  4 1 0x30335241--         y  y  y     win
0x0b 32  0 10 10 10  2 16  0  8 1 0x30335241--         y  y  y     win
0x0c 32  0 10 10 10  2 16  0 16 1 0x30335241--         y  y  y     win
0x0d 32  0 10 10 10  2 24  0  2 1 0x30335241--         y  y  y     win
0x0e 32  0 10 10 10  2 24  0  4 1 0x30335241--         y  y  y     win
0x0f 32  0 10 10 10  2 24  0  8 1 0x30335241--         y  y  y     win
0x10 32  0 10 10 10  2 24  0 16 1 0x30335241--         y  y  y     win
0x11 32  0 10 10 10  2 24  8  2 1 0x30335241--         y  y  y     win
0x12 32  0 10 10 10  2 24  8  4 1 0x30335241--         y  y  y     win
0x13 32  0 10 10 10  2 24  8  8 1 0x30335241--         y  y  y     win
0x14 32  0 10 10 10  2 24  8 16 1 0x30335241--         y  y  y     win
0x15 30  0 10 10 10  0  0  0  0 0 0x30335258--         y  y  y     win
0x16 30  0 10 10 10  0 16  0  0 0 0x30335258--         y  y  y     win
0x17 30  0 10 10 10  0 24  0  0 0 0x30335258--         y  y  y     win
0x18 30  0 10 10 10  0 24  8  0 0 0x30335258--         y  y  y     win
0x19 30  0 10 10 10  0  0  0  2 1 0x30335258--         y  y  y     win
0x1a 30  0 10 10 10  0  0  0  4 1 0x30335258--         y  y  y     win
0x1b 30  0 10 10 10  0  0  0  8 1 0x30335258--         y  y  y     win
0x1c 30  0 10 10 10  0  0  0 16 1 0x30335258--         y  y  y     win
0x1d 30  0 10 10 10  0 16  0  2 1 0x30335258--         y  y  y     win
0x1e 30  0 10 10 10  0 16  0  4 1 0x30335258--         y  y  y     win
0x1f 30  0 10 10 10  0 16  0  8 1 0x30335258--         y  y  y     win
0x20 30  0 10 10 10  0 16  0 16 1 0x30335258--         y  y  y     win
0x21 30  0 10 10 10  0 24  0  2 1 0x30335258--         y  y  y     win
0x22 30  0 10 10 10  0 24  0  4 1 0x30335258--         y  y  y     win
0x23 30  0 10 10 10  0 24  0  8 1 0x30335258--         y  y  y     win
0x24 30  0 10 10 10  0 24  0 16 1 0x30335258--         y  y  y     win
0x25 30  0 10 10 10  0 24  8  2 1 0x30335258--         y  y  y     win
0x26 30  0 10 10 10  0 24  8  4 1 0x30335258--         y  y  y     win
0x27 30  0 10 10 10  0 24  8  8 1 0x30335258--         y  y  y     win
0x28 30  0 10 10 10  0 24  8 16 1 0x30335258--         y  y  y     win
0x29 32  0  8  8  8  8  0  0  0 0 0x34325241--         y  y  y     win
0x2a 32  0  8  8  8  8 16  0  0 0 0x34325241--         y  y  y     win
0x2b 32  0  8  8  8  8 24  0  0 0 0x34325241--         y  y  y     win
0x2c 32  0  8  8  8  8 24  8  0 0 0x34325241--         y  y  y     win
0x2d 32  0  8  8  8  8  0  0  2 1 0x34325241--         y  y  y     win
0x2e 32  0  8  8  8  8  0  0  4 1 0x34325241--         y  y  y     win
0x2f 32  0  8  8  8  8  0  0  8 1 0x34325241--         y  y  y     win
0x30 32  0  8  8  8  8  0  0 16 1 0x34325241--         y  y  y     win
0x31 32  0  8  8  8  8 16  0  2 1 0x34325241--         y  y  y     win
0x32 32  0  8  8  8  8 16  0  4 1 0x34325241--         y  y  y     win
0x33 32  0  8  8  8  8 16  0  8 1 0x34325241--         y  y  y     win
0x34 32  0  8  8  8  8 16  0 16 1 0x34325241--         y  y  y     win
0x35 32  0  8  8  8  8 24  0  2 1 0x34325241--         y  y  y     win
0x36 32  0  8  8  8  8 24  0  4 1 0x34325241--         y  y  y     win
0x37 32  0  8  8  8  8 24  0  8 1 0x34325241--         y  y  y     win
0x38 32  0  8  8  8  8 24  0 16 1 0x34325241--         y  y  y     win
0x39 32  0  8  8  8  8 24  8  2 1 0x34325241--         y  y  y     win
0x3a 32  0  8  8  8  8 24  8  4 1 0x34325241--         y  y  y     win
0x3b 32  0  8  8  8  8 24  8  8 1 0x34325241--         y  y  y     win
0x3c 32  0  8  8  8  8 24  8 16 1 0x34325241--         y  y  y     win
0x3d 24  0  8  8  8  0  0  0  0 0 0x34325258--         y  y  y     win
0x3e 24  0  8  8  8  0 16  0  0 0 0x34325258--         y  y  y     win
0x3f 24  0  8  8  8  0 24  0  0 0 0x34325258--         y  y  y     win
0x40 24  0  8  8  8  0 24  8  0 0 0x34325258--         y  y  y     win
0x41 24  0  8  8  8  0  0  0  2 1 0x34325258--         y  y  y     win
0x42 24  0  8  8  8  0  0  0  4 1 0x34325258--         y  y  y     win
0x43 24  0  8  8  8  0  0  0  8 1 0x34325258--         y  y  y     win
0x44 24  0  8  8  8  0  0  0 16 1 0x34325258--         y  y  y     win
0x45 24  0  8  8  8  0 16  0  2 1 0x34325258--         y  y  y     win
0x46 24  0  8  8  8  0 16  0  4 1 0x34325258--         y  y  y     win
0x47 24  0  8  8  8  0 16  0  8 1 0x34325258--         y  y  y     win
0x48 24  0  8  8  8  0 16  0 16 1 0x34325258--         y  y  y     win
0x49 24  0  8  8  8  0 24  0  2 1 0x34325258--         y  y  y     win
0x4a 24  0  8  8  8  0 24  0  4 1 0x34325258--         y  y  y     win
0x4b 24  0  8  8  8  0 24  0  8 1 0x34325258--         y  y  y     win
0x4c 24  0  8  8  8  0 24  0 16 1 0x34325258--         y  y  y     win
0x4d 24  0  8  8  8  0 24  8  2 1 0x34325258--         y  y  y     win
0x4e 24  0  8  8  8  0 24  8  4 1 0x34325258--         y  y  y     win
0x4f 24  0  8  8  8  0 24  8  8 1 0x34325258--         y  y  y     win
0x50 24  0  8  8  8  0 24  8 16 1 0x34325258--         y  y  y     win
0x51 16  0  5  6  5  0  0  0  0 0 0x36314752--         y  y  y     win
0x52 16  0  5  6  5  0 16  0  0 0 0x36314752--         y  y  y     win
0x53 16  0  5  6  5  0 24  0  0 0 0x36314752--         y  y  y     win
0x54 16  0  5  6  5  0 24  8  0 0 0x36314752--         y  y  y     win
0x55 16  0  5  6  5  0  0  0  2 1 0x36314752--         y  y  y     win
0x56 16  0  5  6  5  0  0  0  4 1 0x36314752--         y  y  y     win
0x57 16  0  5  6  5  0  0  0  8 1 0x36314752--         y  y  y     win
0x58 16  0  5  6  5  0  0  0 16 1 0x36314752--         y  y  y     win
0x59 16  0  5  6  5  0 16  0  2 1 0x36314752--         y  y  y     win
0x5a 16  0  5  6  5  0 16  0  4 1 0x36314752--         y  y  y     win
0x5b 16  0  5  6  5  0 16  0  8 1 0x36314752--         y  y  y     win
0x5c 16  0  5  6  5  0 16  0 16 1 0x36314752--         y  y  y     win
0x5d 16  0  5  6  5  0 24  0  2 1 0x36314752--         y  y  y     win
0x5e 16  0  5  6  5  0 24  0  4 1 0x36314752--         y  y  y     win
0x5f 16  0  5  6  5  0 24  0  8 1 0x36314752--         y  y  y     win
0x60 16  0  5  6  5  0 24  0 16 1 0x36314752--         y  y  y     win
0x61 16  0  5  6  5  0 24  8  2 1 0x36314752--         y  y  y     win
0x62 16  0  5  6  5  0 24  8  4 1 0x36314752--         y  y  y     win
0x63 16  0  5  6  5  0 24  8  8 1 0x36314752--         y  y  y     win
0x64 16  0  5  6  5  0 24  8 16 1 0x36314752--         y  y  y     win
0x65 64  0 16 16 16 16  0  0  0 0 0x48344241--         y  y  y     win
0x66 64  0 16 16 16 16 16  0  0 0 0x48344241--         y  y  y     win
0x67 64  0 16 16 16 16 24  0  0 0 0x48344241--         y  y  y     win
0x68 64  0 16 16 16 16 24  8  0 0 0x48344241--         y  y  y     win
0x69 64  0 16 16 16 16  0  0  2 1 0x48344241--         y  y  y     win
0x6a 64  0 16 16 16 16  0  0  4 1 0x48344241--         y  y  y     win
0x6b 64  0 16 16 16 16  0  0  8 1 0x48344241--         y  y  y     win
0x6c 64  0 16 16 16 16  0  0 16 1 0x48344241--         y  y  y     win
0x6d 64  0 16 16 16 16 16  0  2 1 0x48344241--         y  y  y     win
0x6e 64  0 16 16 16 16 16  0  4 1 0x48344241--         y  y  y     win
0x6f 64  0 16 16 16 16 16  0  8 1 0x48344241--         y  y  y     win
0x70 64  0 16 16 16 16 16  0 16 1 0x48344241--         y  y  y     win
0x71 64  0 16 16 16 16 24  0  2 1 0x48344241--         y  y  y     win
0x72 64  0 16 16 16 16 24  0  4 1 0x48344241--         y  y  y     win
0x73 64  0 16 16 16 16 24  0  8 1 0x48344241--         y  y  y     win
0x74 64  0 16 16 16 16 24  0 16 1 0x48344241--         y  y  y     win
0x75 64  0 16 16 16 16 24  8  2 1 0x48344241--         y  y  y     win
0x76 64  0 16 16 16 16 24  8  4 1 0x48344241--         y  y  y     win
0x77 64  0 16 16 16 16 24  8  8 1 0x48344241--         y  y  y     win
0x78 64  0 16 16 16 16 24  8 16 1 0x48344241--         y  y  y     win
0x79 48  0 16 16 16  0  0  0  0 0 0x48344258--         y  y  y     win
0x7a 48  0 16 16 16  0 16  0  0 0 0x48344258--         y  y  y     win
0x7b 48  0 16 16 16  0 24  0  0 0 0x48344258--         y  y  y     win
0x7c 48  0 16 16 16  0 24  8  0 0 0x48344258--         y  y  y     win
0x7d 48  0 16 16 16  0  0  0  2 1 0x48344258--         y  y  y     win
0x7e 48  0 16 16 16  0  0  0  4 1 0x48344258--         y  y  y     win
0x7f 48  0 16 16 16  0  0  0  8 1 0x48344258--         y  y  y     win
0x80 48  0 16 16 16  0  0  0 16 1 0x48344258--         y  y  y     win
0x81 48  0 16 16 16  0 16  0  2 1 0x48344258--         y  y  y     win
0x82 48  0 16 16 16  0 16  0  4 1 0x48344258--         y  y  y     win
0x83 48  0 16 16 16  0 16  0  8 1 0x48344258--         y  y  y     win
0x84 48  0 16 16 16  0 16  0 16 1 0x48344258--         y  y  y     win
0x85 48  0 16 16 16  0 24  0  2 1 0x48344258--         y  y  y     win
0x86 48  0 16 16 16  0 24  0  4 1 0x48344258--         y  y  y     win
0x87 48  0 16 16 16  0 24  0  8 1 0x48344258--         y  y  y     win
0x88 48  0 16 16 16  0 24  0 16 1 0x48344258--         y  y  y     win
0x89 48  0 16 16 16  0 24  8  2 1 0x48344258--         y  y  y     win
0x8a 48  0 16 16 16  0 24  8  4 1 0x48344258--         y  y  y     win
0x8b 48  0 16 16 16  0 24  8  8 1 0x48344258--         y  y  y     win
0x8c 48  0 16 16 16  0 24  8 16 1 0x48344258--         y  y  y     win

 

Here everything works and the tool shows support to EGL_MESA_platform_gbm which is required for off-screen rendering.

 

6) Instead, running the same code on Unraid produces the following output:

 

EGL client extensions string:

egl: eglGetDisplay failed: EGL_SUCCESS

 

As you can see, the GPU driver on Unraid doesn't support any EGL extension, making off-screen rendering impossible!

 

I've raised a bug on the bug reporting section of the forum, because QEMU is compiled with OpenGL support but the GPU drivers that are shipped with Unraid are the limiting factor to make QEMU work correctly with OpenGL:

 

  • 1 year later...
  • Community Expert

@Andrea3000 Could you share the test binary.

 

Im a looking at what is required for virgl support and I would find this useful.

 

I have virgl working on a test system. 

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.