Mesa (master): r300/compiler: fix repeat wrap mode for TXP and NPOTs

Marek Olšák mareko at kemper.freedesktop.org
Fri Apr 16 00:07:52 UTC 2010


Module: Mesa
Branch: master
Commit: 80d89aa0d28ca987d958c1033eeb7e4a3c10368b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=80d89aa0d28ca987d958c1033eeb7e4a3c10368b

Author: Marek Olšák <maraeo at gmail.com>
Date:   Fri Apr 16 01:59:11 2010 +0200

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.

---

 src/gallium/drivers/r300/r300_fs.c                 |    3 +-
 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 01fd67e..a37f23a 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 295e455..0caff48 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;




More information about the mesa-commit mailing list