mesa/src/gallium/drivers/llvmpipe
José Fonseca 659609e0ae llvmpipe: Replace util_pack_color with straight float_to_ubyte. 2009-10-09 14:03:24 +01:00
..
.gitignore llvmpipe: Autogenerate lp_tile_soa.c from u_format.csv. 2009-10-04 22:03:16 +01:00
Makefile llvmpipe: import experimental softpipe rasterizer code, wip binning code 2009-10-08 08:32:43 +01:00
README llvmpipe: Update status in README and TODO/FIXME comments throughout the code. 2009-09-11 11:24:26 +01:00
SConscript llvmpipe: hook up some state, add stub line and point functions 2009-10-09 10:44:07 +01:00
lp_bld_alpha.c llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +01:00
lp_bld_alpha.h llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +01:00
lp_bld_arit.c llvmpipe: Runtime cpu checks for lp_build_min_simple too. 2009-09-29 17:28:15 +01:00
lp_bld_arit.h llvmpipe: Implement non SSE4.1 versions of floor and round. 2009-09-29 17:28:15 +01:00
lp_bld_blend.h llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +01:00
lp_bld_blend_aos.c llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +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: Make lp_type a regular union. 2009-09-14 11:05:38 +01:00
lp_bld_const.c llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +01:00
lp_bld_const.h llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +01:00
lp_bld_conv.c llvmpipe: Emit SSE intrinsics based on runtime cpu capability check. 2009-09-29 13:59:16 +01:00
lp_bld_conv.h llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +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 gallium: remove depth.occlusion_count flag 2009-10-01 14:34:23 +01:00
lp_bld_depth.h llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +01:00
lp_bld_flow.c llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +01:00
lp_bld_flow.h llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +01:00
lp_bld_format.h llvmpipe: Match header's protection macro with filename. 2009-10-04 22:03:15 +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: Adjust format assertion. 2009-10-04 22:03:15 +01:00
lp_bld_interp.c llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +01:00
lp_bld_interp.h llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +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: Emit SSE intrinsics based on runtime cpu capability check. 2009-09-29 13:59:16 +01:00
lp_bld_logic.h llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +01:00
lp_bld_sample.h llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +01:00
lp_bld_sample_soa.c llvmpipe: Implement non SSE4.1 versions of floor and round. 2009-09-29 17:28:15 +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: Make lp_type a regular union. 2009-09-14 11:05:38 +01:00
lp_bld_swizzle.h llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +01:00
lp_bld_tgsi.h llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +01:00
lp_bld_tgsi_soa.c llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +01:00
lp_bld_type.c llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +01:00
lp_bld_type.h llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +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: Update lp_setup_clear invocation. 2009-10-08 17:06:32 +01:00
lp_clear.h llvmpipe: Rename preprocessor symbols too. 2009-08-29 09:21:16 +01:00
lp_context.c llvmpipe: remove some old sampler support structs 2009-10-08 17:53:12 +01:00
lp_context.h llvmpipe: Pass state to setup. 2009-10-09 13:41:33 +01:00
lp_draw_arrays.c llvmpipe: Eliminate constant mapping/unmapping. 2009-10-09 13:25:15 +01:00
lp_flush.c llvmpipe: remove dead code 2009-10-09 12:26:49 +01:00
lp_flush.h llvmpipe: Rename preprocessor symbols too. 2009-08-29 09:21:16 +01:00
lp_jit.c llvmpipe: remove dead code 2009-10-09 12:26:49 +01:00
lp_jit.h llvmpipe: remove dead code 2009-10-09 12:26:49 +01:00
lp_prim_vbuf.c llvmpipe: remove some old sampler support structs 2009-10-08 17:53:12 +01:00
lp_prim_vbuf.h llvmpipe: import experimental softpipe rasterizer code, wip binning code 2009-10-08 08:32:43 +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_rast.c llvmpipe: debug, crash fixes 2009-10-09 14:02:39 +01:00
lp_rast.h llvmpipe: get lp_setup_tri building 2009-10-09 12:19:49 +01:00
lp_rast_priv.h llvmpipe: Follow write_color/write_zstencil. 2009-10-09 10:37:24 +01:00
lp_rast_tri.c llvmpipe: get lp_setup_tri building 2009-10-09 12:19:49 +01:00
lp_screen.c llvmpipe: increase max 3D texture size to 256 2009-09-24 16:07:45 -06: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: Replace util_pack_color with straight float_to_ubyte. 2009-10-09 14:03:24 +01:00
lp_setup.h llvmpipe: fix a couple of warnings 2009-10-09 13:53:14 +01:00
lp_setup_context.h llvmpipe: Pass state to setup. 2009-10-09 13:41:33 +01:00
lp_setup_line.c llvmpipe: hook up some state, add stub line and point functions 2009-10-09 10:44:07 +01:00
lp_setup_point.c llvmpipe: hook up some state, add stub line and point functions 2009-10-09 10:44:07 +01:00
lp_setup_tri.c llvmpipe: get lp_setup_tri building 2009-10-09 12:19:49 +01:00
lp_state.h llvmpipe: Pass state to setup. 2009-10-09 13:41:33 +01:00
lp_state_blend.c llvmpipe: Pass state to setup. 2009-10-09 13:41:33 +01:00
lp_state_clip.c llvmpipe: Rename preprocessor symbols too. 2009-08-29 09:21:16 +01:00
lp_state_derived.c llvmpipe: Pass state to setup. 2009-10-09 13:41:33 +01:00
lp_state_fs.c llvmpipe: Pass state to setup. 2009-10-09 13:41:33 +01:00
lp_state_rasterizer.c llvmpipe: Rename preprocessor symbols too. 2009-08-29 09:21:16 +01:00
lp_state_sampler.c llvmpipe: Pass state to setup. 2009-10-09 13:41:33 +01:00
lp_state_surface.c llvmpipe: remove dead code 2009-10-09 12:26:49 +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: Make lp_type a regular union. 2009-09-14 11:05:38 +01:00
lp_test_blend.c llvmpipe: Make the code portable for MinGW. 2009-09-16 11:35:23 +01:00
lp_test_conv.c llvmpipe: Make the code portable for MinGW. 2009-09-16 11:35:23 +01:00
lp_test_format.c llvmpipe: Remove loop testing from format testing. 2009-10-04 22:03:15 +01:00
lp_test_main.c llvmpipe: Allow building with LLVM 2.6 too. 2009-09-26 09:37:43 +01:00
lp_tex_sample.h llvmpipe: remove some old sampler support structs 2009-10-08 17:53:12 +01:00
lp_tex_sample_llvm.c llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +01:00
lp_texture.c llvmpipe: remove tex tile cache and related code 2009-10-08 16:33:12 +01:00
lp_texture.h llvmpipe: Define an winsys for LLVM. Drop pipe_winsys 2009-08-29 20:03:44 +01:00
lp_tile_soa.h llvmpipe: Autogenerate lp_tile_soa.c from u_format.csv. 2009-10-04 22:03:16 +01:00
lp_tile_soa.py llvmpipe: Autogenerate lp_tile_soa.c from u_format.csv. 2009-10-04 22:03:16 +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.