Message ID | 20241110221838.2241356-1-dmitry.osipenko@collabora.com (mailing list archive) |
---|---|
Headers | show |
Series | Support virtio-gpu DRM native context | expand |
On 2024/11/11 7:18, Dmitry Osipenko wrote: > This patchset adds DRM native context support to VirtIO-GPU on Qemu. > > Contarary to Virgl and Venus contexts which mediate high level GFX APIs, > DRM native context [1] mediates lower level kernel driver UAPI, which > reflects in a less CPU overhead and less/simpler code needed to support it. > DRM context consists of a host and guest parts that have to be implemented > for each GPU driver. On a guest side, DRM context presents a virtual GPU as > a real/native host GPU device for GL/VK applications. > > [1] https://www.youtube.com/watch?v=9sFP_yddLLQ > > Today there are four known DRM native context drivers existing in a wild: > > - Freedreno (Qualcomm SoC GPUs), completely upstreamed > - AMDGPU, mostly merged into upstreams > - Intel (i915), merge requests are opened > - Asahi (Apple SoC GPUs), WIP status > > > # How to try out DRM context: > > 1. DRM context uses host blobs and requires latest developer version > of Linux kernel [2] that has necessary KVM fixes. > > [2] https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/ > > 2. Use latest libvirglrenderer from upstream git/main for Freedreno > and AMDGPU native contexts. For Intel use patches [3]. > > [3] https://gitlab.freedesktop.org/virgl/virglrenderer/-/merge_requests/1384 > > 3. On guest, use latest Mesa version for Freedreno. For AMDGPU use > Mesa patches [4], for Intel [5]. > > [4] https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21658 > [5] https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29870 > > 4. On guest, use latest Linux kernel v6.6+. Apply patch [6] if you're > running Xorg in guest. > > [6] https://lore.kernel.org/dri-devel/20241020224725.179937-1-dmitry.osipenko@collabora.com/ > > Example Qemu cmdline that enables DRM context: > > qemu-system-x86_64 -device virtio-vga-gl,hostmem=4G,blob=on,drm_native_context=on \ > -machine q35,accel=kvm,memory-backend=mem1 \ > -object memory-backend-memfd,id=mem1,size=8G -m 8G > > > # Note about known performance problem in Qemu: > > DRM contexts are mapping host blobs extensively and these mapping > operations work slowly in Qemu. Exact reason is unknown. Mappings work > fast on Crosvm For DRM contexts this problem is more visible than for > Venus/Virgl. > > Changelog: > > v4: - Improved SDL2/dmabuf patch by reusing existing Meson X11 config > option, better handling EGL error and extending comment telling > that it's safe to enable SDL2 EGL preference hint. As was suggested > by Akihiko Odaki. > > - Replaced another QSLIST_FOREACH_SAFE with QSLIST_EMPTY+FIRST in > the async-fencing patch for more consistency of the code. As was > suggested by Akihiko Odaki. > > - Added missing braces around if-statement that was spotted by > Alex Bennée. > > - Renamed 'drm=on' option of virtio-gpu-gl device to > 'drm_native_context=on' for more clarity as was suggested by > Alex Bennée. Haven't added added new context-type option that > was also proposed by Alex, might do it with a separate patch. > This context-type option will duplicate and depecate existing > options, but in a longer run likely will be worthwhile adding > it. > > - Dropped Linux headers-update patch as headers has been updated > in the staging tree. > > v3: - Improved EGL presence-check code on X11 systems for the SDL2 > hint that prefers EGL over GLX by using better ifdefs and checking > Xlib presence at a build time to avoid build failure if lib SDL2 > and system are configured with a disabled X11 support. Also added > clarifying comment telling that X11 hint doesn't affect Wayland > systems. Suggested by Akihiko Odaki. > > - Corrected strerror(err) that used negative error where it should > be positive and vice versa that was caught by Akihiko Odaki. Added > clarifying comment for the case where we get positive error code > from virglrenderer that differs from other virglrenderer API functions. > > - Improved QSLIST usage by dropping mutex protecting the async fence > list and using atomic variant of QSLIST helpers instead. Switched away > from using FOREACH helper to improve readability of the code, showing > that we don't precess list in unoptimal way. Like was suggested by > Akihiko Odaki. > > - Updated patchset base to Venus v18. > > v2: - Updated SDL2-dmabuf patch by making use of error_report() and > checking presense of X11+EGL in the system before making SDL2 > to prefer EGL backend over GLX, suggested by Akihiko Odaki. > > - Improved SDL2's dmabuf-presence check that wasn't done properly > in v1, where EGL was set up only after first console was fully > inited, and thus, SDL's display .has_dmabuf callback didn't work > for the first console. Now dmabuf support status is pre-checked > before console is registered. > > - Updated commit description of the patch that fixes SDL2's context > switching logic with a more detailed explanation of the problem. > Suggested by Akihiko Odaki. > > - Corrected rebase typo in the async-fencing patch and switched > async-fencing to use a sigle-linked list instead of the double, > as was suggested by Akihiko Odaki. > > - Replaced "=true" with "=on" in the DRM native context documentation > example and made virtio_gpu_virgl_init() to fail with a error message > if DRM context can't be initialized instead of giving a warning > message, as was suggested by Akihiko Odaki. > > - Added patchew's dependecy tag to the cover letter as was suggested by > Akihiko Odaki. > > Dmitry Osipenko (4): > ui/sdl2: Restore original context after new context creation > virtio-gpu: Handle virgl fence creation errors > virtio-gpu: Support asynchronous fencing > virtio-gpu: Support DRM native context > > Pierre-Eric Pelloux-Prayer (1): > ui/sdl2: Implement dpy dmabuf functions > > docs/system/devices/virtio-gpu.rst | 11 ++ > hw/display/virtio-gpu-gl.c | 5 + > hw/display/virtio-gpu-virgl.c | 158 ++++++++++++++++++++++++++--- > hw/display/virtio-gpu.c | 15 +++ > include/hw/virtio/virtio-gpu.h | 16 +++ > include/ui/sdl2.h | 7 ++ > meson.build | 6 +- > ui/sdl2-gl.c | 67 ++++++++++++ > ui/sdl2.c | 42 ++++++++ > 9 files changed, 309 insertions(+), 18 deletions(-) > Now this series looks good to me. Reviewed-by: Akihiko Odaki <akihiko.odaki@daynix.com>