summaryrefslogtreecommitdiff
path: root/docs/gallium
diff options
context:
space:
mode:
authorErik Faye-Lund <erik.faye-lund@collabora.com>2020-06-30 13:01:04 +0200
committerMarge Bot <eric+marge@anholt.net>2020-07-07 10:22:08 +0000
commit892fdde23f44df78391eb0ff50ef031c8b978384 (patch)
tree17c7655bfb616d9b21159c8b8043b106eb4e0c28 /docs/gallium
parent64a4ba9e1ceeccbc7adeae368b5bc2553be88610 (diff)
docs: move gallium specific docs into gallium folder
Reviewed-by: Eric Engestrom <eric@engestrom.ch> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5706>
Diffstat (limited to 'docs/gallium')
-rw-r--r--docs/gallium/drivers/llvmpipe.rst284
-rw-r--r--docs/gallium/index.rst1
-rw-r--r--docs/gallium/postprocess.rst33
3 files changed, 318 insertions, 0 deletions
diff --git a/docs/gallium/drivers/llvmpipe.rst b/docs/gallium/drivers/llvmpipe.rst
new file mode 100644
index 00000000000..ec8e92dc0a8
--- /dev/null
+++ b/docs/gallium/drivers/llvmpipe.rst
@@ -0,0 +1,284 @@
+Gallium LLVMpipe Driver
+=======================
+
+Introduction
+------------
+
+The Gallium llvmpipe driver is a software rasterizer that uses LLVM to
+do runtime code generation. Shaders, point/line/triangle rasterization
+and vertex processing are implemented with LLVM IR which is translated
+to x86, x86-64, or ppc64le machine code. Also, the driver is
+multithreaded to take advantage of multiple CPU cores (up to 8 at this
+time). It's the fastest software rasterizer for Mesa.
+
+Requirements
+------------
+
+- For x86 or amd64 processors, 64-bit mode is recommended. Support for
+ SSE2 is strongly encouraged. Support for SSE3 and SSE4.1 will yield
+ the most efficient code. The fewer features the CPU has the more
+ likely it is that you will run into underperforming, buggy, or
+ incomplete code.
+
+ For ppc64le processors, use of the Altivec feature (the Vector
+ Facility) is recommended if supported; use of the VSX feature (the
+ Vector-Scalar Facility) is recommended if supported AND Mesa is built
+ with LLVM version 4.0 or later.
+
+ See ``/proc/cpuinfo`` to know what your CPU supports.
+
+- Unless otherwise stated, LLVM version 3.4 is recommended; 3.3 or
+ later is required.
+
+ For Linux, on a recent Debian based distribution do:
+
+ .. code-block:: console
+
+ aptitude install llvm-dev
+
+ If you want development snapshot builds of LLVM for Debian and
+ derived distributions like Ubuntu, you can use the APT repository at
+ `apt.llvm.org <https://apt.llvm.org/>`__, which are maintained by
+ Debian's LLVM maintainer.
+
+ For a RPM-based distribution do:
+
+ .. code-block:: console
+
+ yum install llvm-devel
+
+ 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. 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
+ ``-DLLVM_USE_CRT_xxx=yyy`` as described below.
+
+
+ +-----------------+----------------------------------------------------------------+
+ | LLVM build-type | Mesa build-type |
+ | +--------------------------------+-------------------------------+
+ | | debug,checked | release,profile |
+ +=================+================================+===============================+
+ | Debug | ``-DLLVM_USE_CRT_DEBUG=MTd`` | ``-DLLVM_USE_CRT_DEBUG=MT`` |
+ +-----------------+--------------------------------+-------------------------------+
+ | Release | ``-DLLVM_USE_CRT_RELEASE=MTd`` | ``-DLLVM_USE_CRT_RELEASE=MT`` |
+ +-----------------+--------------------------------+-------------------------------+
+
+ You can build only the x86 target by passing
+ ``-DLLVM_TARGETS_TO_BUILD=X86`` to cmake.
+
+- scons (optional)
+
+Building
+--------
+
+To build everything on Linux invoke scons as:
+
+.. code-block:: console
+
+ scons build=debug libgl-xlib
+
+Alternatively, you can build it with meson with:
+
+.. code-block:: console
+
+ mkdir build
+ cd build
+ meson -D glx=gallium-xlib -D gallium-drivers=swrast
+ ninja
+
+but the rest of these instructions assume that scons is used. For
+Windows the procedure is similar except the target:
+
+.. code-block:: console
+
+ scons platform=windows build=debug libgl-gdi
+
+Using
+-----
+
+Linux
+~~~~~
+
+On Linux, building will create a drop-in alternative for ``libGL.so``
+into
+
+::
+
+ build/foo/gallium/targets/libgl-xlib/libGL.so
+
+or
+
+::
+
+ lib/gallium/libGL.so
+
+To use it set the ``LD_LIBRARY_PATH`` environment variable accordingly.
+
+For performance evaluation pass ``build=release`` to scons, and use the
+corresponding lib directory without the ``-debug`` suffix.
+
+Windows
+~~~~~~~
+
+On Windows, building will create
+``build/windows-x86-debug/gallium/targets/libgl-gdi/opengl32.dll`` which
+is a drop-in alternative for system's ``opengl32.dll``. To use it put it
+in the same directory as your application. It can also be used by
+replacing the native ICD driver, but it's quite an advanced usage, so if
+you need to ask, don't even try it.
+
+There is however an easy way to replace the OpenGL software renderer
+that comes with Microsoft Windows 7 (or later) with llvmpipe (that is,
+on systems without any OpenGL drivers):
+
+- copy
+ ``build/windows-x86-debug/gallium/targets/libgl-gdi/opengl32.dll`` to
+ ``C:\Windows\SysWOW64\mesadrv.dll``
+
+- load this registry settings:
+
+ ::
+
+ REGEDIT4
+
+ ; https://technet.microsoft.com/en-us/library/cc749368.aspx
+ ; https://www.msfn.org/board/topic/143241-portable-windows-7-build-from-winpe-30/page-5#entry942596
+ [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL]
+ "DLL"="mesadrv.dll"
+ "DriverVersion"=dword:00000001
+ "Flags"=dword:00000001
+ "Version"=dword:00000002
+
+- Ditto for 64 bits drivers if you need them.
+
+Profiling
+---------
+
+To profile llvmpipe you should build as
+
+::
+
+ scons build=profile <same-as-before>
+
+This will ensure that frame pointers are used both in C and JIT
+functions, and that no tail call optimizations are done by gcc.
+
+Linux perf integration
+~~~~~~~~~~~~~~~~~~~~~~
+
+On Linux, it is possible to have symbol resolution of JIT code with
+`Linux perf <https://perf.wiki.kernel.org/>`__:
+
+::
+
+ perf record -g /my/application
+ perf report
+
+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.
+
+You can obtain a call graph via
+`Gprof2Dot <https://github.com/jrfonseca/gprof2dot#linux-perf>`__.
+
+Unit testing
+------------
+
+Building will also create several unit tests in
+``build/linux-???-debug/gallium/drivers/llvmpipe``:
+
+- ``lp_test_blend``: blending
+- ``lp_test_conv``: SIMD vector conversion
+- ``lp_test_format``: pixel unpacking/packing
+
+Some of these tests can output results and benchmarks to a tab-separated
+file for later analysis, e.g.:
+
+::
+
+ build/linux-x86_64-debug/gallium/drivers/llvmpipe/lp_test_blend -o blend.tsv
+
+Development Notes
+-----------------
+
+- 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.
+- 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.
+- 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 `this stand-alone
+ example <https://npcontemplation.blogspot.com/2008/06/secret-of-llvm-c-bindings.html>`__.
+ See the ``llvm-c/Core.h`` file for reference.
+
+.. _recommended_reading:
+
+Recommended Reading
+-------------------
+
+- Rasterization
+
+ - `Triangle Scan Conversion using 2D Homogeneous
+ Coordinates <https://www.cs.unc.edu/~olano/papers/2dh-tri/>`__
+ - `Rasterization on
+ Larrabee <http://www.drdobbs.com/parallel/rasterization-on-larrabee/217200602>`__
+ (`DevMaster
+ copy <http://devmaster.net/posts/2887/rasterization-on-larrabee>`__)
+ - `Rasterization using half-space
+ functions <http://devmaster.net/posts/6133/rasterization-using-half-space-functions>`__
+ - `Advanced
+ Rasterization <http://devmaster.net/posts/6145/advanced-rasterization>`__
+ - `Optimizing Software Occlusion
+ Culling <https://fgiesen.wordpress.com/2013/02/17/optimizing-sw-occlusion-culling-index/>`__
+
+- Texture sampling
+
+ - `Perspective Texture
+ Mapping <http://chrishecker.com/Miscellaneous_Technical_Articles#Perspective_Texture_Mapping>`__
+ - `Texturing As In
+ Unreal <https://www.flipcode.com/archives/Texturing_As_In_Unreal.shtml>`__
+ - `Run-Time MIP-Map
+ Filtering <http://www.gamasutra.com/view/feature/3301/runtime_mipmap_filtering.php>`__
+ - `Will "brilinear" filtering
+ persist? <http://alt.3dcenter.org/artikel/2003/10-26_a_english.php>`__
+ - `Trilinear
+ filtering <http://ixbtlabs.com/articles2/gffx/nv40-rx800-3.html>`__
+ - `Texture
+ Swizzling <http://devmaster.net/posts/12785/texture-swizzling>`__
+
+- SIMD
+
+ - `Whole-Function
+ Vectorization <http://www.cdl.uni-saarland.de/projects/wfv/#header4>`__
+
+- Optimization
+
+ - `Optimizing Pixomatic For Modern x86
+ Processors <http://www.drdobbs.com/optimizing-pixomatic-for-modern-x86-proc/184405807>`__
+ - `Intel 64 and IA-32 Architectures Optimization Reference
+ Manual <http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html>`__
+ - `Software optimization
+ resources <http://www.agner.org/optimize/>`__
+ - `Intel Intrinsics
+ Guide <https://software.intel.com/en-us/articles/intel-intrinsics-guide>`__
+
+- LLVM
+
+ - `LLVM Language Reference
+ Manual <http://llvm.org/docs/LangRef.html>`__
+ - `The secret of LLVM C
+ bindings <https://npcontemplation.blogspot.co.uk/2008/06/secret-of-llvm-c-bindings.html>`__
+
+- General
+
+ - `A trip through the Graphics
+ Pipeline <https://fgiesen.wordpress.com/2011/07/09/a-trip-through-the-graphics-pipeline-2011-index/>`__
+ - `WARP Architecture and
+ Performance <https://msdn.microsoft.com/en-us/library/gg615082.aspx#architecture>`__
diff --git a/docs/gallium/index.rst b/docs/gallium/index.rst
index 9688afb2215..29fbefa2eb5 100644
--- a/docs/gallium/index.rst
+++ b/docs/gallium/index.rst
@@ -16,6 +16,7 @@ Contents:
cso
distro
drivers
+ postprocess
glossary
Indices and tables
diff --git a/docs/gallium/postprocess.rst b/docs/gallium/postprocess.rst
new file mode 100644
index 00000000000..276f3863756
--- /dev/null
+++ b/docs/gallium/postprocess.rst
@@ -0,0 +1,33 @@
+Gallium Post-processing
+=======================
+
+The Gallium drivers support user-defined image post-processing. At the
+end of drawing a frame a post-processing filter can be applied to the
+rendered image. Example filters include morphological antialiasing and
+cell shading.
+
+The filters can be toggled per-app via driconf, or per-session via the
+corresponding environment variables.
+
+Multiple filters can be used together.
+
+PP environment variables
+------------------------
+
+- PP_DEBUG - If defined debug information will be printed to stderr.
+
+Current filters
+---------------
+
+- pp_nored, pp_nogreen, pp_noblue - set to 1 to remove the
+ corresponding color channel. These are basic filters for easy testing
+ of the PP queue.
+- pp_jimenezmlaa, pp_jimenezmlaa_color - `Jimenez's
+ MLAA <https://www.iryokufx.com/mlaa/>`__ is a morphological
+ antialiasing filter. The two versions use depth and color data,
+ respectively. Which works better depends on the app - depth will not
+ blur text, but it will miss transparent textures for example. Set to
+ a number from 2 to 32, roughly corresponding to quality. Numbers
+ higher than 8 see minimizing gains.
+- pp_celshade - set to 1 to enable cell shading (a more complex color
+ filter).