1848b8605Smrg<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2848b8605Smrg<html lang="en"> 3848b8605Smrg<head> 4848b8605Smrg <meta http-equiv="content-type" content="text/html; charset=utf-8"> 5848b8605Smrg <title>VMware guest GL driver</title> 6848b8605Smrg <link rel="stylesheet" type="text/css" href="mesa.css"> 7848b8605Smrg</head> 8848b8605Smrg<body> 9848b8605Smrg 10848b8605Smrg<div class="header"> 11848b8605Smrg <h1>The Mesa 3D Graphics Library</h1> 12848b8605Smrg</div> 13848b8605Smrg 14848b8605Smrg<iframe src="contents.html"></iframe> 15848b8605Smrg<div class="content"> 16848b8605Smrg 17848b8605Smrg<h1>VMware guest GL driver</h1> 18848b8605Smrg 19848b8605Smrg<p> 20848b8605SmrgThis page describes how to build, install and use the 21b8e80941Smrg<a href="https://www.vmware.com/">VMware</a> guest GL driver 22848b8605Smrg(aka the SVGA or SVGA3D driver) for Linux using the latest source code. 23848b8605SmrgThis driver gives a Linux virtual machine access to the host's GPU for 24848b8605Smrghardware-accelerated 3D. 25848b8605SmrgVMware Workstation running on Linux or Windows and VMware Fusion running on 26848b8605SmrgMacOS are all supported. 27848b8605Smrg</p> 28848b8605Smrg 29b8e80941Smrg<p> 30b8e80941SmrgWith the August 2015 Workstation 12 / Fusion 8 releases, OpenGL 3.3 31b8e80941Smrgis supported in the guest. 32b8e80941SmrgThis requires: 33b8e80941Smrg</p> 34b8e80941Smrg<ul> 35b8e80941Smrg<li>The VM is configured for virtual hardware version 12. 36b8e80941Smrg<li>The host OS, GPU and graphics driver supports DX11 (Windows) or 37b8e80941Smrg OpenGL 4.0 (Linux, Mac) 38b8e80941Smrg<li>On Linux, the vmwgfx kernel module must be version 2.9.0 or later. 39b8e80941Smrg<li>A recent version of Mesa with the updated svga gallium driver. 40b8e80941Smrg</ul> 41b8e80941Smrg 42b8e80941Smrg<p> 43b8e80941SmrgOtherwise, OpenGL 2.1 is supported. 44b8e80941Smrg</p> 45b8e80941Smrg 46b8e80941Smrg<p> 47b8e80941SmrgWith the Fall 2018 Workstation 15 / Fusion 11 releases, additional 48b8e80941Smrgfeatures are supported in the driver: 49b8e80941Smrg<ul> 50b8e80941Smrg<li>Multisample antialiasing (2x, 4x) 51b8e80941Smrg<li>GL_ARB/AMD_draw_buffers_blend 52b8e80941Smrg<li>GL_ARB_sample_shading 53b8e80941Smrg<li>GL_ARB_texture_cube_map_array 54b8e80941Smrg<li>GL_ARB_texture_gather 55b8e80941Smrg<li>GL_ARB_texture_query_lod 56b8e80941Smrg<li>GL_EXT/OES_draw_buffers_indexed 57b8e80941Smrg</ul> 58b8e80941Smrg<p> 59b8e80941SmrgThis requires version 2.15.0 or later of the vmwgfx kernel module and 60b8e80941Smrgthe VM must be configured for hardware version 16 or later. 61b8e80941Smrg</p> 62b8e80941Smrg 63b8e80941Smrg<p> 64b8e80941SmrgOpenGL 3.3 support can be disabled by setting the environment variable 65b8e80941SmrgSVGA_VGPU10=0. 66b8e80941SmrgYou will then have OpenGL 2.1 support. 67b8e80941SmrgThis may be useful to work around application bugs (such as incorrect use 68b8e80941Smrgof the OpenGL 3.x core profile). 69b8e80941Smrg</p> 70b8e80941Smrg 71848b8605Smrg<p> 72848b8605SmrgMost modern Linux distros include the SVGA3D driver so end users shouldn't 73848b8605Smrgbe concerned with this information. 74848b8605SmrgBut if your distro lacks the driver or you want to update to the latest code 75848b8605Smrgthese instructions explain what to do. 76848b8605Smrg</p> 77848b8605Smrg 78848b8605Smrg<p> 79848b8605SmrgFor more information about the X components see these wiki pages at x.org: 80848b8605Smrg</p> 81848b8605Smrg<ul> 82b8e80941Smrg<li><a href="https://wiki.x.org/wiki/vmware"> 83848b8605SmrgDriver Overview</a> 84b8e80941Smrg<li><a href="https://wiki.x.org/wiki/vmware/vmware3D"> 85848b8605Smrgxf86-video-vmware Details</a> 86848b8605Smrg</ul> 87848b8605Smrg 88848b8605Smrg 89848b8605Smrg<h2>Components</h2> 90848b8605Smrg 91848b8605SmrgThe components involved in this include: 92848b8605Smrg<ul> 93848b8605Smrg<li>Linux kernel module: vmwgfx 94848b8605Smrg<li>X server 2D driver: xf86-video-vmware 95848b8605Smrg<li>User-space libdrm library 96848b8605Smrg<li>Mesa/gallium OpenGL driver: "svga" 97848b8605Smrg</ul> 98848b8605Smrg 99848b8605Smrg<p> 100848b8605SmrgAll of these components reside in the guest Linux virtual machine. 101848b8605SmrgOn the host, all you're doing is running VMware 102b8e80941Smrg<a href="https://www.vmware.com/products/workstation/">Workstation</a> or 103b8e80941Smrg<a href="https://www.vmware.com/products/fusion/">Fusion</a>. 104848b8605Smrg</p> 105848b8605Smrg 106848b8605Smrg 107848b8605Smrg<h2>Prerequisites</h2> 108848b8605Smrg 109848b8605Smrg<ul> 110848b8605Smrg<li>Kernel version at least 2.6.25 111848b8605Smrg<li>Xserver version at least 1.7 112848b8605Smrg<li>Ubuntu: For ubuntu you need to install a number of build dependencies. 113848b8605Smrg <pre> 114848b8605Smrg sudo apt-get install git-core 115848b8605Smrg sudo apt-get install automake libtool libpthread-stubs0-dev 116848b8605Smrg sudo apt-get install xserver-xorg-dev x11proto-xinerama-dev libx11-xcb-dev 117848b8605Smrg sudo apt-get install libxcb-glx0-dev libxrender-dev 118848b8605Smrg sudo apt-get build-dep libgl1-mesa-dri libxcb-glx0-dev 119848b8605Smrg </pre> 120848b8605Smrg<li>Fedora: For Fedora you also need to install a number of build dependencies. 121848b8605Smrg <pre> 122848b8605Smrg sudo yum install mesa-libGL-devel xorg-x11-server-devel xorg-x11-util-macros 123848b8605Smrg sudo yum install libXrender-devel.i686 124848b8605Smrg sudo yum install automake gcc libtool expat-devel kernel-devel git-core 125848b8605Smrg sudo yum install makedepend flex bison 126848b8605Smrg </pre> 127848b8605Smrg</ul> 128848b8605Smrg 129848b8605Smrg<p> 130848b8605SmrgDepending on your Linux distro, other packages may be needed. 131848b8605SmrgThe configure scripts should tell you what's missing. 132848b8605Smrg</p> 133848b8605Smrg 134848b8605Smrg 135848b8605Smrg 136848b8605Smrg<h2>Getting the Latest Source Code</h2> 137848b8605Smrg 138848b8605SmrgBegin by saving your current directory location: 139848b8605Smrg <pre> 140848b8605Smrg export TOP=$PWD 141848b8605Smrg </pre> 142848b8605Smrg 143848b8605Smrg<ul> 144848b8605Smrg<li>Mesa/Gallium master branch. This code is used to build libGL, and the direct rendering svga driver for libGL, vmwgfx_dri.so, and the X acceleration library libxatracker.so.x.x.x. 145848b8605Smrg <pre> 146b8e80941Smrg git clone https://gitlab.freedesktop.org/mesa/mesa.git 147848b8605Smrg </pre> 148848b8605Smrg<li>VMware Linux guest kernel module. Note that this repo contains the complete DRM and TTM code. The vmware-specific driver is really only the files prefixed with vmwgfx. 149848b8605Smrg <pre> 150848b8605Smrg git clone git://anongit.freedesktop.org/git/mesa/vmwgfx 151848b8605Smrg </pre> 152848b8605Smrg<li>libdrm, a user-space library that interfaces with drm. 153848b8605SmrgMost distros ship with this but it's safest to install a newer version. 154848b8605SmrgTo get the latest code from git: 155848b8605Smrg <pre> 156b8e80941Smrg git clone https://gitlab.freedesktop.org/mesa/drm.git 157848b8605Smrg </pre> 158848b8605Smrg<li>xf86-video-vmware. The chainloading driver, vmware_drv.so, the legacy driver vmwlegacy_drv.so, and the vmwgfx driver vmwgfx_drv.so. 159848b8605Smrg <pre> 160848b8605Smrg git clone git://anongit.freedesktop.org/git/xorg/driver/xf86-video-vmware 161848b8605Smrg </pre> 162848b8605Smrg</ul> 163848b8605Smrg 164848b8605Smrg 165848b8605Smrg<h2>Building the Code</h2> 166848b8605Smrg 167848b8605Smrg<ul> 168b8e80941Smrg<li> 169b8e80941SmrgDetermine where the GL-related libraries reside on your system and set 170b8e80941Smrgthe LIBDIR environment variable accordingly. 171b8e80941Smrg<br><br> 172b8e80941SmrgFor 32-bit Ubuntu systems: 173b8e80941Smrg<pre> 174b8e80941Smrg export LIBDIR=/usr/lib/i386-linux-gnu 175b8e80941Smrg</pre> 176b8e80941SmrgFor 64-bit Ubuntu systems: 177b8e80941Smrg<pre> 178b8e80941Smrg export LIBDIR=/usr/lib/x86_64-linux-gnu 179b8e80941Smrg</pre> 180b8e80941SmrgFor 32-bit Fedora systems: 181b8e80941Smrg<pre> 182b8e80941Smrg export LIBDIR=/usr/lib 183b8e80941Smrg</pre> 184b8e80941SmrgFor 64-bit Fedora systems: 185b8e80941Smrg<pre> 186b8e80941Smrg export LIBDIR=/usr/lib64 187b8e80941Smrg</pre> 188b8e80941Smrg 189b8e80941Smrg</li> 190b8e80941Smrg 191b8e80941Smrg<li>Build libdrm: 192848b8605Smrg <pre> 193848b8605Smrg cd $TOP/drm 194b8e80941Smrg meson builddir --prefix=/usr --libdir=${LIBDIR} 195b8e80941Smrg ninja -C builddir 196b8e80941Smrg sudo ninja -C builddir install 197848b8605Smrg </pre> 198848b8605Smrg<li>Build Mesa and the vmwgfx_dri.so driver, the vmwgfx_drv.so xorg driver, the X acceleration library libxatracker. 199848b8605SmrgThe vmwgfx_dri.so is used by the OpenGL libraries during direct rendering, 200848b8605Smrgand by the Xorg server during accelerated indirect GL rendering. 201848b8605SmrgThe libxatracker library is used exclusively by the X server to do render, 202848b8605Smrgcopy and video acceleration: 203848b8605Smrg<br> 204848b8605SmrgThe following configure options doesn't build the EGL system. 205848b8605Smrg <pre> 206848b8605Smrg cd $TOP/mesa 207b8e80941Smrg meson builddir --prefix=/usr --libdir=${LIBDIR} -Dgallium-drivers=svga -Ddri-drivers=swrast -Dgallium-xa=true -Ddri3=false 208b8e80941Smrg ninja -C builddir 209b8e80941Smrg sudo ninja -C builddir install 210848b8605Smrg </pre> 211848b8605Smrg 212848b8605SmrgNote that you may have to install other packages that Mesa depends upon 213848b8605Smrgif they're not installed in your system. You should be told what's missing. 214848b8605Smrg<br> 215848b8605Smrg<br> 216848b8605Smrg 217b8e80941Smrg<li>xf86-video-vmware: Now, once libxatracker is installed, we proceed with 218b8e80941Smrgbuilding and replacing the current Xorg driver. 219b8e80941SmrgFirst check if your system is 32- or 64-bit. 220848b8605Smrg <pre> 221848b8605Smrg cd $TOP/xf86-video-vmware 222b8e80941Smrg ./autogen.sh --prefix=/usr --libdir=${LIBDIR} 223848b8605Smrg make 224848b8605Smrg sudo make install 225848b8605Smrg </pre> 226b8e80941Smrg 227848b8605Smrg<li>vmwgfx kernel module. First make sure that any old version of this kernel module is removed from the system by issuing 228b8e80941Smrg<pre> 229848b8605Smrg sudo rm /lib/modules/`uname -r`/kernel/drivers/gpu/drm/vmwgfx.ko* 230b8e80941Smrg</pre> 231b8e80941SmrgBuild and install: 232b8e80941Smrg<pre> 233848b8605Smrg cd $TOP/vmwgfx 234848b8605Smrg make 235848b8605Smrg sudo make install 236b8e80941Smrg sudo depmod -a 237b8e80941Smrg</pre> 238b8e80941SmrgIf you're using a Ubuntu OS: 239b8e80941Smrg<pre> 240b8e80941Smrg sudo update-initramfs -u 241b8e80941Smrg</pre> 242b8e80941SmrgIf you're using a Fedora OS: 243b8e80941Smrg<pre> 244b8e80941Smrg sudo dracut --force 245b8e80941Smrg</pre> 246b8e80941SmrgAdd 'vmwgfx' to the /etc/modules file: 247b8e80941Smrg<pre> 248b8e80941Smrg echo vmwgfx | sudo tee -a /etc/modules 249b8e80941Smrg</pre> 250848b8605Smrg 251848b8605SmrgNote: some distros put DRM kernel drivers in different directories. 252848b8605SmrgFor example, sometimes vmwgfx.ko might be found in 253848b8605Smrg<code>/lib/modules/{version}/extra/vmwgfx.ko</code> or in 254848b8605Smrg<code>/lib/modules/{version}/kernel/drivers/gpu/drm/vmwgfx/vmwgfx.ko</code>. 255848b8605Smrg<p> 256848b8605SmrgAfter installing vmwgfx.ko you might want to run the following command to 257848b8605Smrgcheck that the new kernel module is in the expected place: 258848b8605Smrg<pre> 259848b8605Smrg find /lib/modules -name vmwgfx.ko -exec ls -l '{}' \; 260848b8605Smrg</pre> 261848b8605SmrgIf you see the kernel module listed in more than one place, you may need to 262848b8605Smrgmove things around. 263848b8605Smrg<p> 264848b8605SmrgFinally, if you update your kernel you'll probably have to rebuild and 265848b8605Smrgreinstall the vmwgfx.ko module again. 266848b8605Smrg</ul> 267848b8605Smrg 268848b8605Smrg 269848b8605SmrgNow try to load the kernel module by issuing 270848b8605Smrg <pre> 271848b8605Smrg sudo modprobe vmwgfx</pre> 272848b8605SmrgThen type 273848b8605Smrg <pre> 274848b8605Smrg dmesg</pre> 275848b8605Smrgto watch the debug output. It should contain a number of lines prefixed with "[vmwgfx]". 276848b8605Smrg 277848b8605Smrg<p> 278848b8605SmrgThen restart the Xserver (or reboot). 279848b8605SmrgThe lines starting with "vmwlegacy" or "VMWARE" in the file /var/log/Xorg.0.log 280848b8605Smrgshould now have been replaced with lines starting with "vmwgfx", indicating that 281848b8605Smrgthe new Xorg driver is in use. 282848b8605Smrg</p> 283848b8605Smrg 284848b8605Smrg 285848b8605Smrg<h2>Running OpenGL Programs</h2> 286848b8605Smrg 287848b8605Smrg<p> 288848b8605SmrgIn a shell, run 'glxinfo' and look for the following to verify that the 289848b8605Smrgdriver is working: 290848b8605Smrg</p> 291848b8605Smrg 292848b8605Smrg<pre> 293848b8605SmrgOpenGL vendor string: VMware, Inc. 294848b8605SmrgOpenGL renderer string: Gallium 0.4 on SVGA3D; build: RELEASE; 295848b8605SmrgOpenGL version string: 2.1 Mesa 8.0 296848b8605Smrg</pre> 297848b8605Smrg 298848b8605Smrg<p> 299848b8605SmrgIf you don't see this, try setting this environment variable: 300848b8605Smrg <pre> 301848b8605Smrg export LIBGL_DEBUG=verbose</pre> 302848b8605Smrg<p> 303848b8605Smrgthen rerun glxinfo and examine the output for error messages. 304848b8605Smrg</p> 305848b8605Smrg 306b8e80941Smrg<p> 307b8e80941SmrgIf OpenGL 3.3 is not working (you only get OpenGL 2.1): 308b8e80941Smrg</p> 309b8e80941Smrg<ul> 310b8e80941Smrg<li>Make sure the VM uses hardware version 12. 311b8e80941Smrg<li>Make sure the vmwgfx kernel module is version 2.9.0 or later. 312b8e80941Smrg<li>Check the vmware.log file for errors. 313b8e80941Smrg<li>Run 'dmesg | grep vmwgfx' and look for "DX: yes". 314b8e80941Smrg</ul> 315b8e80941Smrg 316848b8605Smrg</div> 317848b8605Smrg</body> 318848b8605Smrg</html> 319