Files
server/usr/share/doc/qemu-system-common/system/devices/virtio-gpu.html
2026-01-07 20:52:11 +01:00

270 lines
19 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="../../">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>virtio-gpu &mdash; QEMU Debian 1:8.2.2+ds-0ubuntu1.11 documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../../_static/css/theme.css?v=86f27845" />
<link rel="stylesheet" type="text/css" href="../../_static/theme_overrides.css?v=08e6c168" />
<link rel="shortcut icon" href="../../_static/qemu_32x32.png"/>
<script src="../../_static/jquery.js?v=8dae8fb0"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="../../_static/documentation_options.js?v=802af9f6"></script>
<script src="../../_static/doctools.js?v=888ff710"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/custom.js?v=2ab9f71d"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<link rel="next" title="virtio pmem" href="virtio-pmem.html" />
<link rel="prev" title="vhost-user back ends" href="vhost-user.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" style="background: #802400" >
<a href="../../index.html" class="icon icon-home">
QEMU
<img src="../../_static/qemu_128x128.png" class="logo" alt="Logo"/>
</a>
<div class="version">
8.2.2
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../about/index.html">About QEMU</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../index.html">System Emulation</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../introduction.html">Introduction</a></li>
<li class="toctree-l2"><a class="reference internal" href="../invocation.html">Invocation</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="../device-emulation.html">Device Emulation</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="../device-emulation.html#common-terms">Common Terms</a></li>
<li class="toctree-l3 current"><a class="reference internal" href="../device-emulation.html#emulated-devices">Emulated Devices</a><ul class="current">
<li class="toctree-l4"><a class="reference internal" href="can.html">CAN Bus Emulation Support</a></li>
<li class="toctree-l4"><a class="reference internal" href="ccid.html">Chip Card Interface Device (CCID)</a></li>
<li class="toctree-l4"><a class="reference internal" href="cxl.html">Compute Express Link (CXL)</a></li>
<li class="toctree-l4"><a class="reference internal" href="ivshmem.html">Inter-VM Shared Memory device</a></li>
<li class="toctree-l4"><a class="reference internal" href="keyboard.html">Sparc32 keyboard</a></li>
<li class="toctree-l4"><a class="reference internal" href="net.html">Network emulation</a></li>
<li class="toctree-l4"><a class="reference internal" href="nvme.html">NVMe Emulation</a></li>
<li class="toctree-l4"><a class="reference internal" href="usb.html">USB emulation</a></li>
<li class="toctree-l4"><a class="reference internal" href="vhost-user.html">vhost-user back ends</a></li>
<li class="toctree-l4 current"><a class="current reference internal" href="#">virtio-gpu</a></li>
<li class="toctree-l4"><a class="reference internal" href="virtio-pmem.html">virtio pmem</a></li>
<li class="toctree-l4"><a class="reference internal" href="virtio-snd.html">virtio sound</a></li>
<li class="toctree-l4"><a class="reference internal" href="vhost-user-rng.html">QEMU vhost-user-rng - RNG emulation</a></li>
<li class="toctree-l4"><a class="reference internal" href="canokey.html">CanoKey QEMU</a></li>
<li class="toctree-l4"><a class="reference internal" href="usb-u2f.html">Universal Second Factor (U2F) USB Key Device</a></li>
<li class="toctree-l4"><a class="reference internal" href="igb.html">igb</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../keys.html">Keys in the graphical frontends</a></li>
<li class="toctree-l2"><a class="reference internal" href="../mux-chardev.html">Keys in the character backend multiplexer</a></li>
<li class="toctree-l2"><a class="reference internal" href="../monitor.html">QEMU Monitor</a></li>
<li class="toctree-l2"><a class="reference internal" href="../images.html">Disk Images</a></li>
<li class="toctree-l2"><a class="reference internal" href="../virtio-net-failover.html">QEMU virtio-net standby (net_failover)</a></li>
<li class="toctree-l2"><a class="reference internal" href="../linuxboot.html">Direct Linux Boot</a></li>
<li class="toctree-l2"><a class="reference internal" href="../generic-loader.html">Generic Loader</a></li>
<li class="toctree-l2"><a class="reference internal" href="../guest-loader.html">Guest Loader</a></li>
<li class="toctree-l2"><a class="reference internal" href="../barrier.html">QEMU Barrier Client</a></li>
<li class="toctree-l2"><a class="reference internal" href="../vnc-security.html">VNC security</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tls.html">TLS setup for network services</a></li>
<li class="toctree-l2"><a class="reference internal" href="../secrets.html">Providing secret data to QEMU</a></li>
<li class="toctree-l2"><a class="reference internal" href="../authz.html">Client authorization</a></li>
<li class="toctree-l2"><a class="reference internal" href="../gdb.html">GDB usage</a></li>
<li class="toctree-l2"><a class="reference internal" href="../replay.html">Record/replay</a></li>
<li class="toctree-l2"><a class="reference internal" href="../managed-startup.html">Managed start up options</a></li>
<li class="toctree-l2"><a class="reference internal" href="../bootindex.html">Managing device boot order with bootindex properties</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cpu-hotplug.html">Virtual CPU hotplug</a></li>
<li class="toctree-l2"><a class="reference internal" href="../pr-manager.html">Persistent reservation managers</a></li>
<li class="toctree-l2"><a class="reference internal" href="../targets.html">QEMU System Emulator Targets</a></li>
<li class="toctree-l2"><a class="reference internal" href="../security.html">Security</a></li>
<li class="toctree-l2"><a class="reference internal" href="../multi-process.html">Multi-process QEMU</a></li>
<li class="toctree-l2"><a class="reference internal" href="../confidential-guest-support.html">Confidential Guest Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../vm-templating.html">QEMU VM templating</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User Mode Emulation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../tools/index.html">Tools</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../interop/index.html">System Emulation Management and Interoperability</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../specs/index.html">System Emulation Guest Hardware Specifications</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../devel/index.html">Developer Information</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" style="background: #802400" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">QEMU</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="../index.html">System Emulation</a></li>
<li class="breadcrumb-item"><a href="../device-emulation.html">Device Emulation</a></li>
<li class="breadcrumb-item active">virtio-gpu</li>
<li class="wy-breadcrumbs-aside">
<a href="https://gitlab.com/qemu-project/qemu/blob/master/docs/system/devices/virtio-gpu.rst" class="fa fa-gitlab"> Edit on GitLab</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="virtio-gpu">
<h1>virtio-gpu<a class="headerlink" href="#virtio-gpu" title="Link to this heading"></a></h1>
<p>This document explains the setup and usage of the virtio-gpu device.
The virtio-gpu device paravirtualizes the GPU and display controller.</p>
<section id="linux-kernel-support">
<h2>Linux kernel support<a class="headerlink" href="#linux-kernel-support" title="Link to this heading"></a></h2>
<p>virtio-gpu requires a guest Linux kernel built with the
<code class="docutils literal notranslate"><span class="pre">CONFIG_DRM_VIRTIO_GPU</span></code> option.</p>
</section>
<section id="qemu-virtio-gpu-variants">
<h2>QEMU virtio-gpu variants<a class="headerlink" href="#qemu-virtio-gpu-variants" title="Link to this heading"></a></h2>
<p>QEMU virtio-gpu device variants come in the following form:</p>
<blockquote>
<div><ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">virtio-vga[-BACKEND]</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">virtio-gpu[-BACKEND][-INTERFACE]</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">vhost-user-vga</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">vhost-user-pci</span></code></p></li>
</ul>
</div></blockquote>
<p><strong>Backends:</strong> 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.</p>
<p><strong>Interfaces:</strong> 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.</p>
<p>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.</p>
</section>
<section id="virtio-gpu-2d">
<h2>virtio-gpu 2d<a class="headerlink" href="#virtio-gpu-2d" title="Link to this heading"></a></h2>
<p>The default 2D backend only performs 2D operations. The guest needs to
employ a software renderer for 3D graphics.</p>
<p>Typically, the software renderer is provided by <a class="reference external" href="https://www.mesa3d.org/">Mesa</a> or <a class="reference external" href="https://github.com/google/swiftshader">SwiftShader</a>.
Mesas implementations (LLVMpipe, Lavapipe and virgl below) work out of box
on typical modern Linux distributions.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">-</span><span class="n">device</span> <span class="n">virtio</span><span class="o">-</span><span class="n">gpu</span>
</pre></div>
</div>
</section>
<section id="virtio-gpu-virglrenderer">
<h2>virtio-gpu virglrenderer<a class="headerlink" href="#virtio-gpu-virglrenderer" title="Link to this heading"></a></h2>
<p>When using virgl accelerated graphics mode in the guest, OpenGL API calls
are translated into an intermediate representation (see <a class="reference external" href="https://www.freedesktop.org/wiki/Software/gallium/">Gallium3D</a>). The
intermediate representation is communicated to the host and the
<a class="reference external" href="https://gitlab.freedesktop.org/virgl/virglrenderer/">virglrenderer</a> library on the host translates the intermediate
representation back to OpenGL API calls.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">-</span><span class="n">device</span> <span class="n">virtio</span><span class="o">-</span><span class="n">gpu</span><span class="o">-</span><span class="n">gl</span>
</pre></div>
</div>
</section>
<section id="virtio-gpu-rutabaga">
<h2>virtio-gpu rutabaga<a class="headerlink" href="#virtio-gpu-rutabaga" title="Link to this heading"></a></h2>
<p>virtio-gpu can also leverage rutabaga_gfx to provide <a class="reference external" href="https://android.googlesource.com/platform/hardware/google/gfxstream/">gfxstream</a>
rendering and <a class="reference external" href="https://www.youtube.com/watch?v=OZJiHMtIQ2M">Wayland display passthrough</a>. With the gfxstream rendering
mode, GLES and Vulkan calls are forwarded to the host with minimal
modification.</p>
<p>The crosvm book provides directions on how to build a <a class="reference external" href="https://crosvm.dev/book/appendix/rutabaga_gfx.html">gfxstream-enabled
rutabaga</a> and launch a <a class="reference external" href="https://crosvm.dev/book/devices/wayland.html">guest Wayland proxy</a>.</p>
<p>This device does require host blob support (<code class="docutils literal notranslate"><span class="pre">hostmem</span></code> field below). The
<code class="docutils literal notranslate"><span class="pre">hostmem</span></code> field specifies the size of virtio-gpu host memory window.
This is typically between 256M and 8G.</p>
<p>At least one virtio-gpu capability set (“capset”) must be specified when
starting the device. The currently capsets supported are <code class="docutils literal notranslate"><span class="pre">gfxstream-vulkan</span></code>
and <code class="docutils literal notranslate"><span class="pre">cross-domain</span></code> for Linux guests. For Android guests, the experimental
<code class="docutils literal notranslate"><span class="pre">x-gfxstream-gles</span></code> and <code class="docutils literal notranslate"><span class="pre">x-gfxstream-composer</span></code> capsets are also supported.</p>
<p>The device will try to auto-detect the wayland socket path if the
<code class="docutils literal notranslate"><span class="pre">cross-domain</span></code> capset name is set. The user may optionally specify
<code class="docutils literal notranslate"><span class="pre">wayland-socket-path</span></code> for non-standard paths.</p>
<p>The <code class="docutils literal notranslate"><span class="pre">wsi</span></code> option can be set to <code class="docutils literal notranslate"><span class="pre">surfaceless</span></code> or <code class="docutils literal notranslate"><span class="pre">headless</span></code>.
Surfaceless doesnt 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 doesnt copy to the Pixman buffer.
Surfaceless is the default if <code class="docutils literal notranslate"><span class="pre">wsi</span></code> is not specified.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">-</span><span class="n">device</span> <span class="n">virtio</span><span class="o">-</span><span class="n">gpu</span><span class="o">-</span><span class="n">rutabaga</span><span class="p">,</span><span class="n">gfxstream</span><span class="o">-</span><span class="n">vulkan</span><span class="o">=</span><span class="n">on</span><span class="p">,</span><span class="n">cross</span><span class="o">-</span><span class="n">domain</span><span class="o">=</span><span class="n">on</span><span class="p">,</span>
<span class="n">hostmem</span><span class="o">=</span><span class="mi">8</span><span class="n">G</span><span class="p">,</span><span class="n">wayland</span><span class="o">-</span><span class="n">socket</span><span class="o">-</span><span class="n">path</span><span class="o">=/</span><span class="n">tmp</span><span class="o">/</span><span class="n">nonstandard</span><span class="o">/</span><span class="n">mock_wayland</span><span class="o">.</span><span class="n">sock</span><span class="p">,</span>
<span class="n">wsi</span><span class="o">=</span><span class="n">headless</span>
</pre></div>
</div>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="vhost-user.html" class="btn btn-neutral float-left" title="vhost-user back ends" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="virtio-pmem.html" class="btn btn-neutral float-right" title="virtio pmem" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2025, The QEMU Project Developers.</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
<!-- Empty para to force a blank line after "Built with Sphinx ..." -->
<p></p>
<p>This documentation is for QEMU version 8.2.2.</p>
<p><a href="../../about/license.html">QEMU and this manual are released under the
GNU General Public License, version 2.</a></p>
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>