diff options
Diffstat (limited to 'src/gallium')
| -rw-r--r-- | src/gallium/drivers/llvmpipe/lp_bld_tgsi_soa.c | 139 | 
1 files changed, 116 insertions, 23 deletions
| diff --git a/src/gallium/drivers/llvmpipe/lp_bld_tgsi_soa.c b/src/gallium/drivers/llvmpipe/lp_bld_tgsi_soa.c index 4756811dc3..c6488d073c 100644 --- a/src/gallium/drivers/llvmpipe/lp_bld_tgsi_soa.c +++ b/src/gallium/drivers/llvmpipe/lp_bld_tgsi_soa.c @@ -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;     } | 
