llvmpipe: Update status in README and TODO/FIXME comments throughout the code.

This commit is contained in:
José Fonseca 2009-09-11 11:24:00 +01:00
parent 7c0152fbae
commit 1fc4100225
9 changed files with 36 additions and 36 deletions

View File

@ -8,13 +8,16 @@ Done so far is:
- the whole fragment pipeline is code generated in a single function - the whole fragment pipeline is code generated in a single function
- input interpolation
- depth testing - depth testing
- texture sampling (not all state/formats are supported)
- fragment shader TGSI translation - fragment shader TGSI translation
- same level of support as the TGSI SSE2 exec machine, with the exception - 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 we don't fallback to TGSI interpretation when an unsupported opcode is
found, but just ignore it found, but just ignore it
- texture sampling via an intrinsic call
- done in SoA layout - done in SoA layout
- input interpolation also code generated - input interpolation also code generated
@ -28,16 +31,17 @@ Done so far is:
any width and length any width and length
- not all operations are implemented for these types yet though - not all operations are implemented for these types yet though
Most mesa/progs/demos/* work. Speed is on par with Keith's softpipe-opt branch, Most mesa/progs/demos/* work.
which includes hand written fast implementations for common cases.
To do (probably by this order): To do (probably by this order):
- code generate stipple and stencil testing - code generate stipple and stencil testing
- code generate texture sampling - translate the remaining bits of texture sampling state
- translate TGSI control flow instructions, and all other remaining opcodes - 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 - code generate the triangle setup and rasterization
@ -93,7 +97,7 @@ Alternatively, you can build it with GNU make, if you prefer, by invoking it as
make linux-llvm make linux-llvm
but the rest of these instructions assume scons is used. but the rest of these instructions assume that scons is used.
Using Using
@ -108,6 +112,9 @@ or
export LD_LIBRARY_PATH=$PWD/build/linux-x86-debug/lib:$LD_LIBRARY_PATH 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 Unit testing
============ ============
@ -119,7 +126,7 @@ build/linux-???-debug/gallium/drivers/llvmpipe:
- lp_test_conv: SIMD vector conversion - lp_test_conv: SIMD vector conversion
- lp_test_format: pixel unpacking/packing - lp_test_format: pixel unpacking/packing
Some of this tests can output results and benchmarks to a tab-seperated-file Some of this tests can output results and benchmarks to a tab-separated-file
for posterior analysis, e.g.: for posterior analysis, e.g.:
build/linux-x86_64-debug/gallium/drivers/llvmpipe/lp_test_blend -o blend.tsv build/linux-x86_64-debug/gallium/drivers/llvmpipe/lp_test_blend -o blend.tsv
@ -133,10 +140,10 @@ Development Notes
at the top of the lp_bld_*.c functions. 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 - All lp_bld_*.[ch] are isolated from the rest of the driver, and could/may be
put in a standalone Gallium state -> LLVM IR translation module. 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++ - 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 interfaces very closely, and appear to be complete enough for code
generation. See generation. See
http://npcontemplation.blogspot.com/2008/06/secret-of-llvm-c-bindings.html http://npcontemplation.blogspot.com/2008/06/secret-of-llvm-c-bindings.html
for a standalone example. for a stand-alone example.

View File

@ -122,7 +122,7 @@ lp_build_clamped_float_to_unsigned_norm(LLVMBuilderRef builder,
int shift = dst_width - n; int shift = dst_width - n;
res = LLVMBuildShl(builder, res, lp_build_int_const_scalar(src_type, shift), ""); res = LLVMBuildShl(builder, res, lp_build_int_const_scalar(src_type, shift), "");
/* Fill in the empty lower bits for added precision? */ /* TODO: Fill in the empty lower bits for additional precision? */
#if 0 #if 0
{ {
LLVMValueRef msb; LLVMValueRef msb;
@ -244,7 +244,7 @@ lp_build_const_pack_shuffle(unsigned n)
* Expand the bit width. * Expand the bit width.
* *
* This will only change the number of bits the values are represented, not the * This will only change the number of bits the values are represented, not the
* values themselved. * values themselves.
*/ */
static void static void
lp_build_expand(LLVMBuilderRef builder, lp_build_expand(LLVMBuilderRef builder,

View File

@ -211,5 +211,6 @@ lp_build_depth_test(LLVMBuilderRef builder,
LLVMBuildStore(builder, dst, dst_ptr); LLVMBuildStore(builder, dst, dst_ptr);
} }
/* FIXME */
assert(!state->occlusion_count); assert(!state->occlusion_count);
} }

View File

@ -313,8 +313,6 @@ lp_build_select(struct lp_build_context *bld,
b = LLVMBuildBitCast(bld->builder, b, int_vec_type, ""); b = LLVMBuildBitCast(bld->builder, b, int_vec_type, "");
} }
/* TODO: On SSE4 we could do this with a single instruction -- PBLENDVB */
a = LLVMBuildAnd(bld->builder, a, mask, ""); a = LLVMBuildAnd(bld->builder, a, mask, "");
/* This often gets translated to PANDN, but sometimes the NOT is /* This often gets translated to PANDN, but sometimes the NOT is
@ -376,9 +374,9 @@ lp_build_select_aos(struct lp_build_context *bld,
return LLVMBuildShuffleVector(bld->builder, a, b, LLVMConstVector(shuffles, n), ""); return LLVMBuildShuffleVector(bld->builder, a, b, LLVMConstVector(shuffles, n), "");
} }
else {
#if 0 #if 0
else if(0) { /* XXX: Unfortunately select of vectors do not work */
/* FIXME: Unfortunately select of vectors do not work */
/* Use a select */ /* Use a select */
LLVMTypeRef elem_type = LLVMInt1Type(); LLVMTypeRef elem_type = LLVMInt1Type();
LLVMValueRef cond[LP_MAX_VECTOR_LENGTH]; LLVMValueRef cond[LP_MAX_VECTOR_LENGTH];
@ -388,10 +386,9 @@ lp_build_select_aos(struct lp_build_context *bld,
cond[j + i] = LLVMConstInt(elem_type, cond[i] ? 1 : 0, 0); cond[j + i] = LLVMConstInt(elem_type, cond[i] ? 1 : 0, 0);
return LLVMBuildSelect(bld->builder, LLVMConstVector(cond, n), a, b, ""); return LLVMBuildSelect(bld->builder, LLVMConstVector(cond, n), a, b, "");
} #else
#endif
else {
LLVMValueRef mask = lp_build_const_mask_aos(type, cond); LLVMValueRef mask = lp_build_const_mask_aos(type, cond);
return lp_build_select(bld, mask, a, b); return lp_build_select(bld, mask, a, b);
#endif
} }
} }

