Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Building QEMU with virtio-gpu and rutabaga_gfx

Date: on 2023-11-22 | Updated: on 2024-01-04

virtio-gpu-rutabaga device is available in QEMU 8.2 release candidates and later versions.

...

Code Block
languagebash
apt install -y {libpulse,libdrm,libglm,libstb,libegl,libgles,libvulkan,vulkan-validationlayers}-dev 

In Debian trixie, vulkan-validation-layers-devhas been renamed to vulkan-utility-libraries-dev.

2. Build qemu

Code Block
languagebash
git clone https://gitlab.com/qemu-project/qemu.git

Checkout master or a 8.2 tagged release.

2.1 (maybe optional) Build libvirglrenderer

Depending on the system version you have you might need a newer libvirglrender

Code Block
export PREFIX="$(pwd)"/prefix
git clone https://gitlab.freedesktop.org/virgl/virglrenderer.git
cd virglrenderer
meson setup -Dprefix=$PREFIX -Dlibdir=lib build
cd build
ninja install

2.2 Build rutabaga/gfxstream dependencies

You will need to build gfxstream and rutabaga_gfx dependencies for QEMU.

...

Code Block
languagebash
# Development prefix tree
export PREFIX="$(pwd)"/prefix
export CMAKE_INSTALL_PREFIX="${PREFIX}"
export PKG_CONFIG_PATH="${PREFIX}/lib/pkgconfig":"${PREFIX}/usr/local/lib/x86_64-linux-gnu/pkgconfig"

The following rutabaga_gfx build instructions were taken from https://crosvm.dev/book/appendix/rutabaga_gfx.html

2.

...

2.1 - Build aemu

HEAD revision:

Code Block
languagebash
qemu/deps/aemu % git log -1
c22a4b0caf5a07 (HEAD -> main, origin/master, origin/main, origin/HEAD) Simplify reland:formatter multidisplay:interface addto isPixelFold methoduse std::string
Code Block
languagebash
# from <https://crosvm.dev/book/appendix/rutabaga_gfx.html#build-aemu-base>
git clone https://android.googlesource.com/platform/hardware/google/aemu
cd aemu/
cmake -DAEMU_COMMON_GEN_PKGCONFIG=ON \
      -DAEMU_COMMON_BUILD_CONFIG=gfxstream \
      -DENABLE_VKCEREAL_TESTS=OFF \
      --install-prefix "${PREFIX}" \
      -B build
cmake --build build -j
cmake --install build --prefix "${CMAKE_INSTALL_PREFIX}"

2.

...

2.2 Build gfxstream

HEAD revision:

Code Block
languagebash
qemu/deps/gfxstream % git log -1
b5ce9bbd3e45436a (HEAD -> main, origin/master, origin/main, origin/HEAD) AndroidWorkPool.cpp:248:5: error: control reaches end of non-void functionMerge "Fix crash on exit" into main
Code Block
languagebash
# from <https://crosvm.dev/book/appendix/rutabaga_gfx.html#build-gfxstream>
git clone https://android.googlesource.com/platform/hardware/google/gfxstream
cd gfxstream/
meson setup -Ddefault_library=static --prefix "${PREFIX}" build/ 
meson install -C build

2.

...

2.3 Build rutabaga FFI

Code Block
languagebash
git clone git@githubhttps://github.com:/google/crosvm.git

You will also need rust/cargo.

...

Code Block
languagebash
crosvm % git log -1
1eca601eacd04b6198 (HEAD -> main, origin/main, origin/HEAD) RollUpgrade recipegdbstub dependencies (trivial)and gdbstub_arch.
Code Block
languagebash
# crosvm HEAD revision: 1eca601ea
export RUSTFLAGS='-Clink-arg=-L='"${PREFIX}"/lib/x86_64-linux-gnu/
cd crosvm/rutabaga_gfx/ffi
make
make prefix="${PREFIX}" install

...

Important: if the Makefile did not find gfxstream with pkg-config, the library is built without the gfxstream feature. Make sure this step has worked.

2.2.4 Build qemu binary

After all that, go back to qemu/build and build QEMU:

...

Code Block
languagebash
#!/bin/zsh
export WAYLAND_SOCK=/run/user/1000/wayland-0
#export WAYLAND_SOCK=/tmp/wayland.sock
GUEST_DATA_IMG=...
./build/qemu-system-x86_64 \
    -m 4G \
    -machine pc,accel=kvm,memory-backend=mem,usb=off \
    -device virtio-scsi-pci,id=scsi0 \
    -device virtio-net-pci,netdev=net0 \
    -D qemu.log \
    -netdev user,id=net0,hostfwd=tcp::8022-:22 \
    -object memory-backend-file,id=mem,size=4G,mem-path=/dev/shm,share=on \
    -audio driver=pa,model=hda,server=/run/user/1000/pulse/native \
    -device virtio-vga-rutabaga,capset_names=gfxstream-vulkan:=on,cross-domain=on,wayland_-socket_-path=${WAYLAND_SOCK},hostmem=8G \
    "$GUEST_DATA_IMG"

...