<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
- <title>llvmpipe</title>
+ <title>Gallium LLVMpipe Driver</title>
<link rel="stylesheet" type="text/css" href="mesa.css">
</head>
<body>
<div class="header">
- <h1>The Mesa 3D Graphics Library</h1>
+ The Mesa 3D Graphics Library
</div>
<iframe src="contents.html"></iframe>
<div class="content">
-<h1>Introduction</h1>
+<h1>Gallium LLVMpipe Driver</h1>
+
+<h2>Introduction</h2>
<p>
The Gallium llvmpipe driver is a software rasterizer that uses LLVM to
</p>
-<h1>Requirements</h1>
+<h2>Requirements</h2>
<ul>
<li>
built with LLVM version 4.0 or later.
</p>
<p>
- See /proc/cpuinfo to know what your CPU supports.
+ See <code>/proc/cpuinfo</code> to know what your CPU supports.
</p>
</li>
<li>
<p>
For Windows you will need to build LLVM from source with MSVC or MINGW
- (either natively or through cross compilers) and CMake, and set the LLVM
- environment variable to the directory you installed it to.
+ (either natively or through cross compilers) and CMake, and set the
+ <code>LLVM</code> environment variable to the directory you installed
+ it to.
LLVM will be statically linked, so when building on MSVC it needs to be
built with a matching CRT as Mesa, and you'll need to pass
</table>
<p>
- You can build only the x86 target by passing -DLLVM_TARGETS_TO_BUILD=X86
- to cmake.
+ You can build only the x86 target by passing
+ <code>-DLLVM_TARGETS_TO_BUILD=X86</code> to cmake.
</p>
</li>
</ul>
-<h1>Building</h1>
+<h2>Building</h2>
To build everything on Linux invoke scons as:
scons build=debug libgl-xlib
</pre>
-Alternatively, you can build it with autoconf/make with:
+Alternatively, you can build it with meson with:
<pre>
- ./configure --enable-glx=gallium-xlib --with-gallium-drivers=swrast --disable-dri --disable-gbm --disable-egl
- make
+ mkdir build
+ cd build
+ meson -D glx=gallium-xlib -D gallium-drivers=swrast
+ ninja
</pre>
but the rest of these instructions assume that scons is used.
</pre>
-<h1>Using</h1>
+<h2>Using</h2>
-<h2>Linux</h2>
+<h3>Linux</h3>
-<p>On Linux, building will create a drop-in alternative for libGL.so into</p>
+<p>On Linux, building will create a drop-in alternative for
+<code>libGL.so</code> into</p>
<pre>
build/foo/gallium/targets/libgl-xlib/libGL.so
lib/gallium/libGL.so
</pre>
-<p>To use it set the LD_LIBRARY_PATH environment variable accordingly.</p>
+<p>To use it set the <code>LD_LIBRARY_PATH</code> environment variable
+accordingly.</p>
-<p>For performance evaluation pass build=release to scons, and use the corresponding
-lib directory without the "-debug" suffix.</p>
+<p>For performance evaluation pass <code>build=release</code> to scons,
+and use the corresponding lib directory without the <code>-debug</code>
+suffix.</p>
-<h2>Windows</h2>
+<h3>Windows</h3>
<p>
On Windows, building will create
</p>
<ul>
- <li><p>copy build/windows-x86-debug/gallium/targets/libgl-gdi/opengl32.dll to C:\Windows\SysWOW64\mesadrv.dll</p></li>
+ <li><p>copy <code>build/windows-x86-debug/gallium/targets/libgl-gdi/opengl32.dll</code>
+ to <code>C:\Windows\SysWOW64\mesadrv.dll</code>
+ </p></li>
<li><p>load this registry settings:</p>
<pre>REGEDIT4
</ul>
-<h1>Profiling</h1>
+<h2>Profiling</h2>
<p>
To profile llvmpipe you should build as
that no tail call optimizations are done by gcc.
</p>
-<h2>Linux perf integration</h2>
+<h3>Linux perf integration</h3>
<p>
On Linux, it is possible to have symbol resolution of JIT code with <a href="https://perf.wiki.kernel.org/">Linux perf</a>:
</pre>
<p>
-When run inside Linux perf, llvmpipe will create a /tmp/perf-XXXXX.map file with
-symbol address table. It also dumps assembly code to /tmp/perf-XXXXX.map.asm,
-which can be used by the bin/perf-annotate-jit.py script to produce disassembly of
-the generated code annotated with the samples.
+When run inside Linux perf, llvmpipe will create a
+<code>/tmp/perf-XXXXX.map</code> file with symbol address table. It also
+dumps assembly code to <code>/tmp/perf-XXXXX.map.asm</code>, which can be
+used by the <code>bin/perf-annotate-jit.py</code> script to produce
+disassembly of the generated code annotated with the samples.
</p>
<p>You can obtain a call graph via
<a href="https://github.com/jrfonseca/gprof2dot#linux-perf">Gprof2Dot</a>.</p>
-<h1>Unit testing</h1>
+<h2>Unit testing</h2>
<p>
Building will also create several unit tests in
-build/linux-???-debug/gallium/drivers/llvmpipe:
+<code>build/linux-???-debug/gallium/drivers/llvmpipe</code>:
</p>
<ul>
-<li> lp_test_blend: blending
-<li> lp_test_conv: SIMD vector conversion
-<li> lp_test_format: pixel unpacking/packing
+<li> <code>lp_test_blend</code>: blending
+<li> <code>lp_test_conv</code>: SIMD vector conversion
+<li> <code>lp_test_format</code>: pixel unpacking/packing
</ul>
<p>
</pre>
-<h1>Development Notes</h1>
+<h2>Development Notes</h2>
<ul>
<li>
When looking at this code for the first time, start in lp_state_fs.c, and
- then skim through the lp_bld_* functions called there, and the comments
- at the top of the lp_bld_*.c functions.
+ then skim through the <code>lp_bld_*</code> functions called there, and
+ the comments at the top of the <code>lp_bld_*.c</code> functions.
</li>
<li>
The driver-independent parts of the LLVM / Gallium code are found in
- src/gallium/auxiliary/gallivm/. The filenames and function prefixes
- need to be renamed from "lp_bld_" to something else though.
+ <code>src/gallium/auxiliary/gallivm/</code>. The filenames and function
+ prefixes need to be renamed from <code>lp_bld_</code> to something else
+ though.
</li>
<li>
We use LLVM-C bindings for now. They are not documented, but follow the C++
interfaces very closely, and appear to be complete enough for code
generation. See
<a href="https://npcontemplation.blogspot.com/2008/06/secret-of-llvm-c-bindings.html">
- this stand-alone example</a>. See the llvm-c/Core.h file for reference.
+ this stand-alone example</a>. See the <code>llvm-c/Core.h</code> file for
+ reference.
</li>
</ul>
-<h1 id="recommended_reading">Recommended Reading</h1>
+<h2 id="recommended_reading">Recommended Reading</h2>
<ul>
<li>
<li><a href="http://www.drdobbs.com/optimizing-pixomatic-for-modern-x86-proc/184405807">Optimizing Pixomatic For Modern x86 Processors</a></li>
<li><a href="http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html">Intel 64 and IA-32 Architectures Optimization Reference Manual</a></li>
<li><a href="http://www.agner.org/optimize/">Software optimization resources</a></li>
- <li><a href="https://software.intel.com/en-us/articles/intel-intrinsics-guide">Intel Intrinsics Guide</a><li>
+ <li><a href="https://software.intel.com/en-us/articles/intel-intrinsics-guide">Intel Intrinsics Guide</a></li>
</ul>
</li>
<li>