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