diff options
author | Marek Olšák <[email protected]> | 2010-04-16 01:59:11 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 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 | 22 |
2 files changed, 17 insertions, 8 deletions
diff --git a/src/gallium/drivers/r300/r300_fs.c b/src/gallium/drivers/r300/r300_fs.c index 01fd67e536b..a37f23aaef2 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 295e455d900..0caff487b0c 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); - - 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]; + /* 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_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; |