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
- 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
- texture sampling via an intrinsic call
- done in SoA layout
- input interpolation also code generated
@ -28,16 +31,17 @@ Done so far is:
any width and length
- 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,
which includes hand written fast implementations for common cases.
Most mesa/progs/demos/* work.
To do (probably by this order):
- 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
- integrate with the draw module for VS code generation
- 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
but the rest of these instructions assume scons is used.
but the rest of these instructions assume that scons is used.
Using
@ -108,6 +112,9 @@ 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
============
@ -119,7 +126,7 @@ build/linux-???-debug/gallium/drivers/llvmpipe:
- lp_test_conv: SIMD vector conversion
- 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.:
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.
- 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++
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 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;
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
{
LLVMValueRef msb;
@ -244,7 +244,7 @@ lp_build_const_pack_shuffle(unsigned n)
* Expand the bit width.
*
* This will only change the number of bits the values are represented, not the
* values themselved.
* values themselves.
*/
static void
lp_build_expand(LLVMBuilderRef builder,

View File

@ -211,5 +211,6 @@ lp_build_depth_test(LLVMBuilderRef builder,
LLVMBuildStore(builder, dst, dst_ptr);
}
/* FIXME */
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, "");
}
/* TODO: On SSE4 we could do this with a single instruction -- PBLENDVB */
a = LLVMBuildAnd(bld->builder, a, mask, "");
/* 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), "");
}
else {
#if 0
else if(0) {
/* FIXME: Unfortunately select of vectors do not work */
/* XXX: Unfortunately select of vectors do not work */
/* Use a select */
LLVMTypeRef elem_type = LLVMInt1Type();
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);
return LLVMBuildSelect(bld->builder, LLVMConstVector(cond, n), a, b, "");
}
#endif
else {
#else
LLVMValueRef mask = lp_build_const_mask_aos(type, cond);
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_TO_EDGE:
case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
/* FIXME */
default:
assert(0);
}
@ -398,7 +399,13 @@ lp_build_sample_soa(LLVMBuilderRef builder,
case PIPE_TEX_FILTER_ANISO:
lp_build_sample_2d_linear_soa(&bld, s, t, width, height, stride, data_ptr, texel);
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);
}

View File

@ -167,6 +167,7 @@ emit_fetch(
break;
case TGSI_UTIL_SIGN_SET:
/* TODO: Use bitwese OR for floating point */
res = lp_build_abs( &bld->base, res );
res = LLVMBuildNeg( bld->base.builder, res, "" );
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
* register file.
@ -398,6 +391,7 @@ emit_instruction(
switch (inst->Instruction.Opcode) {
#if 0
case TGSI_OPCODE_ARL:
/* FIXME */
FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
tmp0 = emit_fetch( bld, inst, 0, chan_index );
emit_flr(bld, 0, 0);
@ -686,6 +680,7 @@ emit_instruction(
break;
case TGSI_OPCODE_CND:
/* FIXME */
return 0;
break;
@ -849,13 +844,11 @@ emit_instruction(
return 0;
break;
#if 0
case TGSI_OPCODE_KILP:
/* predicated kill */
emit_kilp( bld );
return 0; /* XXX fix me */
/* FIXME */
return 0;
break;
#endif
case TGSI_OPCODE_KIL:
/* conditional kill */
@ -1309,7 +1302,7 @@ lp_build_tgsi_soa(LLVMBuilderRef builder,
switch( parse.FullToken.Token.Type ) {
case TGSI_TOKEN_TYPE_DECLARATION:
/* Input already interpolated */
/* Inputs already interpolated */
break;
case TGSI_TOKEN_TYPE_INSTRUCTION:

View File

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

View File

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

View File

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