summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Software/Src/XFMemLoader.cpp
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2013-09-10 23:12:54 -0400
committerJasper St. Pierre <jstpierre@mecheye.net>2013-10-07 10:37:01 -0400
commita7c72081039ca1c6bee6b18db44fe4e9ffaf4fb5 (patch)
tree70e3c53d290bf5f0e76a2f3295b4ff01e07e2127 /Source/Core/VideoBackends/Software/Src/XFMemLoader.cpp
parentd6f0ecebb4742f6b41397420f7d58ab7a05a03cc (diff)
Put Plugins/ in Core/, rename to VideoBackends
Diffstat (limited to 'Source/Core/VideoBackends/Software/Src/XFMemLoader.cpp')
-rw-r--r--Source/Core/VideoBackends/Software/Src/XFMemLoader.cpp88
1 files changed, 88 insertions, 0 deletions
diff --git a/Source/Core/VideoBackends/Software/Src/XFMemLoader.cpp b/Source/Core/VideoBackends/Software/Src/XFMemLoader.cpp
new file mode 100644
index 0000000000..4580bafad8
--- /dev/null
+++ b/Source/Core/VideoBackends/Software/Src/XFMemLoader.cpp
@@ -0,0 +1,88 @@
+// Copyright 2013 Dolphin Emulator Project
+// Licensed under GPLv2
+// Refer to the license.txt file included.
+
+#include "VideoCommon.h"
+
+#include "XFMemLoader.h"
+#include "CPMemLoader.h"
+#include "Clipper.h"
+#include "HW/Memmap.h"
+
+XFRegisters swxfregs;
+
+void InitXFMemory()
+{
+ memset(&swxfregs, 0, sizeof(swxfregs));
+}
+
+void XFWritten(u32 transferSize, u32 baseAddress)
+{
+ u32 topAddress = baseAddress + transferSize;
+
+ if (baseAddress <= 0x1026 && topAddress >= 0x1020)
+ Clipper::SetViewOffset();
+
+ // fix lights so invalid values don't trash the lighting computations
+ if (baseAddress <= 0x067f && topAddress >= 0x0604)
+ {
+ u32* x = swxfregs.lights;
+
+ // go through all lights
+ for (int light = 0; light < 8; light++)
+ {
+ // skip to floating point values
+ x += 4;
+
+ for (int i = 0; i < 12; i++)
+ {
+ u32 xVal = *x;
+
+ // if the exponent is 255 then the number is inf or nan
+ if ((xVal & 0x7f800000) == 0x7f800000)
+ *x = 0;
+
+ x++;
+ }
+ }
+ }
+}
+
+void SWLoadXFReg(u32 transferSize, u32 baseAddress, u32 *pData)
+{
+ u32 size = transferSize;
+
+ // do not allow writes past registers
+ if (baseAddress + transferSize > 0x1058)
+ {
+ INFO_LOG(VIDEO, "xf load exceeds address space: %x %d bytes\n", baseAddress, transferSize);
+
+ if (baseAddress >= 0x1058)
+ size = 0;
+ else
+ size = 0x1058 - baseAddress;
+ }
+
+ if (size > 0)
+ {
+ memcpy_gc( &((u32*)&swxfregs)[baseAddress], pData, size * 4);
+ XFWritten(transferSize, baseAddress);
+ }
+}
+
+void SWLoadIndexedXF(u32 val, int array)
+{
+ int index = val >> 16;
+ int address = val & 0xFFF; //check mask
+ int size = ((val >> 12) & 0xF) + 1;
+ //load stuff from array to address in xf mem
+
+ u32 *pData = (u32*)Memory::GetPointer(arraybases[array] + arraystrides[array]*index);
+
+ // byteswap data
+ u32 buffer[16];
+ for (int i = 0; i < size; ++i)
+ buffer[i] = Common::swap32(*(pData + i));
+
+ SWLoadXFReg(size, address, buffer);
+}