Clone of mesa.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Vinson Lee 0bfc579bd4 llvmpipe: Remove comma at end of enumerator list. 15 years ago
..
.gitignore llvmpipe: Autogenerate lp_tile_soa.c from u_format.csv. 16 years ago
Makefile llvmpipe: remove old prim_setup draw stage 16 years ago
README llvmpipe: Update status in README and TODO/FIXME comments throughout the code. 16 years ago
SConscript llvmpipe: remove old prim_setup draw stage 16 years ago
lp_bld_alpha.c llvmpipe: Make lp_type a regular union. 16 years ago
lp_bld_alpha.h llvmpipe: Make lp_type a regular union. 16 years ago
lp_bld_arit.c llvmpipe: Immediate multiplication. 16 years ago
lp_bld_arit.h llvmpipe: Immediate multiplication. 16 years ago
lp_bld_blend.h llvmpipe: Make lp_type a regular union. 16 years ago
lp_bld_blend_aos.c llvmpipe: Remove comma at end of enumerator list. 15 years ago
lp_bld_blend_logicop.c llvmpipe: Add a bunch of comments. 16 years ago
lp_bld_blend_soa.c llvmpipe: Make lp_type a regular union. 16 years ago
lp_bld_const.c llvmpipe: Make lp_type a regular union. 16 years ago
lp_bld_const.h llvmpipe: Remove extraneous name in lp_type pre-declaration. 16 years ago
lp_bld_conv.c llvmpipe: Factor vector packing/unpacking to a separate source file. 16 years ago
lp_bld_conv.h llvmpipe: Remove extraneous name in lp_type pre-declaration. 16 years ago
lp_bld_debug.c llvmpipe: Debug function to check stack alignment. 16 years ago
lp_bld_debug.h llvmpipe: Debug function to check stack alignment. 16 years ago
lp_bld_depth.c llvmpipe: Fix assert. 15 years ago
lp_bld_depth.h llvmpipe: Make lp_type a regular union. 16 years ago
lp_bld_flow.c llvmpipe: Remove comma at end of enumerator list. 15 years ago
lp_bld_flow.h llvmpipe: Make lp_type a regular union. 16 years ago
lp_bld_format.h llvmpipe: New module to help make assertions about formats. 16 years ago
lp_bld_format_aos.c llvmpipe: Silence compiler warnings. 15 years ago
lp_bld_format_query.c llvmpipe: New module to help make assertions about formats. 16 years ago
lp_bld_format_soa.c llvmpipe: Split the format swizzling step from the unpacking. 16 years ago
lp_bld_interp.c llvmpipe: Immediate multiplication. 16 years ago
lp_bld_interp.h llvmpipe: Make lp_type a regular union. 16 years ago
lp_bld_intr.c llvmpipe: Pre-declare fetch_texel. 16 years ago
lp_bld_intr.h llvmpipe: Pre-declare fetch_texel. 16 years ago
lp_bld_logic.c llvmpipe: Emit SSE intrinsics based on runtime cpu capability check. 16 years ago
lp_bld_logic.h llvmpipe: Remove extraneous name in lp_type pre-declaration. 16 years ago
lp_bld_misc.cpp llvmpipe: Fix build with llvm 2.6. 16 years ago
lp_bld_misc.h llvmpipe: Fix build with llvm 2.6. 16 years ago
lp_bld_pack.c llvmpipe: Allow different signs when unpacking. 16 years ago
lp_bld_pack.h llvmpipe: Factor vector packing/unpacking to a separate source file. 16 years ago
lp_bld_sample.c llvmpipe: Factor our pixel offset computation. 16 years ago
lp_bld_sample.h llvmpipe: Factor our pixel offset computation. 16 years ago
lp_bld_sample_soa.c llvmpipe: Human friendlier sampler state dump. 16 years ago
lp_bld_struct.c llvmpipe: Utility function to get the pointer to a structure member. 16 years ago
lp_bld_struct.h llvmpipe: Utility function to get the pointer to a structure member. 16 years ago
lp_bld_swizzle.c llvmpipe: Make lp_type a regular union. 16 years ago
lp_bld_swizzle.h llvmpipe: Remove extraneous name in lp_type pre-declaration. 16 years ago
lp_bld_tgsi.h llvmpipe: Make lp_type a regular union. 16 years ago
lp_bld_tgsi_soa.c llvmpipe: Silence compiler warnings. 15 years ago
lp_bld_type.c llvmpipe: Utility function to double the bit width of a type. 16 years ago
lp_bld_type.h llvmpipe: Add inlines to quickly generate types matching the native SIMD register bitwidth. 16 years ago
lp_buffer.c llvmpipe: Actually commit lp_buffer.[ch]. 16 years ago
lp_buffer.h llvmpipe: Actually commit lp_buffer.[ch]. 16 years ago
lp_clear.c llvmpipe: set dirty_render_cache in llvmpipe_clear() 16 years ago
lp_clear.h llvmpipe: Rename preprocessor symbols too. 16 years ago
lp_context.c llvmpipe: remove old prim_setup draw stage 16 years ago
lp_context.h llvmpipe: remove old prim_setup draw stage 16 years ago
lp_draw_arrays.c llvmpipe: Eliminate constant mapping/unmapping. 16 years ago
lp_flush.c llvmpipe: Ensure tile cache transfers are mapped before flushing it. 16 years ago
lp_flush.h llvmpipe: Rename preprocessor symbols too. 16 years ago
lp_jit.c llvmpipe: Make sure the JIT engine and X86 target are linked on MSVC build. 16 years ago
lp_jit.h llvmpipe: Update status in README and TODO/FIXME comments throughout the code. 16 years ago
lp_prim_vbuf.c llvmpipe: Silence compiler warnings. 15 years ago
lp_prim_vbuf.h llvmpipe: remove old prim_setup draw stage 16 years ago
lp_quad.h llvmpipe: Generate the fragment pipeline into a single function. 16 years ago
lp_query.c llvmpipe: Rename preprocessor symbols too. 16 years ago
lp_query.h llvmpipe: Rename preprocessor symbols too. 16 years ago
lp_screen.c llvmpipe: increase max 3D texture size to 256 16 years ago
lp_screen.h llvmpipe: Define an winsys for LLVM. Drop pipe_winsys 16 years ago
lp_setup.c llvmpipe: remove old prim_setup draw stage 16 years ago
lp_setup.h llvmpipe: prefix point/line/tri_setup() functions with llvmpipe_ 16 years ago
lp_state.h llvmpipe: Include zsbuf's format in the fragment shader key. 16 years ago
lp_state_blend.c llvmpipe: Fix derived blend color state. 16 years ago
lp_state_clip.c llvmpipe: Rename preprocessor symbols too. 16 years ago
lp_state_derived.c llvmpipe: Sanitise shader semantic and interpolator handling. 16 years ago
lp_state_fs.c llvmpipe: Silence compiler warnings. 15 years ago
lp_state_rasterizer.c llvmpipe: Rename preprocessor symbols too. 16 years ago
lp_state_sampler.c llvmpipe: Code generate the texture sampling inside the shader. 16 years ago
lp_state_surface.c llvmpipe: Ensure tile cache transfers are mapped before flushing it. 16 years ago
lp_state_vertex.c llvmpipe: Rename preprocessor symbols too. 16 years ago
lp_state_vs.c llvmpipe: Split off vs stuff from lp_state_fs.c. 16 years ago
lp_surface.c llvmpipe: Fork softpipe for experimentation with llvm. 16 years ago
lp_surface.h llvmpipe: Rename preprocessor symbols too. 16 years ago
lp_test.h llvmpipe: Define rdtsc for MSVC. 16 years ago
lp_test_blend.c llvmpipe: Ensure stack variables in unit tests are properly aligned. 16 years ago
lp_test_conv.c llvmpipe: Use C-style comment. 15 years ago
lp_test_format.c llvmpipe: Ensure stack variables in unit tests are properly aligned. 16 years ago
lp_test_main.c llvmpipe: Make sure the JIT engine and X86 target are linked on MSVC build. 16 years ago
lp_tex_cache.c llvmpipe: Silent debug statement. 16 years ago
lp_tex_cache.h llvmpipe: Silence compiler warnings. 15 years ago
lp_tex_sample.h llvmpipe: Code generate the texture sampling inside the shader. 16 years ago
lp_tex_sample_c.c llvmpipe: Silence uninitialized variable warning. 15 years ago
lp_tex_sample_llvm.c llvmpipe: Make lp_type a regular union. 16 years ago
lp_texture.c llvmpipe: Allocate texture storage for whole quads. 16 years ago
lp_texture.h llvmpipe: Define an winsys for LLVM. Drop pipe_winsys 16 years ago
lp_tile_cache.c llvmpipe: Ensure tile cache transfers are mapped before flushing it. 16 years ago
lp_tile_cache.h llvmpipe: move tile cache datatypes into .c file since they're private 16 years ago
lp_tile_soa.h llvmpipe: Silence compiler warnings. 15 years ago
lp_tile_soa.py llvmpipe: Autogenerate lp_tile_soa.c from u_format.csv. 16 years ago
lp_winsys.h llvmpipe: Silence compiler warnings. 15 years ago
sp2lp.sh llvmpipe: Back port recent softpipe-opt improvements from Keith. 16 years ago

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.