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; break;
case TGSI_OPCODE_CND: case TGSI_OPCODE_CND:
/* FIXME */ FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
return 0; 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; break;
case TGSI_OPCODE_DP2A: case TGSI_OPCODE_DP2A:
@ -699,23 +706,30 @@ emit_instruction(
} }
break; break;
#if 0
case TGSI_OPCODE_FRC: case TGSI_OPCODE_FRC:
FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
tmp0 = emit_fetch( bld, inst, 0, chan_index ); src0 = emit_fetch( bld, inst, 0, chan_index );
emit_frc( bld, 0, 0 ); tmp0 = lp_build_floor(&bld->base, src0);
tmp0 = lp_build_sub(&bld->base, tmp0, src0);
emit_store( bld, inst, 0, chan_index, tmp0); emit_store( bld, inst, 0, chan_index, tmp0);
} }
break; break;
case TGSI_OPCODE_CLAMP: 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; break;
case TGSI_OPCODE_FLR: case TGSI_OPCODE_FLR:
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 ); tmp0 = lp_build_floor(&bld->base, tmp0);
emit_store( bld, inst, 0, chan_index, tmp0); emit_store( bld, inst, 0, chan_index, tmp0);
} }
break; break;
@ -723,11 +737,10 @@ emit_instruction(
case TGSI_OPCODE_ROUND: case TGSI_OPCODE_ROUND:
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_rnd( bld, 0, 0 ); tmp0 = lp_build_round(&bld->base, tmp0);
emit_store( bld, inst, 0, chan_index, tmp0); emit_store( bld, inst, 0, chan_index, tmp0);
} }
break; break;
#endif
case TGSI_OPCODE_EX2: { case TGSI_OPCODE_EX2: {
tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
@ -806,8 +819,9 @@ emit_instruction(
break; break;
case TGSI_OPCODE_RCC: case TGSI_OPCODE_RCC:
/* deprecated? */
assert(0);
return 0; return 0;
break;
case TGSI_OPCODE_DPH: case TGSI_OPCODE_DPH:
tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
@ -837,10 +851,12 @@ emit_instruction(
break; break;
case TGSI_OPCODE_DDX: case TGSI_OPCODE_DDX:
/* FIXME */
return 0; return 0;
break; break;
case TGSI_OPCODE_DDY: case TGSI_OPCODE_DDY:
/* FIXME */
return 0; return 0;
break; break;
@ -886,7 +902,10 @@ emit_instruction(
break; break;
case TGSI_OPCODE_SFL: 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; break;
case TGSI_OPCODE_SGT: case TGSI_OPCODE_SGT:
@ -928,7 +947,10 @@ emit_instruction(
break; break;
case TGSI_OPCODE_STR: 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; break;
case TGSI_OPCODE_TEX: case TGSI_OPCODE_TEX:
@ -936,35 +958,49 @@ emit_instruction(
break; break;
case TGSI_OPCODE_TXD: case TGSI_OPCODE_TXD:
/* FIXME */
return 0; return 0;
break; break;
case TGSI_OPCODE_UP2H: case TGSI_OPCODE_UP2H:
/* deprecated */
assert (0);
return 0; return 0;
break; break;
case TGSI_OPCODE_UP2US: case TGSI_OPCODE_UP2US:
/* deprecated */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_UP4B: case TGSI_OPCODE_UP4B:
/* deprecated */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_UP4UB: case TGSI_OPCODE_UP4UB:
/* deprecated */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_X2D: case TGSI_OPCODE_X2D:
/* deprecated? */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_ARA: case TGSI_OPCODE_ARA:
/* deprecated */
assert(0);
return 0; return 0;
break; break;
#if 0 #if 0
case TGSI_OPCODE_ARR: case TGSI_OPCODE_ARR:
/* 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_rnd( bld, 0, 0 ); emit_rnd( bld, 0, 0 );
@ -975,32 +1011,33 @@ emit_instruction(
#endif #endif
case TGSI_OPCODE_BRA: case TGSI_OPCODE_BRA:
/* deprecated */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_CAL: case TGSI_OPCODE_CAL:
/* FIXME */
return 0; return 0;
break; break;
#if 0
case TGSI_OPCODE_RET: case TGSI_OPCODE_RET:
emit_ret( bld ); /* FIXME */
return 0;
break; break;
#endif
case TGSI_OPCODE_END: case TGSI_OPCODE_END:
break; break;
#if 0
case TGSI_OPCODE_SSG: case TGSI_OPCODE_SSG:
/* TGSI_OPCODE_SGN */ /* TGSI_OPCODE_SGN */
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_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); emit_store( bld, inst, 0, chan_index, tmp0);
} }
break; break;
#endif
case TGSI_OPCODE_CMP: case TGSI_OPCODE_CMP:
FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
@ -1126,6 +1163,8 @@ emit_instruction(
break; break;
case TGSI_OPCODE_DIV: case TGSI_OPCODE_DIV:
/* deprecated */
assert( 0 );
return 0; return 0;
break; break;
@ -1151,105 +1190,146 @@ emit_instruction(
break; break;
case TGSI_OPCODE_BRK: case TGSI_OPCODE_BRK:
/* FIXME */
return 0; return 0;
break; break;
case TGSI_OPCODE_IF: case TGSI_OPCODE_IF:
/* FIXME */
return 0; return 0;
break; break;
case TGSI_OPCODE_BGNFOR: case TGSI_OPCODE_BGNFOR:
/* deprecated */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_REP: case TGSI_OPCODE_REP:
/* deprecated */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_ELSE: case TGSI_OPCODE_ELSE:
/* FIXME */
return 0; return 0;
break; break;
case TGSI_OPCODE_ENDIF: case TGSI_OPCODE_ENDIF:
/* FIXME */
return 0; return 0;
break; break;
case TGSI_OPCODE_ENDFOR: case TGSI_OPCODE_ENDFOR:
/* deprecated */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_ENDREP: case TGSI_OPCODE_ENDREP:
/* deprecated */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_PUSHA: case TGSI_OPCODE_PUSHA:
/* deprecated? */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_POPA: case TGSI_OPCODE_POPA:
/* deprecated? */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_CEIL: 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; break;
case TGSI_OPCODE_I2F: case TGSI_OPCODE_I2F:
/* deprecated? */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_NOT: case TGSI_OPCODE_NOT:
/* deprecated? */
assert(0);
return 0; return 0;
break; break;
#if 0
case TGSI_OPCODE_TRUNC: case TGSI_OPCODE_TRUNC:
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_f2it( bld, 0 ); tmp0 = lp_build_trunc(&bld->base, tmp0);
emit_i2f( bld, 0 );
emit_store( bld, inst, 0, chan_index, tmp0); emit_store( bld, inst, 0, chan_index, tmp0);
} }
break; break;
#endif
case TGSI_OPCODE_SHL: case TGSI_OPCODE_SHL:
/* deprecated? */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_SHR: case TGSI_OPCODE_SHR:
/* deprecated? */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_AND: case TGSI_OPCODE_AND:
/* deprecated? */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_OR: case TGSI_OPCODE_OR:
/* deprecated? */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_MOD: case TGSI_OPCODE_MOD:
/* deprecated? */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_XOR: case TGSI_OPCODE_XOR:
/* deprecated? */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_SAD: case TGSI_OPCODE_SAD:
/* deprecated? */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_TXF: case TGSI_OPCODE_TXF:
/* deprecated? */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_TXQ: case TGSI_OPCODE_TXQ:
/* deprecated? */
assert(0);
return 0; return 0;
break; break;
case TGSI_OPCODE_CONT: case TGSI_OPCODE_CONT:
/* deprecated? */
assert(0);
return 0; return 0;
break; break;
@ -1261,6 +1341,19 @@ emit_instruction(
return 0; return 0;
break; 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: default:
return 0; return 0;
} }