diff options
| author | Jasper St. Pierre <jstpierre@mecheye.net> | 2013-09-10 23:12:54 -0400 |
|---|---|---|
| committer | Jasper St. Pierre <jstpierre@mecheye.net> | 2013-10-07 10:37:01 -0400 |
| commit | a7c72081039ca1c6bee6b18db44fe4e9ffaf4fb5 (patch) | |
| tree | 70e3c53d290bf5f0e76a2f3295b4ff01e07e2127 /Source/Core/VideoBackends/Software/Src/XFMemLoader.cpp | |
| parent | d6f0ecebb4742f6b41397420f7d58ab7a05a03cc (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.cpp | 88 |
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); +} |
