summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarek Olšák <maraeo@gmail.com>2010-04-16 01:59:11 +0200
committerMarek Olšák <maraeo@gmail.com>2010-04-16 02:04:18 +0200
commit80d89aa0d28ca987d958c1033eeb7e4a3c10368b (patch)
treef7331b453e38eddbcdcc701bd5aea8735200d432 /src
parent4855b568ba66a4a55a78caa9867b08feaade5d1b (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.
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/r300/r300_fs.c3
-rw-r--r--src/mesa/drivers/dri/r300/compiler/r500_fragprog.c22
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 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);
-
- 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;