summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/BPStructs.cpp
diff options
context:
space:
mode:
authorcomex <comexk@gmail.com>2014-10-23 14:42:37 -0400
committercomex <comexk@gmail.com>2014-10-23 14:42:37 -0400
commit1f5b1001ce507024143498b887401163af67654d (patch)
tree606e8eb2d578bc08747a12bb4f1f9597d448ec89 /Source/Core/VideoCommon/BPStructs.cpp
parent628e7cb0838c981b63b814748ac10768c4643eb1 (diff)
parent23832987b535b514a164cda789f1f6b4e4165a7f (diff)
Merge pull request #1342 from phire/lessGetPointer
Eliminate getPointers which are memcpyed or memset.
Diffstat (limited to 'Source/Core/VideoCommon/BPStructs.cpp')
-rw-r--r--Source/Core/VideoCommon/BPStructs.cpp17
1 files changed, 10 insertions, 7 deletions
diff --git a/Source/Core/VideoCommon/BPStructs.cpp b/Source/Core/VideoCommon/BPStructs.cpp
index 9488284978..cd3302beb3 100644
--- a/Source/Core/VideoCommon/BPStructs.cpp
+++ b/Source/Core/VideoCommon/BPStructs.cpp
@@ -270,16 +270,16 @@ static void BPWritten(const BPCmd& bp)
u32 tlutTMemAddr = (bp.newvalue & 0x3FF) << 9;
u32 tlutXferCount = (bp.newvalue & 0x1FFC00) >> 5;
- u8 *ptr = nullptr;
+ u32 addr = 0;
// TODO - figure out a cleaner way.
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii)
- ptr = Memory::GetPointer(bpmem.tmem_config.tlut_src << 5);
+ addr = bpmem.tmem_config.tlut_src << 5;
else
- ptr = Memory::GetPointer((bpmem.tmem_config.tlut_src & 0xFFFFF) << 5);
+ addr = (bpmem.tmem_config.tlut_src & 0xFFFFF) << 5;
- if (ptr)
- memcpy(texMem + tlutTMemAddr, ptr, tlutXferCount);
+ if (addr)
+ Memory::CopyFromEmu(texMem + tlutTMemAddr, addr, tlutXferCount);
else
PanicAlert("Invalid palette pointer %08x %08x %08x", bpmem.tmem_config.tlut_src, bpmem.tmem_config.tlut_src << 5, (bpmem.tmem_config.tlut_src & 0xFFFFF)<< 5);
@@ -453,7 +453,7 @@ static void BPWritten(const BPCmd& bp)
// NOTE: libogc's implementation of GX_PreloadEntireTexture seems flawed, so it's not necessarily a good reference for RE'ing this feature.
BPS_TmemConfig& tmem_cfg = bpmem.tmem_config;
- u8* src_ptr = Memory::GetPointer(tmem_cfg.preload_addr << 5); // TODO: Should we add mask here on GC?
+ u32 src_addr = tmem_cfg.preload_addr << 5; // TODO: Should we add mask here on GC?
u32 size = tmem_cfg.preload_tile_info.count * TMEM_LINE_SIZE;
u32 tmem_addr_even = tmem_cfg.preload_tmem_even * TMEM_LINE_SIZE;
@@ -462,10 +462,12 @@ static void BPWritten(const BPCmd& bp)
if (tmem_addr_even + size > TMEM_SIZE)
size = TMEM_SIZE - tmem_addr_even;
- memcpy(texMem + tmem_addr_even, src_ptr, size);
+ Memory::CopyFromEmu(texMem + tmem_addr_even, src_addr, size);
}
else // RGBA8 tiles (and CI14, but that might just be stupid libogc!)
{
+ u8* src_ptr = Memory::GetPointer(src_addr);
+
// AR and GB tiles are stored in separate TMEM banks => can't use a single memcpy for everything
u32 tmem_addr_odd = tmem_cfg.preload_tmem_odd * TMEM_LINE_SIZE;
@@ -475,6 +477,7 @@ static void BPWritten(const BPCmd& bp)
tmem_addr_odd + TMEM_LINE_SIZE > TMEM_SIZE)
return;
+ // TODO: This isn't very optimised, does a whole lot of small memcpys
memcpy(texMem + tmem_addr_even, src_ptr, TMEM_LINE_SIZE);
memcpy(texMem + tmem_addr_odd, src_ptr + TMEM_LINE_SIZE, TMEM_LINE_SIZE);
tmem_addr_even += TMEM_LINE_SIZE;