diff options
Diffstat (limited to 'src/gallium/drivers')
| -rw-r--r-- | src/gallium/drivers/r300/r300_state_tcl.c | 33 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_state_tcl.h | 1 | 
2 files changed, 34 insertions, 0 deletions
diff --git a/src/gallium/drivers/r300/r300_state_tcl.c b/src/gallium/drivers/r300/r300_state_tcl.c index 47d6c6dfcd..fc865a2b63 100644 --- a/src/gallium/drivers/r300/r300_state_tcl.c +++ b/src/gallium/drivers/r300/r300_state_tcl.c @@ -117,6 +117,9 @@ static INLINE unsigned r300_vs_dst(struct r300_vs_asm* assembler,  static uint32_t r300_vs_op(unsigned op)  {      switch (op) { +        case TGSI_OPCODE_DP3: +        case TGSI_OPCODE_DP4: +            return R300_VE_DOT_PRODUCT;          case TGSI_OPCODE_MUL:              return R300_VE_MULTIPLY;          case TGSI_OPCODE_ADD: @@ -195,6 +198,36 @@ static void r300_vs_instruction(struct r300_vertex_shader* vs,                      &inst->FullDstRegisters[0], inst->Instruction.Opcode,                      2);              break; +        case TGSI_OPCODE_DP3: +            /* Set alpha swizzle to zero for src0 and src1 */ +            if (!inst->FullSrcRegisters[0].SrcRegister.Extended) { +                inst->FullSrcRegisters[0].SrcRegister.Extended = TRUE; +                inst->FullSrcRegisters[0].SrcRegisterExtSwz.ExtSwizzleX = +                    inst->FullSrcRegisters[0].SrcRegister.SwizzleX; +                inst->FullSrcRegisters[0].SrcRegisterExtSwz.ExtSwizzleY = +                    inst->FullSrcRegisters[0].SrcRegister.SwizzleY; +                inst->FullSrcRegisters[0].SrcRegisterExtSwz.ExtSwizzleZ = +                    inst->FullSrcRegisters[0].SrcRegister.SwizzleZ; +            } +            inst->FullSrcRegisters[0].SrcRegisterExtSwz.ExtSwizzleW = +                TGSI_EXTSWIZZLE_ZERO; +            if (!inst->FullSrcRegisters[1].SrcRegister.Extended) { +                inst->FullSrcRegisters[1].SrcRegister.Extended = TRUE; +                inst->FullSrcRegisters[1].SrcRegisterExtSwz.ExtSwizzleX = +                    inst->FullSrcRegisters[1].SrcRegister.SwizzleX; +                inst->FullSrcRegisters[1].SrcRegisterExtSwz.ExtSwizzleY = +                    inst->FullSrcRegisters[1].SrcRegister.SwizzleY; +                inst->FullSrcRegisters[1].SrcRegisterExtSwz.ExtSwizzleZ = +                    inst->FullSrcRegisters[1].SrcRegister.SwizzleZ; +            } +            inst->FullSrcRegisters[1].SrcRegisterExtSwz.ExtSwizzleW = +                TGSI_EXTSWIZZLE_ZERO; +            /* Fall through */ +        case TGSI_OPCODE_DP4: +            r300_vs_emit_inst(vs, assembler, inst->FullSrcRegisters, +                    &inst->FullDstRegisters[0], inst->Instruction.Opcode, +                    2); +            break;          case TGSI_OPCODE_MOV:          case TGSI_OPCODE_SWZ:              inst->FullSrcRegisters[1] = r300_constant_zero; diff --git a/src/gallium/drivers/r300/r300_state_tcl.h b/src/gallium/drivers/r300/r300_state_tcl.h index 3d10e248e1..de944028ba 100644 --- a/src/gallium/drivers/r300/r300_state_tcl.h +++ b/src/gallium/drivers/r300/r300_state_tcl.h @@ -32,6 +32,7 @@  /* XXX get these to r300_reg */  #define R300_PVS_DST_OPCODE(x)   ((x) << 0) +#   define R300_VE_DOT_PRODUCT            1  #   define R300_VE_MULTIPLY               2  #   define R300_VE_ADD                    3  #define R300_PVS_DST_MACRO_INST    (1 << 7)  | 
