diff options
author | Corbin Simpson <[email protected]> | 2009-03-16 06:14:23 -0700 |
---|---|---|
committer | Corbin Simpson <[email protected]> | 2009-03-16 06:49:22 -0700 |
commit | d16533cc873bd120264483d6a170fb296ba24835 (patch) | |
tree | 4a9b19418e5df20f636ce43e46c66bae42e183e0 | |
parent | fe1c94d8d34cbda3b6005ecb9d7a2087df8c10a9 (diff) |
r300-gallium: r500-fs: MUL.
-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 e4db008ff88..9f4024c4bab 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 284ae6acf14..76e0f0cd2dd 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 { |