mesa/src/gallium/drivers/llvmpipe
José Fonseca 86226d5ea1 llvmpipe: Compute derivatives. 2009-09-13 16:22:27 +01:00
..
Makefile llvmpipe: Code generate the texture sampling inside the shader. 2009-09-07 15:02:08 +01:00
README llvmpipe: Update status in README and TODO/FIXME comments throughout the code. 2009-09-11 11:24:26 +01:00
SConscript scons: Don't set LLVM_VERSION if one of the llvm-config calls fails. 2009-09-07 15:16:25 +01:00
lp_bld_alpha.c llvmpipe: Pass the alpha ref value and blend color in the jit context. 2009-08-29 09:21:41 +01:00
lp_bld_alpha.h llvmpipe: Pass the alpha ref value and blend color in the jit context. 2009-08-29 09:21:41 +01:00
lp_bld_arit.c llvmpipe: Add a few more common arithmetic functions. 2009-09-13 13:50:19 +01:00
lp_bld_arit.h llvmpipe: Add a few more common arithmetic functions. 2009-09-13 13:50:19 +01:00
lp_bld_blend.h llvmpipe: Code generate logic ops. 2009-08-29 09:21:34 +01:00
lp_bld_blend_aos.c llvmpipe: Add a bunch of comments. 2009-08-29 09:21:40 +01:00
lp_bld_blend_logicop.c llvmpipe: Add a bunch of comments. 2009-08-29 09:21:40 +01:00
lp_bld_blend_soa.c llvmpipe: Add a bunch of comments. 2009-08-29 09:21:40 +01:00
lp_bld_const.c llvmpipe: s/uni/scalar/. 2009-08-29 09:21:40 +01:00
lp_bld_const.h llvmpipe: s/uni/scalar/. 2009-08-29 09:21:40 +01:00
lp_bld_conv.c llvmpipe: Rename function to free up lp_build_trunc to the usual arithmetic meaning. 2009-09-13 13:45:48 +01:00
lp_bld_conv.h llvmpipe: Get conversions working correctly for all integer types. 2009-08-29 09:21:39 +01:00
lp_bld_debug.c llvmpipe: Debug function to check stack alignment. 2009-09-09 21:48:49 +01:00
lp_bld_debug.h llvmpipe: Debug function to check stack alignment. 2009-09-09 21:48:49 +01:00
lp_bld_depth.c llvmpipe: Update status in README and TODO/FIXME comments throughout the code. 2009-09-11 11:24:26 +01:00
lp_bld_depth.h llvmpipe: Add a bunch of comments. 2009-08-29 09:21:40 +01:00
lp_bld_flow.c llvmpipe: Skip blending when mask is zero. 2009-09-10 12:01:42 +01:00
lp_bld_flow.h llvmpipe: Proper control flow builders. 2009-09-10 11:44:03 +01:00
lp_bld_format.h llvmpipe: SoA pixel unpacking specialization. 2009-09-07 15:02:06 +01:00
lp_bld_format_aos.c llvmpipe: SoA pixel unpacking specialization. 2009-09-07 15:02:06 +01:00
lp_bld_format_soa.c llvmpipe: Fix sampling from depth textures. Respect texture compare func. 2009-09-10 12:14:53 +01:00
lp_bld_interp.c llvmpipe: Factor out and optimize the input interpolation. 2009-08-29 09:21:41 +01:00
lp_bld_interp.h llvmpipe: Factor out and optimize the input interpolation. 2009-08-29 09:21:41 +01:00
lp_bld_intr.c llvmpipe: Pre-declare fetch_texel. 2009-08-29 09:21:41 +01:00
lp_bld_intr.h llvmpipe: Pre-declare fetch_texel. 2009-08-29 09:21:41 +01:00
lp_bld_logic.c llvmpipe: Use const keyword for input array arguments. 2009-09-13 16:12:48 +01:00
lp_bld_logic.h llvmpipe: Use const keyword for input array arguments. 2009-09-13 16:12:48 +01:00
lp_bld_sample.h llvmpipe: Quick hack for 1D textures. 2009-09-09 21:48:50 +01:00
lp_bld_sample_soa.c llvmpipe: Update status in README and TODO/FIXME comments throughout the code. 2009-09-11 11:24:26 +01:00
lp_bld_struct.c llvmpipe: Utility function to get the pointer to a structure member. 2009-09-07 15:02:07 +01:00
lp_bld_struct.h llvmpipe: Utility function to get the pointer to a structure member. 2009-09-07 15:02:07 +01:00
lp_bld_swizzle.c llvmpipe: Use const keyword for input array arguments. 2009-09-13 16:12:48 +01:00
lp_bld_swizzle.h llvmpipe: Use const keyword for input array arguments. 2009-09-13 16:12:48 +01:00
lp_bld_tgsi.h llvmpipe: Further abstract the texture sampling generation from TGSI translation. 2009-09-07 15:02:06 +01:00
lp_bld_tgsi_soa.c llvmpipe: Compute derivatives. 2009-09-13 16:22:27 +01:00
lp_bld_type.c llvmpipe: Convenience function to obtain the integer type with same bitdepth of an arbitrary type. 2009-09-07 15:02:07 +01:00
lp_bld_type.h llvmpipe: Convenience function to obtain the integer type with same bitdepth of an arbitrary type. 2009-09-07 15:02:07 +01:00
lp_buffer.c llvmpipe: Actually commit lp_buffer.[ch]. 2009-08-31 09:34:04 +01:00
lp_buffer.h llvmpipe: Actually commit lp_buffer.[ch]. 2009-08-31 09:34:04 +01:00
lp_clear.c llvmpipe: set dirty_render_cache in llvmpipe_clear() 2009-09-11 11:29:24 +01:00
lp_clear.h llvmpipe: Rename preprocessor symbols too. 2009-08-29 09:21:16 +01:00
lp_context.c llvmpipe: Update status in README and TODO/FIXME comments throughout the code. 2009-09-11 11:24:26 +01:00
lp_context.h llvmpipe: Pass the alpha ref value and blend color in the jit context. 2009-08-29 09:21:41 +01:00
lp_draw_arrays.c llvmpipe: Eliminate internal pipe_buffer_map/unmap usage. 2009-08-30 12:37:03 +01:00
lp_flush.c llvmpipe: Texture cache is read-only. No need to flush. 2009-08-30 12:37:03 +01:00
lp_flush.h llvmpipe: Rename preprocessor symbols too. 2009-08-29 09:21:16 +01:00
lp_jit.c llvmpipe: Code generate the texture sampling inside the shader. 2009-09-07 15:02:08 +01:00
lp_jit.h llvmpipe: Update status in README and TODO/FIXME comments throughout the code. 2009-09-11 11:24:26 +01:00
lp_prim_setup.c llvmpipe: prefix point/line/tri_setup() functions with llvmpipe_ 2009-08-29 09:21:35 +01:00
lp_prim_setup.h llvmpipe: Rename preprocessor symbols too. 2009-08-29 09:21:16 +01:00
lp_prim_vbuf.c llvmpipe: Back port recent softpipe-opt improvements from Keith. 2009-08-29 09:21:39 +01:00
lp_prim_vbuf.h llvmpipe: Rename preprocessor symbols too. 2009-08-29 09:21:16 +01:00
lp_quad.h llvmpipe: Generate the fragment pipeline into a single function. 2009-08-29 09:21:40 +01:00
lp_query.c llvmpipe: Rename preprocessor symbols too. 2009-08-29 09:21:16 +01:00
lp_query.h llvmpipe: Rename preprocessor symbols too. 2009-08-29 09:21:16 +01:00
lp_screen.c llvmpipe: Remove dead references to pipe_winsys. 2009-09-13 16:13:12 +01:00
lp_screen.h llvmpipe: Define an winsys for LLVM. Drop pipe_winsys 2009-08-29 20:03:44 +01:00
lp_setup.c llvmpipe: Update status in README and TODO/FIXME comments throughout the code. 2009-09-11 11:24:26 +01:00
lp_setup.h llvmpipe: prefix point/line/tri_setup() functions with llvmpipe_ 2009-08-29 09:21:35 +01:00
lp_state.h llvmpipe: Include zsbuf's format in the fragment shader key. 2009-09-09 21:48:50 +01:00
lp_state_blend.c llvmpipe: Pass the alpha ref value and blend color in the jit context. 2009-08-29 09:21:41 +01:00
lp_state_clip.c llvmpipe: Rename preprocessor symbols too. 2009-08-29 09:21:16 +01:00
lp_state_derived.c llvmpipe: Code generate the texture sampling inside the shader. 2009-09-07 15:02:08 +01:00
lp_state_fs.c llvmpipe: Fix alpha test. 2009-09-10 13:35:39 +01:00
lp_state_rasterizer.c llvmpipe: Rename preprocessor symbols too. 2009-08-29 09:21:16 +01:00
lp_state_sampler.c llvmpipe: Code generate the texture sampling inside the shader. 2009-09-07 15:02:08 +01:00
lp_state_surface.c llvmpipe: Squash the quad pipeline. 2009-08-29 09:21:41 +01:00
lp_state_vertex.c llvmpipe: Rename preprocessor symbols too. 2009-08-29 09:21:16 +01:00
lp_state_vs.c llvmpipe: Split off vs stuff from lp_state_fs.c. 2009-08-29 09:21:40 +01:00
lp_surface.c llvmpipe: Fork softpipe for experimentation with llvm. 2009-08-29 09:21:15 +01:00
lp_surface.h llvmpipe: Rename preprocessor symbols too. 2009-08-29 09:21:16 +01:00
lp_test.h llvmpipe: Clamped float to unsigned norm via mantissa manipulation. 2009-08-29 09:21:37 +01:00
lp_test_blend.c llvmpipe: Debug helper function to name llvm intermediate values. 2009-08-29 09:21:34 +01:00
lp_test_conv.c llvmpipe: Get conversions working correctly for all integer types. 2009-08-29 09:21:39 +01:00
lp_test_format.c llvmpipe: SoA pixel unpacking specialization. 2009-09-07 15:02:06 +01:00
lp_test_main.c llvmpipe: Several fixes of the conversion test. 2009-08-29 09:21:37 +01:00
lp_tex_cache.c llvmpipe: Silent debug statement. 2009-09-07 15:02:08 +01:00
lp_tex_cache.h llvmpipe: Texture cache in 4 ubytes instead of 4 floats. 2009-08-30 12:37:03 +01:00
lp_tex_sample.h llvmpipe: Code generate the texture sampling inside the shader. 2009-09-07 15:02:08 +01:00
lp_tex_sample_c.c llvmpipe: Code generate the texture sampling inside the shader. 2009-09-07 15:02:08 +01:00
lp_tex_sample_llvm.c llvmpipe: Code generate the texture sampling inside the shader. 2009-09-07 15:02:08 +01:00
lp_texture.c llvmpipe: Define an winsys for LLVM. Drop pipe_winsys 2009-08-29 20:03:44 +01:00
lp_texture.h llvmpipe: Define an winsys for LLVM. Drop pipe_winsys 2009-08-29 20:03:44 +01:00
lp_tile_cache.c llvmpipe: Update for changes in master. 2009-08-29 09:21:42 +01:00
lp_tile_cache.h llvmpipe: Don't limit the number of tiles in the cache. 2009-08-29 09:21:39 +01:00
lp_tile_soa.c llvmpipe: Tile in SoA format identical to the blender function output. 2009-08-29 09:21:34 +01:00
lp_tile_soa.h llvmpipe: Tile in SoA format identical to the blender function output. 2009-08-29 09:21:34 +01:00
lp_winsys.h llvmpipe: Define an winsys for LLVM. Drop pipe_winsys 2009-08-29 20:03:44 +01:00
sp2lp.sh llvmpipe: Back port recent softpipe-opt improvements from Keith. 2009-08-29 09:21:39 +01:00