View File

@ -207,6 +207,7 @@ lp_build_sample_wrap(struct lp_build_sample_context *bld,
case PIPE_TEX_WRAP_MIRROR_CLAMP: case PIPE_TEX_WRAP_MIRROR_CLAMP:
case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE: case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER: case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
/* FIXME */
default: default:
assert(0); assert(0);
} }
@ -398,7 +399,13 @@ lp_build_sample_soa(LLVMBuilderRef builder,
case PIPE_TEX_FILTER_ANISO: case PIPE_TEX_FILTER_ANISO:
lp_build_sample_2d_linear_soa(&bld, s, t, width, height, stride, data_ptr, texel); lp_build_sample_2d_linear_soa(&bld, s, t, width, height, stride, data_ptr, texel);
break; break;
default:
assert(0);
} }
/* FIXME: respect static_state->min_mip_filter */;
/* FIXME: respect static_state->mag_img_filter */;
/* FIXME: respect static_state->prefilter */;
lp_build_sample_compare(&bld, p, texel); lp_build_sample_compare(&bld, p, texel);
} }

View File

@ -167,6 +167,7 @@ emit_fetch(
break; break;
case TGSI_UTIL_SIGN_SET: case TGSI_UTIL_SIGN_SET:
/* TODO: Use bitwese OR for floating point */
res = lp_build_abs( &bld->base, res ); res = lp_build_abs( &bld->base, res );
res = LLVMBuildNeg( bld->base.builder, res, "" ); res = LLVMBuildNeg( bld->base.builder, res, "" );
break; break;
@ -349,14 +350,6 @@ emit_kil(
} }
static void
emit_kilp(
struct lp_build_tgsi_soa_context *bld )
{
/* XXX todo / fix me */
}
/** /**
* Check if inst src/dest regs use indirect addressing into temporary * Check if inst src/dest regs use indirect addressing into temporary
* register file. * register file.
@ -398,6 +391,7 @@ emit_instruction(
switch (inst->Instruction.Opcode) { switch (inst->Instruction.Opcode) {
#if 0 #if 0
case TGSI_OPCODE_ARL: case TGSI_OPCODE_ARL:
/* FIXME */
FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
tmp0 = emit_fetch( bld, inst, 0, chan_index ); tmp0 = emit_fetch( bld, inst, 0, chan_index );
emit_flr(bld, 0, 0); emit_flr(bld, 0, 0);
@ -686,6 +680,7 @@ emit_instruction(
break; break;
case TGSI_OPCODE_CND: case TGSI_OPCODE_CND:
/* FIXME */
return 0; return 0;
break; break;
@ -849,13 +844,11 @@ emit_instruction(
return 0; return 0;
break; break;
#if 0
case TGSI_OPCODE_KILP: case TGSI_OPCODE_KILP:
/* predicated kill */ /* predicated kill */
emit_kilp( bld ); /* FIXME */
return 0; /* XXX fix me */ return 0;
break; break;
#endif
case TGSI_OPCODE_KIL: case TGSI_OPCODE_KIL:
/* conditional kill */ /* conditional kill */
@ -1309,7 +1302,7 @@ lp_build_tgsi_soa(LLVMBuilderRef builder,
switch( parse.FullToken.Token.Type ) { switch( parse.FullToken.Token.Type ) {
case TGSI_TOKEN_TYPE_DECLARATION: case TGSI_TOKEN_TYPE_DECLARATION:
/* Input already interpolated */ /* Inputs already interpolated */
break; break;
case TGSI_TOKEN_TYPE_INSTRUCTION: case TGSI_TOKEN_TYPE_INSTRUCTION:

View File

@ -141,8 +141,6 @@ llvmpipe_is_texture_referenced( struct pipe_context *pipe,
return PIPE_REFERENCED_FOR_WRITE; return PIPE_REFERENCED_FOR_WRITE;
} }
/* FIXME: we also need to do the same for the texture cache */
return PIPE_UNREFERENCED; return PIPE_UNREFERENCED;
} }

View File

@ -80,10 +80,9 @@ struct lp_jit_context
struct tgsi_sampler **samplers; struct tgsi_sampler **samplers;
/* TODO: alpha reference value */
float alpha_ref_value; float alpha_ref_value;
/* TODO: blend constant color */ /* FIXME: store (also?) in floats */
uint8_t *blend_color; uint8_t *blend_color;
struct lp_jit_texture textures[PIPE_MAX_SAMPLERS]; struct lp_jit_texture textures[PIPE_MAX_SAMPLERS];

View File

@ -163,8 +163,6 @@ shade_quads(struct llvmpipe_context *llvmpipe,
else else
depth = NULL; depth = NULL;
/* TODO: blend color */
/* XXX: This will most likely fail on 32bit x86 without -mstackrealign */ /* XXX: This will most likely fail on 32bit x86 without -mstackrealign */
assert(lp_check_alignment(mask, 16)); assert(lp_check_alignment(mask, 16));