mesa/src/gallium/drivers/llvmpipe
José Fonseca 7cda8ea44c llvmpipe: Emit SSE intrinsics based on runtime cpu capability check.
Note that llvmpipe still doesn't run on any processor yet: if you don't
have a recent processor with SSE4.1 you will still likely end up
hitting a code path for which a generic non-sse4 version is not
implemented yet.
2009-09-29 13:59:16 +01:00
..
Makefile Merge branch 'mesa_7_6_branch' 2009-09-15 09:47:35 -06:00
README llvmpipe: Update status in README and TODO/FIXME comments throughout the code. 2009-09-11 11:24:26 +01:00
SConscript llvmpipe: Make the code portable for MinGW. 2009-09-16 11:35:23 +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: Emit SSE intrinsics based on runtime cpu capability check. 2009-09-29 13:59:16 +01:00
lp_bld_arit.h llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +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 llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +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: Make lp_type a regular union. 2009-09-14 11:05:38 +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: Make lp_type a regular union. 2009-09-14 11:05:38 +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: Don't assert due to unsupported texture wrap modes. 2009-09-16 20:42:09 +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: 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: Grab a ref when the fb is set. 2009-09-28 15:35:29 +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: Emit SSE intrinsics based on runtime cpu capability check. 2009-09-29 13:59:16 +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: 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: 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: Respect input interpolators for the shader. 2009-09-19 14:57:24 +01:00
lp_state_fs.c llvmpipe: Make lp_type a regular union. 2009-09-14 11:05:38 +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: Grab a ref when the fb is set. 2009-09-28 15:35:29 +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: Allow building with LLVM 2.6 too. 2009-09-26 09:37:43 +01:00
lp_test_main.c llvmpipe: Allow building with LLVM 2.6 too. 2009-09-26 09:37:43 +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: Make lp_type a regular union. 2009-09-14 11:05:38 +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: 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: move tile cache datatypes into .c file since they're private 2009-09-23 11:53:12 -06:00
lp_tile_cache.h llvmpipe: move tile cache datatypes into .c file since they're private 2009-09-23 11:53:12 -06: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.