README

LLVMPIPE -- a fork of softpipe that employs LLVM for code generation.


Status
======

Done so far is:

 - the whole fragment pipeline is code generated in a single function
 
   - input interpolation
   
   - depth testing
 
   - texture sampling (not all state/formats are supported) 
   
   - fragment shader TGSI translation
     - same level of support as the TGSI SSE2 exec machine, with the exception
       we don't fallback to TGSI interpretation when an unsupported opcode is
       found, but just ignore it
     - done in SoA layout
     - input interpolation also code generated
 
   - alpha testing
 
   - blend (including logic ops)
     - both in SoA and AoS layouts, but only the former used for now
 
 - 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. 

To do (probably by this order):

 - code generate stipple and stencil testing

 - translate the remaining bits of texture sampling state

 - translate TGSI control flow instructions, and all other remaining opcodes
 
 - integrate with the draw module for VS code generation

 - code generate the triangle setup and rasterization


Requirements
============

 - Linux
 
 - udis86, http://udis86.sourceforge.net/ . Use my repository, which decodes
   opcodes not yet supported by upstream.
 
     git clone git://people.freedesktop.org/~jrfonseca/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


Building
========

To build everything invoke scons as:

  scons debug=yes statetrackers=mesa drivers=llvmpipe winsys=xlib dri=false -k

Alternatively, you can build it with GNU make, if you prefer, by invoking it as

  make linux-llvm

but the rest of these instructions assume that scons is used.


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_64-debug/lib:$LD_LIBRARY_PATH

or

  export LD_LIBRARY_PATH=$PWD/build/linux-x86-debug/lib:$LD_LIBRARY_PATH

For performance evaluation pass debug=no to scons, and use the corresponding
lib directory without the "-debug" suffix.


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 this tests can output results and benchmarks to a tab-separated-file
for posterior analysis, e.g.:

  build/linux-x86_64-debug/gallium/drivers/llvmpipe/lp_test_blend -o blend.tsv


Development Notes
=================

- When looking to this code by the first time start in lp_state_fs.c, and 
  then skim through the lp_bld_* functions called in there, and the comments
  at the top of the lp_bld_*.c functions.  

- All lp_bld_*.[ch] are isolated from the rest of the driver, and could/may be 
  put in a stand-alone Gallium state -> LLVM IR translation module.

- 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 
  http://npcontemplation.blogspot.com/2008/06/secret-of-llvm-c-bindings.html
  for a stand-alone example.