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 |
---|
|
apt install -y {libpulse,libdrm,libglm,libstb,libegl,libgles,libvulkan,vulkan-validationlayers}-dev |
In Debian trixie, vulkan-validation-layers-dev
has been renamed to vulkan-utility-libraries-dev
.
2. Build qemu
Code Block |
---|
|
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 |
---|
|
# 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 |
---|
|
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 |
---|
|
# 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 |
---|
|
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 |
---|
|
# 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 |
---|
|
git clone git@githubhttps://github.com:/google/crosvm.git |
You will also need rust/cargo.
...
Code Block |
---|
|
crosvm % git log -1
1eca601eacd04b6198 (HEAD -> main, origin/main, origin/HEAD) RollUpgrade recipegdbstub dependencies (trivial)and gdbstub_arch. |
Code Block |
---|
|
# 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 |
---|
|
#!/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" |
...