mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-02 19:40:26 +01:00
r300/compiler: add emulation of all mirrored-clamp wrap modes for NPOT textures
This commit is contained in:
parent
f91a06eed2
commit
411d506332
3 changed files with 24 additions and 3 deletions
|
|
@ -169,10 +169,14 @@ static void get_external_state(
|
|||
break;
|
||||
|
||||
case PIPE_TEX_WRAP_MIRROR_REPEAT:
|
||||
state->unit[i].wrap_mode = RC_WRAP_MIRRORED_REPEAT;
|
||||
state->unit[i].fake_npot = TRUE;
|
||||
break;
|
||||
|
||||
case PIPE_TEX_WRAP_MIRROR_CLAMP:
|
||||
case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
|
||||
case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
|
||||
state->unit[i].wrap_mode = RC_WRAP_MIRROR;
|
||||
state->unit[i].wrap_mode = RC_WRAP_MIRRORED_CLAMP;
|
||||
state->unit[i].fake_npot = TRUE;
|
||||
break;
|
||||
|
||||
|
|
|
|||
|
|
@ -115,7 +115,8 @@ typedef enum {
|
|||
typedef enum {
|
||||
RC_WRAP_NONE = 0,
|
||||
RC_WRAP_REPEAT,
|
||||
RC_WRAP_MIRROR
|
||||
RC_WRAP_MIRRORED_REPEAT,
|
||||
RC_WRAP_MIRRORED_CLAMP
|
||||
} rc_wrap_mode;
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -233,7 +233,7 @@ int radeonTransformTEX(
|
|||
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];
|
||||
} else if (wrapmode == RC_WRAP_MIRROR) {
|
||||
} else if (wrapmode == RC_WRAP_MIRRORED_REPEAT) {
|
||||
/*
|
||||
* Function:
|
||||
* f(v) = 1 - abs(frac(v * 0.5) * 2 - 1)
|
||||
|
|
@ -295,6 +295,22 @@ int radeonTransformTEX(
|
|||
inst_add->U.I.SrcReg[1].Swizzle = RC_SWIZZLE_XYZ0;
|
||||
inst_add->U.I.SrcReg[1].Abs = 1;
|
||||
inst_add->U.I.SrcReg[1].Negate = RC_MASK_XYZ;
|
||||
} else if (wrapmode == RC_WRAP_MIRRORED_CLAMP) {
|
||||
/*
|
||||
* Mirrored clamp modes are bloody simple, we just use abs
|
||||
* to mirror [0, 1] into [-1, 0]. This works for
|
||||
* all modes i.e. CLAMP, CLAMP_TO_EDGE, and CLAMP_TO_BORDER.
|
||||
*/
|
||||
struct rc_instruction *inst_mov;
|
||||
|
||||
inst_mov = rc_insert_new_instruction(c, inst->Prev);
|
||||
|
||||
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_XYZ;
|
||||
inst_mov->U.I.SrcReg[0] = inst->U.I.SrcReg[0];
|
||||
inst_mov->U.I.SrcReg[0].Abs = 1;
|
||||
}
|
||||
|
||||
/* Preserve W for TXP/TXB. */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue