On Fri, Aug 18, 2023 at 5:08 AM Akihiko Odaki <akihiko.od...@gmail.com>
wrote:

> On 2023/08/18 8:47, Gurchetan Singh wrote:
> >
> >
> > On Wed, Aug 16, 2023 at 10:28 PM Akihiko Odaki <akihiko.od...@gmail.com
> > <mailto:akihiko.od...@gmail.com>> wrote:
> >
> >     On 2023/08/17 11:23, Gurchetan Singh wrote:
> >      > From: Gurchetan Singh <gurchetansi...@chromium.org
> >     <mailto:gurchetansi...@chromium.org>>
> >      >
> >      > This adds basic documentation for virtio-gpu.
> >      >
> >      > Suggested-by: Akihiko Odaki <akihiko.od...@daynix.com
> >     <mailto:akihiko.od...@daynix.com>>
> >      > Signed-off-by: Gurchetan Singh <gurchetansi...@chromium.org
> >     <mailto:gurchetansi...@chromium.org>>
> >      > Tested-by: Alyssa Ross <h...@alyssa.is <mailto:h...@alyssa.is>>
> >      > Tested-by: Emmanouil Pitsidianakis
> >     <manos.pitsidiana...@linaro.org <mailto:
> manos.pitsidiana...@linaro.org>>
> >      > Reviewed-by: Emmanouil Pitsidianakis
> >     <manos.pitsidiana...@linaro.org <mailto:
> manos.pitsidiana...@linaro.org>>
> >      > ---
> >      > v2: - Incorporated suggestions by Akihiko Odaki
> >      >      - Listed the currently supported capset_names (Bernard)
> >      >
> >      > v3: - Incorporated suggestions by Akihiko Odaki and Alyssa Ross
> >      >
> >      > v4: - Incorporated suggestions by Akihiko Odaki
> >      >
> >      > v5: - Removed pci suffix from examples
> >      >      - Verified that -device virtio-gpu-rutabaga works.  Strangely
> >      >        enough, I don't remember changing anything, and I remember
> >      >        it not working.  I did rebase to top of tree though.
> >      >      - Fixed meson examples in crosvm docs
> >      >
> >      >   docs/system/device-emulation.rst   |   1 +
> >      >   docs/system/devices/virtio-gpu.rst | 113
> >     +++++++++++++++++++++++++++++
> >      >   2 files changed, 114 insertions(+)
> >      >   create mode 100644 docs/system/devices/virtio-gpu.rst
> >      >
> >      > diff --git a/docs/system/device-emulation.rst
> >     b/docs/system/device-emulation.rst
> >      > index 4491c4cbf7..1167f3a9f2 100644
> >      > --- a/docs/system/device-emulation.rst
> >      > +++ b/docs/system/device-emulation.rst
> >      > @@ -91,6 +91,7 @@ Emulated Devices
> >      >      devices/nvme.rst
> >      >      devices/usb.rst
> >      >      devices/vhost-user.rst
> >      > +   devices/virtio-gpu.rst
> >      >      devices/virtio-pmem.rst
> >      >      devices/vhost-user-rng.rst
> >      >      devices/canokey.rst
> >      > diff --git a/docs/system/devices/virtio-gpu.rst
> >     b/docs/system/devices/virtio-gpu.rst
> >      > new file mode 100644
> >      > index 0000000000..8c5c708272
> >      > --- /dev/null
> >      > +++ b/docs/system/devices/virtio-gpu.rst
> >      > @@ -0,0 +1,113 @@
> >      > +..
> >      > +   SPDX-License-Identifier: GPL-2.0
> >      > +
> >      > +virtio-gpu
> >      > +==========
> >      > +
> >      > +This document explains the setup and usage of the virtio-gpu
> device.
> >      > +The virtio-gpu device paravirtualizes the GPU and display
> >     controller.
> >      > +
> >      > +Linux kernel support
> >      > +--------------------
> >      > +
> >      > +virtio-gpu requires a guest Linux kernel built with the
> >      > +``CONFIG_DRM_VIRTIO_GPU`` option.
> >      > +
> >      > +QEMU virtio-gpu variants
> >      > +------------------------
> >      > +
> >      > +QEMU virtio-gpu device variants come in the following form:
> >      > +
> >      > + * ``virtio-vga[-BACKEND]``
> >      > + * ``virtio-gpu[-BACKEND][-INTERFACE]``
> >      > + * ``vhost-user-vga``
> >      > + * ``vhost-user-pci``
> >      > +
> >      > +**Backends:** QEMU provides a 2D virtio-gpu backend, and two
> >     accelerated
> >      > +backends: virglrenderer ('gl' device label) and rutabaga_gfx
> >     ('rutabaga'
> >      > +device label).  There is a vhost-user backend that runs the
> >     graphics stack
> >      > +in a separate process for improved isolation.
> >      > +
> >      > +**Interfaces:** QEMU further categorizes virtio-gpu device
> >     variants based
> >      > +on the interface exposed to the guest. The interfaces can be
> >     classified
> >      > +into VGA and non-VGA variants. The VGA ones are prefixed with
> >     virtio-vga
> >      > +or vhost-user-vga while the non-VGA ones are prefixed with
> >     virtio-gpu or
> >      > +vhost-user-gpu.
> >      > +
> >      > +The VGA ones always use the PCI interface, but for the non-VGA
> >     ones, the
> >      > +user can further pick between MMIO or PCI. For MMIO, the user
> >     can suffix
> >      > +the device name with -device, though vhost-user-gpu does not
> >     support MMIO.
> >      > +For PCI, the user can suffix it with -pci. Without these
> >     suffixes, the
> >      > +platform default will be chosen.
> >      > +
> >      > +virtio-gpu 2d
> >      > +-------------
> >      > +
> >      > +The default 2D backend only performs 2D operations. The guest
> >     needs to
> >      > +employ a software renderer for 3D graphics.
> >      > +
> >      > +Typically, the software renderer is provided by `Mesa`_ or
> >     `SwiftShader`_.
> >      > +Mesa's implementations (LLVMpipe, Lavapipe and virgl below) work
> >     out of box
> >      > +on typical modern Linux distributions.
> >      > +
> >      > +.. parsed-literal::
> >      > +    -device virtio-gpu
> >      > +
> >      > +.. _Mesa: https://www.mesa3d.org/ <https://www.mesa3d.org/>
> >      > +.. _SwiftShader: https://github.com/google/swiftshader
> >     <https://github.com/google/swiftshader>
> >      > +
> >      > +virtio-gpu virglrenderer
> >      > +------------------------
> >      > +
> >      > +When using virgl accelerated graphics mode in the guest, OpenGL
> >     API calls
> >      > +are translated into an intermediate representation (see
> >     `Gallium3D`_). The
> >      > +intermediate representation is communicated to the host and the
> >      > +`virglrenderer`_ library on the host translates the intermediate
> >      > +representation back to OpenGL API calls.
> >      > +
> >      > +.. parsed-literal::
> >      > +    -device virtio-gpu-gl
> >      > +
> >      > +.. _Gallium3D:
> >     https://www.freedesktop.org/wiki/Software/gallium/
> >     <https://www.freedesktop.org/wiki/Software/gallium/>
> >      > +.. _virglrenderer:
> >     https://gitlab.freedesktop.org/virgl/virglrenderer/
> >     <https://gitlab.freedesktop.org/virgl/virglrenderer/>
> >      > +
> >      > +virtio-gpu rutabaga
> >      > +-------------------
> >      > +
> >      > +virtio-gpu can also leverage `rutabaga_gfx`_ to provide
> `gfxstream`_
> >      > +rendering and `Wayland display passthrough`_.  With the
> >     gfxstream rendering
> >      > +mode, GLES and Vulkan calls are forwarded to the host with
> minimal
> >      > +modification.
> >      > +
> >      > +The crosvm book provides directions on how to build a
> >     `gfxstream-enabled
> >      > +rutabaga`_ and launch a `guest Wayland proxy`_.
> >      > +
> >      > +This device does require host blob support (``hostmem`` field
> >     below). The
> >      > +``hostmem`` field specifies the size of virtio-gpu host memory
> >     window.
> >      > +This is typically between 256M and 8G.
> >      > +
> >      > +At least one capset (see colon separated ``capset_names`` below)
> >     must be
> >      > +specified when starting the device.  The currently supported
> >      > +``capset_names`` are ``gfxstream-vulkan`` and ``cross-domain``
> >     on Linux
> >      > +guests. For Android guests, ``gfxstream-gles`` is also supported.
> >      > +
> >      > +The device will try to auto-detect the wayland socket path if the
> >      > +``cross-domain`` capset name is set.  The user may optionally
> >     specify
> >      > +``wayland_socket_path`` for non-standard paths.
> >      > +
> >      > +The ``wsi`` option can be set to ``surfaceless`` or ``headless``.
> >      > +Surfaceless doesn't create a native window surface, but does
> >     copy from the
> >      > +render target to the Pixman buffer if a virtio-gpu 2D hypercall
> >     is issued.
> >      > +Headless is like surfaceless, but doesn't copy to the Pixman
> buffer.
> >      > +Surfaceless is the default if ``wsi`` is not specified.
> >      > +
> >      > +.. parsed-literal::
> >      > +    -device
> >     virtio-gpu-rutabaga,capset_names=gfxstream-vulkan:cross-domain,
> >      > +
> >       hostmem=8G,wayland_socket_path=/tmp/nonstandard/mock_wayland.sock,
> >      > +       wsi=headless
> >      > +
> >      > +.. _rutabaga_gfx:
> >
> https://github.com/google/crosvm/blob/main/rutabaga_gfx/ffi/src/include/rutabaga_gfx_ffi.h
> <
> https://github.com/google/crosvm/blob/main/rutabaga_gfx/ffi/src/include/rutabaga_gfx_ffi.h
> >
> >      > +.. _gfxstream:
> >     https://android.googlesource.com/platform/hardware/google/gfxstream/
> >     <
> https://android.googlesource.com/platform/hardware/google/gfxstream/>
> >      > +.. _Wayland display passthrough:
> >     https://www.youtube.com/watch?v=OZJiHMtIQ2M
> >     <https://www.youtube.com/watch?v=OZJiHMtIQ2M>
> >      > +.. _gfxstream-enabled rutabaga:
> >     https://crosvm.dev/book/appendix/rutabaga_gfx.html
> >     <https://crosvm.dev/book/appendix/rutabaga_gfx.html>
> >
> >     You have different links for "rutabaga_gfx" and "gfxstream-enabled
> >     rutabaga", but I think you only need one.
> >
> >
> > Done.  Didn't resend the entire patch series (to avoid spamming list),
> > just did "in-reply-to".  The change is also available at:
> >
> >
> https://gitlab.freedesktop.org/gurchetansingh/qemu-gfxstream/-/commits/qemu-gfxstream-v8
> <
> https://gitlab.freedesktop.org/gurchetansingh/qemu-gfxstream/-/commits/qemu-gfxstream-v8
> >
>
> The patch series now looks good so I finally decided to try this patch
> series, but I couldn't get it work.
>
> I noticed gfxstream has page size hardcoded as 4 KiB, which broke my
> setup on M2 MacBook Air (running Asahi Linux) that has 16 KiB page. You
> may add code to check host page size and to report an error if it's not
> 4 KiB to virtio-gpu-rutabaga, but I think it's trivial to fix gfxstream
> to query page size at runtime as QEMU and Rutabaga does so I hope you to
> do so. For testing purpose, I have replaced it with 16 KiB on my setup.
>

