From ca78dd4e6d507c1866157b11abef075fd3eb1f5b Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 22 Jun 2013 08:36:31 -0700 Subject: [PATCH 1/2] Eat cycles in sceMpegRingbufferAvailableSize(). Some games call this in a loop, so it affects perf. And, this eats quite a few cycles, implying it does a lot more work than I thought it did. --- Core/HLE/sceMpeg.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp index 305b535df2..1464082f95 100644 --- a/Core/HLE/sceMpeg.cpp +++ b/Core/HLE/sceMpeg.cpp @@ -873,6 +873,7 @@ int sceMpegRingbufferAvailableSize(u32 ringbufferAddr) DEBUG_LOG(HLE, "%i=sceMpegRingbufferAvailableSize(%08x)", ringbuffer.packetsFree, ringbufferAddr); MpegContext *ctx = getMpegCtx(ringbuffer.mpeg); int result = std::min(ringbuffer.packetsFree, ctx->mediaengine->getRemainSize() / 2048); + hleEatCycles(2020); return ringbuffer.packetsFree; } From 0b4e93a67190c8f4da5bb7c952eb101679336fa6 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 22 Jun 2013 08:39:25 -0700 Subject: [PATCH 2/2] Clean up sceMpegRingbufferAvailableSize(). Avoid a memory copy, some crash checks. --- Core/HLE/sceMpeg.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp index 1464082f95..6d2dd246a0 100644 --- a/Core/HLE/sceMpeg.cpp +++ b/Core/HLE/sceMpeg.cpp @@ -863,18 +863,23 @@ int sceMpegQueryAtracEsSize(u32 mpeg, u32 esSizeAddr, u32 outSizeAddr) int sceMpegRingbufferAvailableSize(u32 ringbufferAddr) { - if (!Memory::IsValidAddress(ringbufferAddr)) { + PSPPointer ringbuffer; + ringbuffer = ringbufferAddr; + + if (!ringbuffer.Valid()) { ERROR_LOG(HLE, "sceMpegRingbufferAvailableSize(%08x) - bad address", ringbufferAddr); return -1; } - SceMpegRingBuffer ringbuffer; - Memory::ReadStruct(ringbufferAddr, &ringbuffer); - DEBUG_LOG(HLE, "%i=sceMpegRingbufferAvailableSize(%08x)", ringbuffer.packetsFree, ringbufferAddr); - MpegContext *ctx = getMpegCtx(ringbuffer.mpeg); - int result = std::min(ringbuffer.packetsFree, ctx->mediaengine->getRemainSize() / 2048); + MpegContext *ctx = getMpegCtx(ringbuffer->mpeg); + if (!ctx) { + ERROR_LOG(HLE, "sceMpegRingbufferAvailableSize(%08x) - bad mpeg", ringbufferAddr); + return -1; + } + hleEatCycles(2020); - return ringbuffer.packetsFree; + DEBUG_LOG(HLE, "%i=sceMpegRingbufferAvailableSize(%08x)", ringbuffer->packetsFree, ringbufferAddr); + return ringbuffer->packetsFree; } void PostPutAction::run(MipsCall &call) {