mesa/src/gallium/drivers/llvmpipe
Michal Krol b1ed72ebe2 Move the remaining format pf_get_* functions to u_format.h.
Previously they depended on format blocks, but after removing those
they started depending on format encoding.
2009-12-17 23:41:57 +01:00
..
.gitignore llvmpipe: Autogenerate lp_tile_soa.c from u_format.csv. 2009-10-04 22:03:16 +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: fix broken lp_build_abs() 2009-12-16 15:06:16 +00:00
lp_bld_arit.h llvmpipe: Immediate multiplication. 2009-10-25 11:48:17 +00: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: Remove extraneous name in lp_type pre-declaration. 2009-10-21 15:53:37 +01:00
lp_bld_conv.c llvmpipe: Factor vector packing/unpacking to a separate source file. 2009-10-22 19:12:13 +01:00
lp_bld_conv.h llvmpipe: Remove extraneous name in lp_type pre-declaration. 2009-10-21 15:53:37 +01:00
lp_bld_debug.c llvmpipe: Tweak disassembly to match gdb. 2009-12-05 05:43:53 +00: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: Fix typo in comparison operator. 2009-11-24 14:25:20 +00: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: New module to help make assertions about formats. 2009-10-25 09:53:49 +00:00
lp_bld_format_aos.c llvmpipe: New function to unpack rgba8 formats into 4 x u8n AoS. 2009-10-25 09:53:49 +00:00
lp_bld_format_query.c llvmpipe: New module to help make assertions about formats. 2009-10-25 09:53:49 +00:00
lp_bld_format_soa.c llvmpipe: Split the format swizzling step from the unpacking. 2009-10-25 09:53:48 +00:00
lp_bld_interp.c tgsi: rename fields of tgsi_full_declaration to reduce verbosity 2009-11-24 15:04:18 +00: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: Remove extraneous name in lp_type pre-declaration. 2009-10-21 15:53:37 +01:00
lp_bld_misc.cpp llvmpipe: Fix build with llvm 2.6. 2009-11-06 15:08:05 +00:00
lp_bld_misc.h llvmpipe: Fix build with llvm 2.6. 2009-11-06 15:08:05 +00:00
lp_bld_pack.c llvmpipe: Allow different signs when unpacking. 2009-10-25 09:53:48 +00:00
lp_bld_pack.h llvmpipe: Factor vector packing/unpacking to a separate source file. 2009-10-22 19:12:13 +01:00
lp_bld_sample.c gallium: fix more statetrackers/drivers for not using texture width/height/depth arrays 2009-11-26 22:51:45 +01:00
lp_bld_sample.h llvmpipe: Factor our pixel offset computation. 2009-10-25 09:53:48 +00:00
lp_bld_sample_soa.c llvmpipe: Human friendlier sampler state dump. 2009-10-25 12:27:14 +00: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: Remove extraneous name in lp_type pre-declaration. 2009-10-21 15:53:37 +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: fix broken TGSI_OPCODE_FRC codegen 2009-12-16 15:06:17 +00:00
lp_bld_type.c llvmpipe: Utility function to double the bit width of a type. 2009-10-22 19:12:13 +01:00
lp_bld_type.h llvmpipe: Add inlines to quickly generate types matching the native SIMD register bitwidth. 2009-10-25 09:53:48 +00: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 gallium/util: fix util_color_[un]pack[-ub] to be strict aliasing safe 2009-12-07 20:35:42 +01:00
lp_clear.h llvmpipe: Rename preprocessor symbols too. 2009-08-29 09:21:16 +01:00
lp_context.c llvmpipe: Port vertex sampler support from softpipe. 2009-12-04 21:27:03 +00:00
lp_context.h llvmpipe: Port vertex sampler support from softpipe. 2009-12-04 21:27:03 +00:00
lp_debug.h llvmpipe: add LP_DEBUG env var 2009-12-16 15:06:17 +00:00
lp_draw_arrays.c llvmpipe: Eliminate constant mapping/unmapping. 2009-10-09 11:29:33 +01:00
lp_flush.c llvmpipe: Ensure tile cache transfers are mapped before flushing it. 2009-10-04 22:03:16 +01:00
lp_flush.h llvmpipe: Rename preprocessor symbols too. 2009-08-29 09:21:16 +01:00
lp_jit.c llvmpipe: Fake missing SSSE3 when simulation less capabable machines. 2009-11-26 11:16:35 +00: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_vbuf.c llvmpipe: remove old prim_setup draw stage 2009-11-03 17:12:34 +00:00
lp_prim_vbuf.h llvmpipe: remove old prim_setup draw stage 2009-11-03 17:12:34 +00: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: add LP_DEBUG env var 2009-12-16 15:06:17 +00:00
lp_screen.h llvmpipe: Define an winsys for LLVM. Drop pipe_winsys 2009-08-29 20:03:44 +01:00
lp_setup.c Move the remaining format pf_get_* functions to u_format.h. 2009-12-17 23:41:57 +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: Port vertex sampler support from softpipe. 2009-12-04 21:27:03 +00:00
lp_state_blend.c llvmpipe: Fix derived blend color state. 2009-11-10 05:22:15 -08:00
lp_state_clip.c llvmpipe: Rename preprocessor symbols too. 2009-08-29 09:21:16 +01:00
lp_state_derived.c llvmpipe: Port vertex sampler support from softpipe. 2009-12-04 21:27:03 +00:00
lp_state_fs.c llvmpipe: add LP_DEBUG env var 2009-12-16 15:06:17 +00:00
lp_state_rasterizer.c llvmpipe: Rename preprocessor symbols too. 2009-08-29 09:21:16 +01:00
lp_state_sampler.c llvmpipe: Port vertex sampler support from softpipe. 2009-12-04 21:27:03 +00:00
lp_state_surface.c Move pf_get_component_bits() to u_format auxiliary module. 2009-12-03 11:58:36 +01:00
lp_state_vertex.c llvmpipe: Rename preprocessor symbols too. 2009-08-29 09:21:16 +01:00
lp_state_vs.c llvmpipe: Fix memory leak. 2009-11-24 14:25:20 +00: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: Define rdtsc for MSVC. 2009-10-22 19:12:14 +01:00
lp_test_blend.c llvmpipe: Ensure stack variables in unit tests are properly aligned. 2009-11-09 07:26:08 -08:00
lp_test_conv.c llvmpipe: Ensure stack variables in unit tests are properly aligned. 2009-11-09 07:26:08 -08:00
lp_test_format.c llvmpipe: Ensure stack variables in unit tests are properly aligned. 2009-11-09 07:26:08 -08:00
lp_test_main.c llvmpipe: Make sure the JIT engine and X86 target are linked on MSVC build. 2009-10-28 11:26:26 +00:00
lp_tex_cache.c llvmpipe: Remove debug printf. 2009-12-04 21:27:03 +00: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 gallium: fix more statetrackers/drivers for not using texture width/height/depth arrays 2009-11-26 22:51:45 +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 Move the remaining format pf_get_* functions to u_format.h. 2009-12-17 23:41:57 +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 move assert to avoid crash in debug build. 2009-12-08 13:12:02 +00: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.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
Makefile llvmpipe: remove old prim_setup draw stage 2009-11-03 17:12:34 +00:00
README llvmpipe: Update/correct CPU requirements. 2009-11-26 11:16:34 +00:00
SConscript llvmpipe: remove old prim_setup draw stage 2009-11-03 17:12:34 +00:00
sp2lp.sh llvmpipe: Back port recent softpipe-opt improvements from Keith. 2009-08-29 09:21:39 +01:00

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
 
 - A x86 or amd64 processor.  64bit mode is preferred.
 
   Support for sse2 is strongly encouraged.  Support for ssse3, and sse4.1 will
   yield the most efficient code.  The less features the CPU has the more
   likely is that you ran into underperforming, buggy, or incomplete code.  
   
   See /proc/cpuinfo to know what your CPU supports.
 
 - LLVM 2.5 or greater. LLVM 2.6 is preferred.
 
   On Debian based distributions do:
 
     aptitude install llvm-dev

   There is a typo in one of the llvm 2.5 headers, that may cause compilation
   errors. To fix it apply the change:

     --- /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);
 
 - scons (optional)

 - udis86, http://udis86.sourceforge.net/ (optional):
 
     git clone git://udis86.git.sourceforge.net/gitroot/udis86/udis86
     cd udis86
     ./autogen.sh
     ./configure --with-pic
     make
     sudo make install
 

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.