| LLVMPIPE -- a fork of softpipe that employs LLVM for code generation. |
| |
| |
| Status |
| ====== |
| |
| Done so far is: |
| |
| - TGSI -> LLVM fragment shader translation |
| - same level of support as the TGSI SSE2 exec machine |
| - texture sampling via an intrinsic call |
| - done in SoA |
| - input interpolation also code generated |
| |
| - blend -> LLVM (including logic ops) |
| - SoA and AoS, but only the former used |
| |
| - code is generic |
| - intermediates can be vectors of floats, ubytes, fixed point, etc, and of |
| any width and length |
| - not all operations are implemented for these types yet though |
| |
| Most mesa/progs/demos/* work. Speed is on par with Keith's softpipe-opt branch, |
| which includes hand written fast implementations for common cases. |
| |
| To do (probably by this order): |
| - code generate the rest of the fragment pipeline, namely the |
| depth/alpha/stencil state |
| - concatenate the fragment pipeline (shader + depth/stencil/alpha + blend) in a |
| single function |
| - code generate texture sampling |
| - translate TGSI control flow instructions |
| - code generate the triangle setup and rasterization |
| |
| |
| Requirements |
| ============ |
| |
| - Linux |
| |
| - udis86, http://udis86.sourceforge.net/ |
| |
| git clone git://udis86.git.sourceforge.net/gitroot/udis86 |
| cd udis86 |
| ./configure --with-pic |
| make |
| sudo make install |
| |
| - LLVM 2.5. On Debian based distributions do: |
| |
| aptitude install llvm-dev |
| |
| There is a typo in one of the llvm-dev 2.5 headers, that causes compilation |
| errors in the debug build: |
| |
| --- /usr/include/llvm-c/Core.h.orig 2009-08-10 15:38:54.000000000 +0100 |
| +++ /usr/include/llvm-c/Core.h 2009-08-10 15:38:25.000000000 +0100 |
| @@ -831,7 +831,7 @@ |
| template<typename T> |
| inline T **unwrap(LLVMValueRef *Vals, unsigned Length) { |
| #if DEBUG |
| - for (LLVMValueRef *I = Vals, E = Vals + Length; I != E; ++I) |
| + for (LLVMValueRef *I = Vals, *E = Vals + Length; I != E; ++I) |
| cast<T>(*I); |
| #endif |
| return reinterpret_cast<T**>(Vals); |
| |
| - A x86 or amd64 processor with support for sse2, sse3, and sse4.1 SIMD |
| instructions. This is necessary because we emit several SSE intrinsics for |
| convenience. See /proc/cpuinfo to know what your CPU supports. |
| |
| - scons (although it should be straightforward to fix the Makefiles as well) |
| |
| |
| Building |
| ======== |
| |
| To build everything invoke scons as: |
| |
| scons debug=yes statetrackers=mesa drivers=llvmpipe winsys=xlib dri=false -k |
| |
| |
| Using |
| ===== |
| |
| Building will create a drop-in alternative for libGL.so. To use it set the |
| environment variables: |
| |
| export LD_LIBRARY_PATH=$PWD/build/linux-x86-debug/lib:$LD_LIBRARY_PATH |
| export LD_LIBRARY_PATH=$PWD/build/linux-x86_64-debug/lib:$LD_LIBRARY_PATH |
| |
| |
| 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 |
| |
| |