llvmpipe: Update status in README and TODO/FIXME comments throughout the code.
This commit is contained in:
parent
7c0152fbae
commit
1fc4100225
|
@ -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.
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -211,5 +211,6 @@ lp_build_depth_test(LLVMBuilderRef builder,
|
|||
LLVMBuildStore(builder, dst, dst_ptr);
|
||||
}
|
||||
|
||||
/* FIXME */
|
||||
assert(!state->occlusion_count);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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));
|
||||
|
||||
|
|
Loading…
Reference in New Issue