diff options
| -rw-r--r-- | src/gallium/drivers/r300/r300_state_shader.c | 7 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_state_shader.h | 23 | 
2 files changed, 30 insertions, 0 deletions
| diff --git a/src/gallium/drivers/r300/r300_state_shader.c b/src/gallium/drivers/r300/r300_state_shader.c index e4db008ff8..9f4024c4ba 100644 --- a/src/gallium/drivers/r300/r300_state_shader.c +++ b/src/gallium/drivers/r300/r300_state_shader.c @@ -366,6 +366,13 @@ static void r500_fs_instruction(struct r500_fragment_shader* fs,              fs->instructions[i].inst4 &= ~R500_SWIZ_ALPHA_A(0x7);              fs->instructions[i].inst4 |= R500_SWIZ_ALPHA_A(R500_SWIZZLE_ONE);              break; +        case TGSI_OPCODE_MUL: +            /* Force our src2 to zero */ +            inst->FullSrcRegisters[2] = r500_constant_zero; +            r500_emit_maths(fs, assembler, inst->FullSrcRegisters, +                    &inst->FullDstRegisters[0], inst->Instruction.Opcode, 3, +                    false); +            break;          case TGSI_OPCODE_MAD:              r500_emit_maths(fs, assembler, inst->FullSrcRegisters,                      &inst->FullDstRegisters[0], inst->Instruction.Opcode, 3, diff --git a/src/gallium/drivers/r300/r300_state_shader.h b/src/gallium/drivers/r300/r300_state_shader.h index 284ae6acf1..76e0f0cd2d 100644 --- a/src/gallium/drivers/r300/r300_state_shader.h +++ b/src/gallium/drivers/r300/r300_state_shader.h @@ -30,6 +30,7 @@  #include "r300_reg.h"  #include "r300_screen.h" +/* XXX this all should find its way back to r300_reg */  /* Swizzle tools */  #define R500_SWIZZLE_ZERO 4  #define R500_SWIZZLE_HALF 5 @@ -57,6 +58,28 @@  #define R500_ALU_WMASK(x) ((x) << 11)  #define R500_ALU_OMASK(x) ((x) << 15) +/* TGSI constants. TGSI is like XML: If it can't solve your problems, you're + * not using enough of it. */ +static const struct tgsi_full_src_register r500_constant_zero = { +    .SrcRegister.Extended = TRUE, +    .SrcRegister.File = TGSI_FILE_TEMPORARY, +    .SrcRegister.Index = 0, +    .SrcRegisterExtSwz.ExtSwizzleX = TGSI_EXTSWIZZLE_ZERO, +    .SrcRegisterExtSwz.ExtSwizzleY = TGSI_EXTSWIZZLE_ZERO, +    .SrcRegisterExtSwz.ExtSwizzleZ = TGSI_EXTSWIZZLE_ZERO, +    .SrcRegisterExtSwz.ExtSwizzleW = TGSI_EXTSWIZZLE_ZERO, +}; + +static const struct tgsi_full_src_register r500_constant_one = { +    .SrcRegister.Extended = TRUE, +    .SrcRegister.File = TGSI_FILE_TEMPORARY, +    .SrcRegister.Index = 0, +    .SrcRegisterExtSwz.ExtSwizzleX = TGSI_EXTSWIZZLE_ONE, +    .SrcRegisterExtSwz.ExtSwizzleY = TGSI_EXTSWIZZLE_ONE, +    .SrcRegisterExtSwz.ExtSwizzleZ = TGSI_EXTSWIZZLE_ONE, +    .SrcRegisterExtSwz.ExtSwizzleW = TGSI_EXTSWIZZLE_ONE, +}; +  /* Temporary struct used to hold assembly state while putting together   * fragment programs. */  struct r300_fs_asm { | 
