llvmpipe: Translate more TGSI opcodes.

Basically cover all low hanging fruit, and mark the still missing opcodes
as "fixme" or deprecated.
This commit is contained in:
José Fonseca 2009-09-13 13:55:08 +01:00
parent 00dd0156e0
commit 873773ee2b

View file

@ -680,8 +680,15 @@ emit_instruction(
break;
case TGSI_OPCODE_CND:
/* FIXME */
return 0;
FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
src0 = emit_fetch( bld, inst, 0, chan_index );
src1 = emit_fetch( bld, inst, 1, chan_index );
src2 = emit_fetch( bld, inst, 2, chan_index );
tmp1 = lp_build_const_scalar(bld->base.type, 0.5);
tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src2, tmp1);
dst0 = lp_build_select( &bld->base, tmp0, src0, src1 );
emit_store( bld, inst, 0, chan_index, dst0);
}
break;
case TGSI_OPCODE_DP2A:
@ -699,23 +706,30 @@ emit_instruction(
}
break;
#if 0
case TGSI_OPCODE_FRC:
FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
tmp0 = emit_fetch( bld, inst, 0, chan_index );
emit_frc( bld, 0, 0 );
src0 = emit_fetch( bld, inst, 0, chan_index );
tmp0 = lp_build_floor(&bld->base, src0);
tmp0 = lp_build_sub(&bld->base, tmp0, src0);
emit_store( bld, inst, 0, chan_index, tmp0);
}
break;
case TGSI_OPCODE_CLAMP:
return 0;
FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
tmp0 = emit_fetch( bld, inst, 0, chan_index );
src1 = emit_fetch( bld, inst, 1, chan_index );
src2 = emit_fetch( bld, inst, 2, chan_index );
tmp0 = lp_build_max(&bld->base, tmp0, src1);
tmp0 = lp_build_min(&bld->base, tmp0, src2);
emit_store( bld, inst, 0, chan_index, tmp0);
}
break;
case TGSI_OPCODE_FLR:
FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
tmp0 = emit_fetch( bld, inst, 0, chan_index );
emit_flr( bld, 0, 0 );
tmp0 = lp_build_floor(&bld->base, tmp0);
emit_store( bld, inst, 0, chan_index, tmp0);
}
break;
@ -723,11 +737,10 @@ emit_instruction(
case TGSI_OPCODE_ROUND:
FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
tmp0 = emit_fetch( bld, inst, 0, chan_index );
emit_rnd( bld, 0, 0 );
tmp0 = lp_build_round(&bld->base, tmp0);
emit_store( bld, inst, 0, chan_index, tmp0);
}
break;
#endif
case TGSI_OPCODE_EX2: {
tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
@ -806,8 +819,9 @@ emit_instruction(
break;
case TGSI_OPCODE_RCC:
/* deprecated? */
assert(0);
return 0;
break;
case TGSI_OPCODE_DPH:
tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
@ -837,10 +851,12 @@ emit_instruction(
break;
case TGSI_OPCODE_DDX:
/* FIXME */
return 0;
break;
case TGSI_OPCODE_DDY:
/* FIXME */
return 0;
break;
@ -886,7 +902,10 @@ emit_instruction(
break;
case TGSI_OPCODE_SFL:
return 0;
FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
dst0 = bld->base.zero;
emit_store( bld, inst, 0, chan_index, dst0);
}
break;
case TGSI_OPCODE_SGT:
@ -928,7 +947,10 @@ emit_instruction(
break;
case TGSI_OPCODE_STR:
return 0;
FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
dst0 = bld->base.one;
emit_store( bld, inst, 0, chan_index, dst0);
}
break;
case TGSI_OPCODE_TEX:
@ -936,35 +958,49 @@ emit_instruction(
break;
case TGSI_OPCODE_TXD:
/* FIXME */
return 0;
break;
case TGSI_OPCODE_UP2H:
/* deprecated */
assert (0);
return 0;
break;
case TGSI_OPCODE_UP2US:
/* deprecated */
assert(0);
return 0;
break;
case TGSI_OPCODE_UP4B:
/* deprecated */
assert(0);
return 0;
break;
case TGSI_OPCODE_UP4UB:
/* deprecated */
assert(0);
return 0;
break;
case TGSI_OPCODE_X2D:
/* deprecated? */
assert(0);
return 0;
break;
case TGSI_OPCODE_ARA:
/* deprecated */
assert(0);
return 0;
break;
#if 0
case TGSI_OPCODE_ARR:
/* FIXME */
FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
tmp0 = emit_fetch( bld, inst, 0, chan_index );
emit_rnd( bld, 0, 0 );
@ -975,32 +1011,33 @@ emit_instruction(
#endif
case TGSI_OPCODE_BRA:
/* deprecated */
assert(0);
return 0;
break;
case TGSI_OPCODE_CAL:
/* FIXME */
return 0;
break;
#if 0
case TGSI_OPCODE_RET:
emit_ret( bld );
/* FIXME */
return 0;
break;
#endif
case TGSI_OPCODE_END:
break;
#if 0
case TGSI_OPCODE_SSG:
/* TGSI_OPCODE_SGN */
FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
tmp0 = emit_fetch( bld, inst, 0, chan_index );
emit_sgn( bld, 0, 0 );
tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
tmp0 = lp_build_sgn( &bld->base, tmp0 );
emit_store( bld, inst, 0, chan_index, tmp0);
}
break;
#endif
case TGSI_OPCODE_CMP:
FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
@ -1126,6 +1163,8 @@ emit_instruction(
break;
case TGSI_OPCODE_DIV:
/* deprecated */
assert( 0 );
return 0;
break;
@ -1151,105 +1190,146 @@ emit_instruction(
break;
case TGSI_OPCODE_BRK:
/* FIXME */
return 0;
break;
case TGSI_OPCODE_IF:
/* FIXME */
return 0;
break;
case TGSI_OPCODE_BGNFOR:
/* deprecated */
assert(0);
return 0;
break;
case TGSI_OPCODE_REP:
/* deprecated */
assert(0);
return 0;
break;
case TGSI_OPCODE_ELSE:
/* FIXME */
return 0;
break;
case TGSI_OPCODE_ENDIF:
/* FIXME */
return 0;
break;
case TGSI_OPCODE_ENDFOR:
/* deprecated */
assert(0);
return 0;
break;
case TGSI_OPCODE_ENDREP:
/* deprecated */
assert(0);
return 0;
break;
case TGSI_OPCODE_PUSHA:
/* deprecated? */
assert(0);
return 0;
break;
case TGSI_OPCODE_POPA:
/* deprecated? */
assert(0);
return 0;
break;
case TGSI_OPCODE_CEIL:
return 0;
FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
tmp0 = emit_fetch( bld, inst, 0, chan_index );
tmp0 = lp_build_ceil(&bld->base, tmp0);
emit_store( bld, inst, 0, chan_index, tmp0);
}
break;
case TGSI_OPCODE_I2F:
/* deprecated? */
assert(0);
return 0;
break;
case TGSI_OPCODE_NOT:
/* deprecated? */
assert(0);
return 0;
break;
#if 0
case TGSI_OPCODE_TRUNC:
FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
tmp0 = emit_fetch( bld, inst, 0, chan_index );
emit_f2it( bld, 0 );
emit_i2f( bld, 0 );
tmp0 = lp_build_trunc(&bld->base, tmp0);
emit_store( bld, inst, 0, chan_index, tmp0);
}
break;
#endif
case TGSI_OPCODE_SHL:
/* deprecated? */
assert(0);
return 0;
break;
case TGSI_OPCODE_SHR:
/* deprecated? */
assert(0);
return 0;
break;
case TGSI_OPCODE_AND:
/* deprecated? */
assert(0);
return 0;
break;
case TGSI_OPCODE_OR:
/* deprecated? */
assert(0);
return 0;
break;
case TGSI_OPCODE_MOD:
/* deprecated? */
assert(0);
return 0;
break;
case TGSI_OPCODE_XOR:
/* deprecated? */
assert(0);
return 0;
break;
case TGSI_OPCODE_SAD:
/* deprecated? */
assert(0);
return 0;
break;
case TGSI_OPCODE_TXF:
/* deprecated? */
assert(0);
return 0;
break;
case TGSI_OPCODE_TXQ:
/* deprecated? */
assert(0);
return 0;
break;
case TGSI_OPCODE_CONT:
/* deprecated? */
assert(0);
return 0;
break;
@ -1261,6 +1341,19 @@ emit_instruction(
return 0;
break;
case TGSI_OPCODE_NOISE1:
case TGSI_OPCODE_NOISE2:
case TGSI_OPCODE_NOISE3:
case TGSI_OPCODE_NOISE4:
FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
tmp0 = bld->base.zero;
emit_store( bld, inst, 0, chan_index, tmp0);
}
break;
case TGSI_OPCODE_NOP:
break;
default:
return 0;
}