Good catch, the fix to the 16KiB was merged today and is in gfxstream ToT
right now.


>
> I also found some bugs on QEMU side so I added comments to respective
> patches.
>
> Below is the logs from my last attempt of running vkgears:
>
> $ VK_LOADER_DEBUG=all demos/build/src/vulkan/vkgears
> INFO:             Vulkan Loader Version 1.3.243
> LAYER:            Searching for layer manifest files
> LAYER:               In following locations:
> LAYER:                  /var/home/person/.config/vulkan/implicit_layer.d
> LAYER:                  /etc/xdg/vulkan/implicit_layer.d
> LAYER:                  /etc/vulkan/implicit_layer.d
> LAYER:
> /var/home/person/.local/share/vulkan/implicit_layer.d
> LAYER:
> /var/home/person/.local/share/flatpak/exports/share/vulkan/implicit_layer.d
> LAYER:
> /var/lib/flatpak/exports/share/vulkan/implicit_layer.d
> LAYER:                  /usr/local/share/vulkan/implicit_layer.d
> LAYER:                  /usr/share/vulkan/implicit_layer.d
> LAYER:               Found the following files:
> LAYER:
> /usr/share/vulkan/implicit_layer.d/VkLayer_MESA_device_select.json
> INFO:             Found manifest file
> /usr/share/vulkan/implicit_layer.d/VkLayer_MESA_device_select.json (file
> version "1.0.0")
> LAYER:            Searching for layer manifest files
> LAYER:               In following locations:
> LAYER:                  /var/home/person/.config/vulkan/explicit_layer.d
> LAYER:                  /etc/xdg/vulkan/explicit_layer.d
> LAYER:                  /etc/vulkan/explicit_layer.d
> LAYER:
> /var/home/person/.local/share/vulkan/explicit_layer.d
> LAYER:
> /var/home/person/.local/share/flatpak/exports/share/vulkan/explicit_layer.d
> LAYER:
> /var/lib/flatpak/exports/share/vulkan/explicit_layer.d
> LAYER:                  /usr/local/share/vulkan/explicit_layer.d
> LAYER:                  /usr/share/vulkan/explicit_layer.d
> LAYER:               Found no files
> DRIVER:           Searching for driver manifest files
> DRIVER:              In following locations:
> DRIVER:                 /var/home/person/.config/vulkan/icd.d
> DRIVER:                 /etc/xdg/vulkan/icd.d
> DRIVER:                 /etc/vulkan/icd.d
> DRIVER:                 /var/home/person/.local/share/vulkan/icd.d
> DRIVER:
> /var/home/person/.local/share/flatpak/exports/share/vulkan/icd.d
> DRIVER:                 /var/lib/flatpak/exports/share/vulkan/icd.d
> DRIVER:                 /usr/local/share/vulkan/icd.d
> DRIVER:                 /usr/share/vulkan/icd.d
> DRIVER:              Found the following files:
> DRIVER:
> /usr/local/share/vulkan/icd.d/cereal_icd.aarch64.json
> DRIVER:                 /usr/share/vulkan/icd.d/broadcom_icd.aarch64.json
> DRIVER:                 /usr/share/vulkan/icd.d/freedreno_icd.aarch64.json
> DRIVER:                 /usr/share/vulkan/icd.d/lvp_icd.aarch64.json
> DRIVER:                 /usr/share/vulkan/icd.d/panfrost_icd.aarch64.json
> DRIVER:                 /usr/share/vulkan/icd.d/radeon_icd.aarch64.json
> DRIVER:           Found ICD manifest file
> /usr/local/share/vulkan/icd.d/cereal_icd.aarch64.json, version "1.0.0"
> DEBUG | DRIVER:   Searching for ICD drivers named
> /usr/local/lib64/libvulkan_cereal.so
> [VirtGpuDevice.cpp(71)]
> [prio 6] virtgpu backend not enabling
> VIRTGPU_PARAM_CREATE_GUEST_HANDLE[AndroidHealthMonitor.cpp(275)]
> [prio 4] HealthMonitor disabled. Returning nullptrI0818 21:00:07.980257
> 154451 IntelDrmDecoder.cpp:38] IntelDrmDecoder created for context 2
> DRIVER:           Found ICD manifest file
> /usr/share/vulkan/icd.d/broadcom_icd.aarch64.json, version "1.0.0"
> DEBUG | DRIVER:   Searching for ICD drivers named
> /usr/lib64/libvulkan_broadcom.so
> DRIVER:           Found ICD manifest file
> /usr/share/vulkan/icd.d/freedreno_icd.aarch64.json, version "1.0.0"
> DEBUG | DRIVER:   Searching for ICD drivers named
> /usr/lib64/libvulkan_freedreno.so
> DRIVER:           Found ICD manifest file
> /usr/share/vulkan/icd.d/lvp_icd.aarch64.json, version "1.0.0"
> DEBUG | DRIVER:   Searching for ICD drivers named
> /usr/lib64/libvulkan_lvp.so
> DRIVER:           Found ICD manifest file
> /usr/share/vulkan/icd.d/panfrost_icd.aarch64.json, version "1.0.0"
> DEBUG | DRIVER:   Searching for ICD drivers named
> /usr/lib64/libvulkan_panfrost.so
> DRIVER:           Found ICD manifest file
> /usr/share/vulkan/icd.d/radeon_icd.aarch64.json, version "1.0.0"
> DEBUG | DRIVER:   Searching for ICD drivers named
> /usr/lib64/libvulkan_radeon.so
> DEBUG | LAYER:    Loading layer library libVkLayer_MESA_device_select.so
> INFO | LAYER:     Insert instance layer "VK_LAYER_MESA_device_select"
> (libVkLayer_MESA_device_select.so)
> LAYER:            vkCreateInstance layer callstack setup to:
> LAYER:               <Application>
> LAYER:                 ||
> LAYER:               <Loader>
> LAYER:                 ||
> LAYER:               VK_LAYER_MESA_device_select
> LAYER:                       Type: Implicit
> LAYER:                           Disable Env Var:  NODEVICE_SELECT
> LAYER:                       Manifest:
> /usr/share/vulkan/implicit_layer.d/VkLayer_MESA_device_select.json
> LAYER:                       Library:  libVkLayer_MESA_device_select.so
> LAYER:                 ||
> LAYER:               <Drivers>
> I0818 21:00:08.014896  154451 VkDecoderGlobalState.cpp:443] Creating
> Vulkan instance for app: vkgears
> INFO | DRIVER:    linux_read_sorted_physical_devices:
> INFO | DRIVER:         Original order:
> INFO | DRIVER:               [0] llvmpipe (LLVM 16.0.6, 128 bits)
> INFO | DRIVER:               [1] llvmpipe (LLVM 15.0.7, 128 bits)
> INFO | DRIVER:         Sorted order:
> INFO | DRIVER:               [0] llvmpipe (LLVM 15.0.7, 128 bits)
> INFO | DRIVER:               [1] llvmpipe (LLVM 16.0.6, 128 bits)
> INFO | DRIVER:    linux_read_sorted_physical_devices:
> INFO | DRIVER:         Original order:
> INFO | DRIVER:               [0] llvmpipe (LLVM 16.0.6, 128 bits)
> INFO | DRIVER:               [1] llvmpipe (LLVM 15.0.7, 128 bits)
> INFO | DRIVER:         Sorted order:
> INFO | DRIVER:               [0] llvmpipe (LLVM 15.0.7, 128 bits)
> INFO | DRIVER:               [1] llvmpipe (LLVM 16.0.6, 128 bits)
> DEBUG | DRIVER:   Copying old device 0 into new device 0
> DEBUG | DRIVER:   Copying old device 1 into new device 1
> INFO | DRIVER:    linux_read_sorted_physical_devices:
> INFO | DRIVER:         Original order:
> INFO | DRIVER:               [0] llvmpipe (LLVM 16.0.6, 128 bits)
> INFO | DRIVER:               [1] llvmpipe (LLVM 15.0.7, 128 bits)
> INFO | DRIVER:         Sorted order:
> INFO | DRIVER:               [0] llvmpipe (LLVM 15.0.7, 128 bits)
> INFO | DRIVER:               [1] llvmpipe (LLVM 16.0.6, 128 bits)
> DEBUG | DRIVER:   Copying old device 0 into new device 0
> DEBUG | DRIVER:   Copying old device 1 into new device 1
> INFO | DRIVER:    linux_read_sorted_physical_devices:
> INFO | DRIVER:         Original order:
> INFO | DRIVER:               [0] llvmpipe (LLVM 16.0.6, 128 bits)
> INFO | DRIVER:               [1] llvmpipe (LLVM 15.0.7, 128 bits)
> INFO | DRIVER:         Sorted order:
> INFO | DRIVER:               [0] llvmpipe (LLVM 15.0.7, 128 bits)
> INFO | DRIVER:               [1] llvmpipe (LLVM 16.0.6, 128 bits)
> DEBUG | DRIVER:   Copying old device 0 into new device 0
> DEBUG | DRIVER:   Copying old device 1 into new device 1
> ERROR:            loader_validate_device_extensions: Device extension
> VK_KHR_swapchain not supported by selected physical device or enabled


Yeah, any non-headless Linux tests are unlikely to work.  Maybe in a future
gfxstream release, since our focus is of course on Android and getting
Vulkan in QEMU in general.


>
> layers.
> ERROR:            vkCreateDevice: Failed to validate extensions in list
> ERROR:            vkGetDeviceQueue2: Invalid device
> [VUID-vkGetDeviceQueue2-device-parameter]
> Aborted (core dumped)
>

Reply via email to