summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Ryan Holtz <rholtz@batcountryentertainment.com>2012-02-19 11:21:36 +0000
committer Ryan Holtz <rholtz@batcountryentertainment.com>2012-02-19 11:21:36 +0000
commit285c2fd3b7ea7d6fa79f710d9b61f960269bf4de (patch)
treedac8185dcb5ad4cb3e9c66faa8aebcf3c030ab78 /src
parent4ba8461f7cfe12d35ad94d79554a04d2e40cf751 (diff)
- Fixed N64 RDP to not try to render a triangle with no spans. [Ryan Holtz]
Diffstat (limited to 'src')
-rw-r--r--src/mame/video/n64.c37
-rw-r--r--src/mame/video/n64.h9
-rw-r--r--src/mame/video/rdpspn16.c44
-rw-r--r--src/mame/video/rdptpipe.c36
-rw-r--r--src/mame/video/rdptpipe.h8
5 files changed, 76 insertions, 58 deletions
diff --git a/src/mame/video/n64.c b/src/mame/video/n64.c
index ffcd01c477b..34c45108dad 100644
--- a/src/mame/video/n64.c
+++ b/src/mame/video/n64.c
@@ -119,7 +119,6 @@ void n64_rdp::VideoUpdate16(n64_periphs *n64, bitmap_rgb32 &bitmap)
UINT32 hres = ((float)hdiff * hcoeff);
INT32 invisiblewidth = n64->vi_width - hres;
- //printf("%d, %f, %d, %d\n", hdiff, hcoeff, hres, invisiblewidth);
INT32 vdiff = ((n64->vi_vstart & 0x3ff) - ((n64->vi_vstart >> 16) & 0x3ff)) >> 1;
float vcoeff = ((float)(n64->vi_yscale & 0xfff) / (1 << 10));
UINT32 vres = ((float)vdiff * vcoeff);
@@ -1169,7 +1168,6 @@ UINT32 n64_rdp::ReadData(UINT32 address)
{
if (m_status & 0x1) // XBUS_DMEM_DMA enabled
{
- //printf("%08x\n", rsp_dmem[(address & 0xfff) / 4]);
return rsp_dmem[(address & 0xfff) / 4];
}
else
@@ -2112,8 +2110,8 @@ void n64_rdp::DrawTriangle(bool shade, bool texture, bool zbuffer, bool rect)
int xfrac = ((xright >> 8) & 0xff);
- rdp_poly_state &object = object_data_alloc();
- memcpy(&object.m_tmem, m_tmem, 0x1000);
+ bool new_object = true;
+ rdp_poly_state *object = NULL;
if(flip)
{
@@ -2152,6 +2150,13 @@ void n64_rdp::DrawTriangle(bool shade, bool texture, bool zbuffer, bool rect)
if (spix == 0)
{
+ if(new_object)
+ {
+ object = &object_data_alloc();
+ memcpy(object->m_tmem, m_tmem, 0x1000);
+ new_object = false;
+ }
+
Spans[j - (ycur >> 2)].userdata = (void*)((UINT8*)AuxBuf + AuxBufPtr);
AuxBufPtr += sizeof(rdp_span_aux);
@@ -2161,7 +2166,8 @@ void n64_rdp::DrawTriangle(bool shade, bool texture, bool zbuffer, bool rect)
}
rdp_span_aux *userdata = (rdp_span_aux*)Spans[j - (ycur >> 2)].userdata;
- userdata->m_tmem = object.m_tmem;
+
+ userdata->m_tmem = object->m_tmem;
userdata->BlendColor = BlendColor;
userdata->PrimColor = PrimColor;
@@ -2310,6 +2316,13 @@ void n64_rdp::DrawTriangle(bool shade, bool texture, bool zbuffer, bool rect)
if (spix == 0)
{
+ if(new_object)
+ {
+ object = &object_data_alloc();
+ memcpy(object->m_tmem, m_tmem, 0x1000);
+ new_object = false;
+ }
+
Spans[j - (ycur >> 2)].userdata = (void*)((UINT8*)AuxBuf + AuxBufPtr);
AuxBufPtr += sizeof(rdp_span_aux);
@@ -2319,7 +2332,7 @@ void n64_rdp::DrawTriangle(bool shade, bool texture, bool zbuffer, bool rect)
}
rdp_span_aux *userdata = (rdp_span_aux*)Spans[j - (ycur >> 2)].userdata;
- userdata->m_tmem = object.m_tmem;
+ userdata->m_tmem = object->m_tmem;
userdata->BlendColor = BlendColor;
userdata->PrimColor = PrimColor;
@@ -2431,7 +2444,11 @@ void n64_rdp::DrawTriangle(bool shade, bool texture, bool zbuffer, bool rect)
}
}
- RenderSpans(yh >> 2, yl >> 2, tilenum, flip ? true : false, Spans, rect, object);
+ if(!new_object)
+ {
+ RenderSpans(yh >> 2, yl >> 2, tilenum, flip ? true : false, Spans, rect, object);
+ }
+
//wait("DrawTriangle");
}
@@ -2892,7 +2909,7 @@ void n64_rdp::CmdSyncTile(UINT32 w1, UINT32 w2)
void n64_rdp::CmdSyncFull(UINT32 w1, UINT32 w2)
{
- wait("SyncFull");
+ //wait("SyncFull");
dp_full_sync(*m_machine);
}
@@ -3459,14 +3476,14 @@ void n64_rdp::CmdSetTextureImage(UINT32 w1, UINT32 w2)
void n64_rdp::CmdSetMaskImage(UINT32 w1, UINT32 w2)
{
- wait("SetMaskImage");
+ //wait("SetMaskImage");
MiscState.ZBAddress = w2 & 0x01ffffff;
}
void n64_rdp::CmdSetColorImage(UINT32 w1, UINT32 w2)
{
- wait("SetColorImage");
+ //wait("SetColorImage");
MiscState.FBFormat = (w1 >> 21) & 0x7;
MiscState.FBSize = (w1 >> 19) & 0x3;
diff --git a/src/mame/video/n64.h b/src/mame/video/n64.h
index d56ab66dd55..2ab0a542ad4 100644
--- a/src/mame/video/n64.h
+++ b/src/mame/video/n64.h
@@ -368,8 +368,6 @@ struct rdp_span_aux
INT32 ShiftB;
INT32 m_precomp_s;
INT32 m_precomp_t;
- INT32 m_clamp_s_diff[8];
- INT32 m_clamp_t_diff[8];
UINT8 BlendEnable;
bool PreWrap;
INT32 m_dzpix_enc;
@@ -501,7 +499,7 @@ class n64_rdp : public poly_manager<UINT32, rdp_poly_state, 8, 32000>
void TCDiv(INT32 ss, INT32 st, INT32 sw, INT32* sss, INT32* sst);
void TCDivNoPersp(INT32 ss, INT32 st, INT32 sw, INT32* sss, INT32* sst);
UINT32 GetLog2(UINT32 lod_clamp);
- void RenderSpans(int start, int end, int tilenum, bool flip, extent_t *Spans, bool rect, rdp_poly_state &object);
+ void RenderSpans(int start, int end, int tilenum, bool flip, extent_t *Spans, bool rect, rdp_poly_state *object);
void GetAlphaCvg(UINT8 *comb_alpha, rdp_span_aux *userdata, const rdp_poly_state &object);
const UINT8* GetBayerMatrix() const { return s_bayer_matrix; }
const UINT8* GetMagicMatrix() const { return s_magic_matrix; }
@@ -614,6 +612,9 @@ class n64_rdp : public poly_manager<UINT32, rdp_poly_state, 8, 32000>
UINT32 ExtentBufIndex;
bool rdp_range_check(UINT32 addr);
+
+ N64Tile m_tiles[8];
+
protected:
CombineModesT m_combine;
bool m_pending_mode_block;
@@ -645,8 +646,6 @@ class n64_rdp : public poly_manager<UINT32, rdp_poly_state, 8, 32000>
UINT8* m_tmem;
- N64Tile m_tiles[8];
-
running_machine* m_machine;
// YUV factors
diff --git a/src/mame/video/rdpspn16.c b/src/mame/video/rdpspn16.c
index d8c6b94d39b..4460a76dc33 100644
--- a/src/mame/video/rdpspn16.c
+++ b/src/mame/video/rdpspn16.c
@@ -4,7 +4,7 @@
#define LookUpCC(A, B, C, D) m_rdp->GetCCLUT2()[(m_rdp->GetCCLUT1()[(A << 16) | (B << 8) | C] << 8) | D]
-void n64_rdp::RenderSpans(int start, int end, int tilenum, bool flip, extent_t *Spans, bool rect, rdp_poly_state &object)
+void n64_rdp::RenderSpans(int start, int end, int tilenum, bool flip, extent_t *Spans, bool rect, rdp_poly_state *object)
{
int clipy1 = Scissor.m_yh;
int clipy2 = Scissor.m_yl;
@@ -34,16 +34,16 @@ void n64_rdp::RenderSpans(int start, int end, int tilenum, bool flip, extent_t *
end = clipy2 - 1;
}
- object.m_rdp = this;
- memcpy(&object.MiscState, &MiscState, sizeof(MiscStateT));
- memcpy(&object.OtherModes, &OtherModes, sizeof(OtherModesT));
- memcpy(&object.SpanBase, &SpanBase, sizeof(SpanBaseT));
- memcpy(&object.Scissor, &Scissor, sizeof(Rectangle));
- memcpy(&object.m_tiles, &m_tiles, 8 * sizeof(N64Tile));
- object.tilenum = tilenum;
- object.flip = flip;
- object.FillColor = FillColor;
- object.rect = rect;
+ object->m_rdp = this;
+ memcpy(&object->MiscState, &MiscState, sizeof(MiscStateT));
+ memcpy(&object->OtherModes, &OtherModes, sizeof(OtherModesT));
+ memcpy(&object->SpanBase, &SpanBase, sizeof(SpanBaseT));
+ memcpy(&object->Scissor, &Scissor, sizeof(Rectangle));
+ memcpy(&object->m_tiles, &m_tiles, 8 * sizeof(N64Tile));
+ object->tilenum = tilenum;
+ object->flip = flip;
+ object->FillColor = FillColor;
+ object->rect = rect;
switch(OtherModes.cycle_type)
{
@@ -62,6 +62,7 @@ void n64_rdp::RenderSpans(int start, int end, int tilenum, bool flip, extent_t *
render_triangle_custom(visarea, render_delegate(FUNC(n64_rdp::SpanDrawFill), this), start, (end - start) + 1, Spans + offset);
break;
}
+ wait();
}
void n64_rdp::RGBAZClip(int sr, int sg, int sb, int sa, int *sz, rdp_span_aux *userdata)
@@ -140,7 +141,9 @@ void n64_rdp::SpanDraw1Cycle(INT32 scanline, const extent_t &extent, const rdp_p
rdp_span_aux *userdata = (rdp_span_aux*)extent.userdata;
- m_rdp->TexPipe.CalculateClampDiffs(tile1, userdata, object);
+ INT32 m_clamp_s_diff[8];
+ INT32 m_clamp_t_diff[8];
+ m_rdp->TexPipe.CalculateClampDiffs(tile1, userdata, object, m_clamp_s_diff, m_clamp_t_diff);
bool partialreject = (userdata->ColorInputs.blender2b_a[0] == &userdata->InvPixelColor.i.a && userdata->ColorInputs.blender1b_a[0] == &userdata->PixelColor.i.a);
bool bsel0 = (userdata->ColorInputs.blender2b_a[0] == &userdata->MemoryColor.i.a);
@@ -170,8 +173,6 @@ void n64_rdp::SpanDraw1Cycle(INT32 scanline, const extent_t &extent, const rdp_p
int length = flip ? (xstart - xend) : (xend - xstart);
UINT32 fir, fig, fib;
- //if(object.rect) printf("(%s) Scan %d Span %d to %d %d, length %d\n", flip ? "Flip" : "NoFlip", scanline, xstart, xend_scissored, xend, length); fflush(stdout);
-
if(object.OtherModes.z_source_sel)
{
z.w = ((UINT32)object.MiscState.PrimitiveZ) << 16;
@@ -221,7 +222,7 @@ void n64_rdp::SpanDraw1Cycle(INT32 scanline, const extent_t &extent, const rdp_p
RGBAZCorrectTriangle(offx, offy, &sr, &sg, &sb, &sa, &sz, userdata, object);
RGBAZClip(sr, sg, sb, sa, &sz, userdata);
- m_rdp->TexPipe.Cycle(&userdata->Texel0Color, &userdata->Texel0Color, sss, sst, tilenum, 0, userdata, object);
+ m_rdp->TexPipe.Cycle(&userdata->Texel0Color, &userdata->Texel0Color, sss, sst, tilenum, 0, userdata, object, m_clamp_s_diff, m_clamp_t_diff);
m_rdp->ColorCombiner1Cycle(userdata);
@@ -243,6 +244,7 @@ void n64_rdp::SpanDraw1Cycle(INT32 scanline, const extent_t &extent, const rdp_p
if (rendered)
{
((this)->*(_Write[((object.MiscState.FBSize - 2) << 3) | (object.OtherModes.cvg_dest << 1) | userdata->BlendEnable]))(curpixel, fir, fig, fib, userdata, object);
+
if (object.OtherModes.z_update_en)
{
m_rdp->ZStore(zbcur, zhbcur, sz, userdata->m_dzpix_enc);
@@ -262,8 +264,6 @@ void n64_rdp::SpanDraw1Cycle(INT32 scanline, const extent_t &extent, const rdp_p
x += xinc;
}
-
- //printf("\n");
}
void n64_rdp::SpanDraw2Cycle(INT32 scanline, const extent_t &extent, const rdp_poly_state &object, int threadid)
@@ -297,7 +297,9 @@ void n64_rdp::SpanDraw2Cycle(INT32 scanline, const extent_t &extent, const rdp_p
rdp_span_aux *userdata = (rdp_span_aux*)extent.userdata;
- m_rdp->TexPipe.CalculateClampDiffs(tile1, userdata, object);
+ INT32 m_clamp_s_diff[8];
+ INT32 m_clamp_t_diff[8];
+ m_rdp->TexPipe.CalculateClampDiffs(tile1, userdata, object, m_clamp_s_diff, m_clamp_t_diff);
bool partialreject = (userdata->ColorInputs.blender2b_a[1] == &userdata->InvPixelColor.i.a && userdata->ColorInputs.blender1b_a[1] == &userdata->PixelColor.i.a);
bool bsel0 = (userdata->ColorInputs.blender2b_a[0] == &userdata->MemoryColor.i.a);
@@ -383,10 +385,10 @@ void n64_rdp::SpanDraw2Cycle(INT32 scanline, const extent_t &extent, const rdp_p
RGBAZCorrectTriangle(offx, offy, &sr, &sg, &sb, &sa, &sz, userdata, object);
RGBAZClip(sr, sg, sb, sa, &sz, userdata);
- m_rdp->TexPipe.Cycle(&userdata->Texel0Color, &userdata->Texel0Color, sss, sst, tile1, 0, userdata, object);
- m_rdp->TexPipe.Cycle(&userdata->Texel1Color, &userdata->Texel0Color, sss, sst, tile2, 1, userdata, object);
+ m_rdp->TexPipe.Cycle(&userdata->Texel0Color, &userdata->Texel0Color, sss, sst, tile1, 0, userdata, object, m_clamp_s_diff, m_clamp_t_diff);
+ m_rdp->TexPipe.Cycle(&userdata->Texel1Color, &userdata->Texel0Color, sss, sst, tile2, 1, userdata, object, m_clamp_s_diff, m_clamp_t_diff);
- m_rdp->TexPipe.Cycle(&userdata->NextTexelColor, &userdata->NextTexelColor, sss, sst, tile2, 1, userdata, object);
+ m_rdp->TexPipe.Cycle(&userdata->NextTexelColor, &userdata->NextTexelColor, sss, sst, tile2, 1, userdata, object, m_clamp_s_diff, m_clamp_t_diff);
m_rdp->ColorCombiner2Cycle(userdata);
diff --git a/src/mame/video/rdptpipe.c b/src/mame/video/rdptpipe.c
index d6e0ba3e0c2..64067e6b599 100644
--- a/src/mame/video/rdptpipe.c
+++ b/src/mame/video/rdptpipe.c
@@ -148,7 +148,7 @@ void N64TexturePipeT::ShiftCopy(INT32* S, INT32* T, UINT32 num, const rdp_poly_s
*T = SIGN16(*T);
}
-void N64TexturePipeT::ClampCycle(INT32* S, INT32* T, INT32* SFRAC, INT32* TFRAC, INT32 maxs, INT32 maxt, INT32 num, rdp_span_aux *userdata, const rdp_poly_state& object)
+void N64TexturePipeT::ClampCycle(INT32* S, INT32* T, INT32* SFRAC, INT32* TFRAC, INT32 maxs, INT32 maxt, INT32 num, rdp_span_aux *userdata, const rdp_poly_state& object, INT32 *m_clamp_s_diff, INT32 *m_clamp_t_diff)
{
const N64Tile* tile = object.m_tiles;
int dos = tile[num].cs || !tile[num].mask_s;
@@ -163,7 +163,7 @@ void N64TexturePipeT::ClampCycle(INT32* S, INT32* T, INT32* SFRAC, INT32* TFRAC,
}
else if (maxs)
{
- *S = userdata->m_clamp_s_diff[num];
+ *S = m_clamp_s_diff[num];
*SFRAC = 0;
}
else
@@ -185,7 +185,7 @@ void N64TexturePipeT::ClampCycle(INT32* S, INT32* T, INT32* SFRAC, INT32* TFRAC,
}
else if (maxt)
{
- *T = userdata->m_clamp_t_diff[num];
+ *T = m_clamp_t_diff[num];
*TFRAC = 0;
}
else
@@ -199,7 +199,7 @@ void N64TexturePipeT::ClampCycle(INT32* S, INT32* T, INT32* SFRAC, INT32* TFRAC,
}
}
-void N64TexturePipeT::ClampCycleLight(INT32* S, INT32* T, bool maxs, bool maxt, INT32 num, rdp_span_aux *userdata, const rdp_poly_state& object)
+void N64TexturePipeT::ClampCycleLight(INT32* S, INT32* T, bool maxs, bool maxt, INT32 num, rdp_span_aux *userdata, const rdp_poly_state& object, INT32 *m_clamp_s_diff, INT32 *m_clamp_t_diff)
{
const N64Tile* tile = object.m_tiles;
int dos = tile[num].cs || !tile[num].mask_s;
@@ -213,7 +213,7 @@ void N64TexturePipeT::ClampCycleLight(INT32* S, INT32* T, bool maxs, bool maxt,
}
else if (maxs)
{
- *S = userdata->m_clamp_s_diff[num];
+ *S = m_clamp_s_diff[num];
}
else
{
@@ -233,7 +233,7 @@ void N64TexturePipeT::ClampCycleLight(INT32* S, INT32* T, bool maxs, bool maxt,
}
else if (maxt)
{
- *T = userdata->m_clamp_t_diff[num];
+ *T = m_clamp_t_diff[num];
}
else
{
@@ -246,7 +246,7 @@ void N64TexturePipeT::ClampCycleLight(INT32* S, INT32* T, bool maxs, bool maxt,
}
}
-void N64TexturePipeT::Cycle(Color* TEX, Color* prev, INT32 SSS, INT32 SST, UINT32 tilenum, UINT32 cycle, rdp_span_aux *userdata, const rdp_poly_state& object)
+void N64TexturePipeT::Cycle(Color* TEX, Color* prev, INT32 SSS, INT32 SST, UINT32 tilenum, UINT32 cycle, rdp_span_aux *userdata, const rdp_poly_state& object, INT32 *m_clamp_s_diff, INT32 *m_clamp_t_diff)
{
const N64Tile* tile = object.m_tiles;
@@ -279,7 +279,7 @@ void N64TexturePipeT::Cycle(Color* TEX, Color* prev, INT32 SSS, INT32 SST, UINT3
INT32 sfrac = sss1 & 0x1f;
INT32 tfrac = sst1 & 0x1f;
- ClampCycle(&sss1, &sst1, &sfrac, &tfrac, maxs, maxt, tilenum, userdata, object);
+ ClampCycle(&sss1, &sst1, &sfrac, &tfrac, maxs, maxt, tilenum, userdata, object, m_clamp_s_diff, m_clamp_t_diff);
sss2 = sss1 + 1;
sst2 = sst1 + 1;
@@ -374,7 +374,7 @@ void N64TexturePipeT::Cycle(Color* TEX, Color* prev, INT32 SSS, INT32 SST, UINT3
sss1 = TRELATIVE(sss1, tile[tilenum].sl);
sst1 = TRELATIVE(sst1, tile[tilenum].tl);
- ClampCycleLight(&sss1, &sst1, maxs, maxt, tilenum, userdata, object);
+ ClampCycleLight(&sss1, &sst1, maxs, maxt, tilenum, userdata, object, m_clamp_s_diff, m_clamp_t_diff);
Mask(&sss1, &sst1, tilenum, object);
@@ -774,7 +774,7 @@ void N64TexturePipeT::LOD2CycleLimited(INT32* sss, INT32* sst, INT32 s, INT32 t,
}
}
-void N64TexturePipeT::CalculateClampDiffs(UINT32 prim_tile, rdp_span_aux *userdata, const rdp_poly_state& object)
+void N64TexturePipeT::CalculateClampDiffs(UINT32 prim_tile, rdp_span_aux *userdata, const rdp_poly_state& object, INT32 *m_clamp_s_diff, INT32 *m_clamp_t_diff)
{
const N64Tile* tile = object.m_tiles;
if (object.OtherModes.cycle_type == CYCLE_TYPE_2)
@@ -785,24 +785,24 @@ void N64TexturePipeT::CalculateClampDiffs(UINT32 prim_tile, rdp_span_aux *userda
int end = 7;
for (; start <= end; start++)
{
- userdata->m_clamp_s_diff[start] = (tile[start].sh >> 2) - (tile[start].sl >> 2);
- userdata->m_clamp_t_diff[start] = (tile[start].th >> 2) - (tile[start].tl >> 2);
+ m_clamp_s_diff[start] = (tile[start].sh >> 2) - (tile[start].sl >> 2);
+ m_clamp_t_diff[start] = (tile[start].th >> 2) - (tile[start].tl >> 2);
}
}
else
{
int start = prim_tile;
int end = (prim_tile + 1) & 7;
- userdata->m_clamp_s_diff[start] = (tile[start].sh >> 2) - (tile[start].sl >> 2);
- userdata->m_clamp_t_diff[start] = (tile[start].th >> 2) - (tile[start].tl >> 2);
- userdata->m_clamp_s_diff[end] = (tile[end].sh >> 2) - (tile[end].sl >> 2);
- userdata->m_clamp_t_diff[end] = (tile[end].th >> 2) - (tile[end].tl >> 2);
+ m_clamp_s_diff[start] = (tile[start].sh >> 2) - (tile[start].sl >> 2);
+ m_clamp_t_diff[start] = (tile[start].th >> 2) - (tile[start].tl >> 2);
+ m_clamp_s_diff[end] = (tile[end].sh >> 2) - (tile[end].sl >> 2);
+ m_clamp_t_diff[end] = (tile[end].th >> 2) - (tile[end].tl >> 2);
}
}
else//1-cycle or copy
{
- userdata->m_clamp_s_diff[prim_tile] = (tile[prim_tile].sh >> 2) - (tile[prim_tile].sl >> 2);
- userdata->m_clamp_t_diff[prim_tile] = (tile[prim_tile].th >> 2) - (tile[prim_tile].tl >> 2);
+ m_clamp_s_diff[prim_tile] = (tile[prim_tile].sh >> 2) - (tile[prim_tile].sl >> 2);
+ m_clamp_t_diff[prim_tile] = (tile[prim_tile].th >> 2) - (tile[prim_tile].tl >> 2);
}
}
diff --git a/src/mame/video/rdptpipe.h b/src/mame/video/rdptpipe.h
index bef1d1b87be..46ab6f131fe 100644
--- a/src/mame/video/rdptpipe.h
+++ b/src/mame/video/rdptpipe.h
@@ -74,10 +74,10 @@ class N64TexturePipeT
TexelFetch[71] = &N64TexturePipeT::_FetchI_8_TLUT1;
}
- void Cycle(Color* TEX, Color* prev, INT32 SSS, INT32 SST, UINT32 tilenum, UINT32 cycle, rdp_span_aux *userdata, const rdp_poly_state& object);
+ void Cycle(Color* TEX, Color* prev, INT32 SSS, INT32 SST, UINT32 tilenum, UINT32 cycle, rdp_span_aux *userdata, const rdp_poly_state& object, INT32 *m_clamp_s_diff, INT32 *m_clamp_t_diff);
void Copy(Color* TEX, INT32 SSS, INT32 SST, UINT32 tilenum, const rdp_poly_state& object, rdp_span_aux *userdata);
UINT32 Fetch(INT32 SSS, INT32 SST, INT32 tile, const rdp_poly_state& object, rdp_span_aux *userdata);
- void CalculateClampDiffs(UINT32 prim_tile, rdp_span_aux *userdata, const rdp_poly_state& object);
+ void CalculateClampDiffs(UINT32 prim_tile, rdp_span_aux *userdata, const rdp_poly_state& object, INT32 *m_clamp_s_diff, INT32 *m_clamp_t_diff);
void LOD1Cycle(INT32* sss, INT32* sst, INT32 s, INT32 t, INT32 w, INT32 dsinc, INT32 dtinc, INT32 dwinc, rdp_span_aux *userdata, const rdp_poly_state& object);
void LOD2Cycle(INT32* sss, INT32* sst, INT32 s, INT32 t, INT32 w, INT32 dsinc, INT32 dtinc, INT32 dwinc, INT32 prim_tile, INT32* t1, INT32* t2, rdp_span_aux *userdata, const rdp_poly_state& object);
void LOD2CycleLimited(INT32* sss, INT32* sst, INT32 s, INT32 t, INT32 w, INT32 dsinc, INT32 dtinc, INT32 dwinc, INT32 prim_tile, INT32* t1, const rdp_poly_state& object);
@@ -95,8 +95,8 @@ class N64TexturePipeT
void ShiftCycle(INT32* S, INT32* T, INT32* maxs, INT32* maxt, UINT32 num, const rdp_poly_state& object);
void ShiftCopy(INT32* S, INT32* T, UINT32 num, const rdp_poly_state& object);
- void ClampCycle(INT32* S, INT32* T, INT32* SFRAC, INT32* TFRAC, INT32 maxs, INT32 maxt, INT32 num, rdp_span_aux *userdata, const rdp_poly_state& object);
- void ClampCycleLight(INT32* S, INT32* T, bool maxs, bool maxt, INT32 num, rdp_span_aux *userdata, const rdp_poly_state& object);
+ void ClampCycle(INT32* S, INT32* T, INT32* SFRAC, INT32* TFRAC, INT32 maxs, INT32 maxt, INT32 num, rdp_span_aux *userdata, const rdp_poly_state& object, INT32 *m_clamp_s_diff, INT32 *m_clamp_t_diff);
+ void ClampCycleLight(INT32* S, INT32* T, bool maxs, bool maxt, INT32 num, rdp_span_aux *userdata, const rdp_poly_state& object, INT32 *m_clamp_s_diff, INT32 *m_clamp_t_diff);
UINT32 _FetchNOP(INT32 s, INT32 t, INT32 tbase, INT32 tpal, rdp_span_aux *userdata);