aboutsummaryrefslogtreecommitdiff
path: root/src/GPU3D.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/GPU3D.cpp')
-rw-r--r--src/GPU3D.cpp46
1 files changed, 42 insertions, 4 deletions
diff --git a/src/GPU3D.cpp b/src/GPU3D.cpp
index fd8d320..a02e286 100644
--- a/src/GPU3D.cpp
+++ b/src/GPU3D.cpp
@@ -181,6 +181,8 @@ u32 RenderClearAttr1, RenderClearAttr2;
bool RenderFrameIdentical;
+u16 RenderXPos;
+
u32 ZeroDotWLimit;
u32 GXStat;
@@ -385,6 +387,8 @@ void Reset()
FlushAttributes = 0;
ResetRenderingState();
+
+ RenderXPos = 0;
}
void DoSavestate(Savestate* file)
@@ -430,6 +434,8 @@ void DoSavestate(Savestate* file)
file->Var32(&RenderClearAttr1);
file->Var32(&RenderClearAttr2);
+ file->Var16(&RenderXPos);
+
file->Var32(&ZeroDotWLimit);
file->Var32(&GXStat);
@@ -587,8 +593,6 @@ void DoSavestate(Savestate* file)
}
}
- // probably not worth storing the vblank-latched Renderxxxxxx variables
-
CmdStallQueue->DoSavestate(file);
file->Var32((u32*)&VertexPipeline);
file->Var32((u32*)&NormalPipeline);
@@ -2564,14 +2568,48 @@ void VCount215()
#endif
}
+void SetRenderXPos(u16 xpos)
+{
+ if (!RenderingEnabled) return;
+
+ RenderXPos = xpos & 0x01FF;
+}
+
+u32 ScrolledLine[256];
+
u32* GetLine(int line)
{
- if (GPU::Renderer == 0) return SoftRenderer::GetLine(line);
+ u32* rawline;
+
+ if (GPU::Renderer == 0) rawline = SoftRenderer::GetLine(line);
#ifdef OGLRENDERER_ENABLED
- else return GLRenderer::GetLine(line);
+ else rawline = GLRenderer::GetLine(line);
#else
return NULL;
#endif
+
+ if (RenderXPos == 0) return rawline;
+
+ // apply X scroll
+
+ if (RenderXPos & 0x100)
+ {
+ int i = 0, j = RenderXPos;
+ for (; j < 512; i++, j++)
+ ScrolledLine[i] = 0;
+ for (j = 0; i < 256; i++, j++)
+ ScrolledLine[i] = rawline[j];
+ }
+ else
+ {
+ int i = 0, j = RenderXPos;
+ for (; j < 256; i++, j++)
+ ScrolledLine[i] = rawline[j];
+ for (; i < 256; i++)
+ ScrolledLine[i] = 0;
+ }
+
+ return ScrolledLine;
}