diff options
| author | Marek Olšák <maraeo@gmail.com> | 2010-04-16 01:59:11 +0200 | 
|---|---|---|
| committer | Marek Olšák <maraeo@gmail.com> | 2010-04-16 02:04:18 +0200 | 
| commit | 80d89aa0d28ca987d958c1033eeb7e4a3c10368b (patch) | |
| tree | f7331b453e38eddbcdcc701bd5aea8735200d432 | |
| parent | 4855b568ba66a4a55a78caa9867b08feaade5d1b (diff) | |
r300/compiler: fix repeat wrap mode for TXP and NPOTs
No idea why st/mesa unnecessarily inserts TXP where TEX is sufficient.
Also re-enabling the NPOT fallback for repeat in r300g.
| -rw-r--r-- | src/gallium/drivers/r300/r300_fs.c | 3 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r300/compiler/r500_fragprog.c | 20 | 
2 files changed, 16 insertions, 7 deletions
| diff --git a/src/gallium/drivers/r300/r300_fs.c b/src/gallium/drivers/r300/r300_fs.c index 01fd67e536..a37f23aaef 100644 --- a/src/gallium/drivers/r300/r300_fs.c +++ b/src/gallium/drivers/r300/r300_fs.c @@ -165,8 +165,7 @@ static void get_external_state(                  switch (s->state.wrap_s) {                      case PIPE_TEX_WRAP_REPEAT:                          state->unit[i].wrap_mode = RC_WRAP_REPEAT; -                        /* XXX Enable when REPEAT fallback works. -                        state->unit[i].fake_npot = TRUE; */ +                        state->unit[i].fake_npot = TRUE;                          break;                      case PIPE_TEX_WRAP_MIRROR_REPEAT: diff --git a/src/mesa/drivers/dri/r300/compiler/r500_fragprog.c b/src/mesa/drivers/dri/r300/compiler/r500_fragprog.c index 295e455d90..0caff487b0 100644 --- a/src/mesa/drivers/dri/r300/compiler/r500_fragprog.c +++ b/src/mesa/drivers/dri/r300/compiler/r500_fragprog.c @@ -200,12 +200,22 @@ int r500_transform_TEX(  			}  			if (wrapmode == RC_WRAP_REPEAT) { -				inst_rect = rc_insert_new_instruction(c, inst->Prev); +				/* Both instructions will be paired up. */ +				struct rc_instruction *inst_frc = rc_insert_new_instruction(c, inst->Prev); +				struct rc_instruction *inst_mov = rc_insert_new_instruction(c, inst_frc); -				inst_rect->U.I.Opcode = RC_OPCODE_FRC; -				inst_rect->U.I.DstReg.File = RC_FILE_TEMPORARY; -				inst_rect->U.I.DstReg.Index = temp; -				inst_rect->U.I.SrcReg[0] = inst->U.I.SrcReg[0]; +				inst_frc->U.I.Opcode = RC_OPCODE_FRC; +				inst_frc->U.I.DstReg.File = RC_FILE_TEMPORARY; +				inst_frc->U.I.DstReg.Index = temp; +				inst_frc->U.I.DstReg.WriteMask = RC_MASK_XYZ; +				inst_frc->U.I.SrcReg[0] = inst->U.I.SrcReg[0]; + +				/* Preserve W for TXP. */ +				inst_mov->U.I.Opcode = RC_OPCODE_MOV; +				inst_mov->U.I.DstReg.File = RC_FILE_TEMPORARY; +				inst_mov->U.I.DstReg.Index = temp; +				inst_mov->U.I.DstReg.WriteMask = RC_MASK_W; +				inst_mov->U.I.SrcReg[0] = inst->U.I.SrcReg[0];  				reset_srcreg(&inst->U.I.SrcReg[0]);  				inst->U.I.SrcReg[0].File = RC_FILE_TEMPORARY; | 
