mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Restore optimization of memory info strings, avoiding allocations
This commit is contained in:
parent
7f7af003ce
commit
6560123257
1 changed files with 19 additions and 18 deletions
|
@ -3075,6 +3075,9 @@ void GPUCommon::DoBlockTransfer(u32 skipDrawReason) {
|
|||
bool srcWraps = Memory::IsVRAMAddress(srcBasePtr) && !srcValid;
|
||||
bool dstWraps = Memory::IsVRAMAddress(dstBasePtr) && !dstValid;
|
||||
|
||||
char tag[128];
|
||||
size_t tagSize;
|
||||
|
||||
// Tell the framebuffer manager to take action if possible. If it does the entire thing, let's just return.
|
||||
if (!framebufferManager_ || !framebufferManager_->NotifyBlockTransferBefore(dstBasePtr, dstStride, dstX, dstY, srcBasePtr, srcStride, srcX, srcY, width, height, bpp, skipDrawReason)) {
|
||||
// Do the copy! (Hm, if we detect a drawn video frame (see below) then we could maybe skip this?)
|
||||
|
@ -3100,11 +3103,10 @@ void GPUCommon::DoBlockTransfer(u32 skipDrawReason) {
|
|||
// This path means we have either src/dst overlap, OR one or both of src and dst wrap.
|
||||
// This should be uncommon so it's the slowest path.
|
||||
u32 bytesToCopy = width * bpp;
|
||||
static std::string tag;
|
||||
bool notifyDetail = MemBlockInfoDetailed(srcWraps || dstWraps ? 64 : bytesToCopy);
|
||||
bool notifyAll = !notifyDetail && MemBlockInfoDetailed(srcSize, dstSize);
|
||||
if (notifyDetail || notifyAll) {
|
||||
tag = GetMemWriteTagAt("GPUBlockTransfer/", src, srcSize);
|
||||
tagSize = FormatMemWriteTagAt(tag, sizeof(tag), "GPUBlockTransfer/", src, srcSize);
|
||||
}
|
||||
|
||||
auto notifyingMemmove = [&](u32 d, u32 s, u32 sz) {
|
||||
|
@ -3113,8 +3115,8 @@ void GPUCommon::DoBlockTransfer(u32 skipDrawReason) {
|
|||
memmove(dstp, srcp, sz);
|
||||
|
||||
if (notifyDetail) {
|
||||
NotifyMemInfo(MemBlockFlags::READ, s, sz, tag.c_str(), tag.size());
|
||||
NotifyMemInfo(MemBlockFlags::WRITE, d, sz, tag.c_str(), tag.size());
|
||||
NotifyMemInfo(MemBlockFlags::READ, s, sz, tag, tagSize);
|
||||
NotifyMemInfo(MemBlockFlags::WRITE, d, sz, tag, tagSize);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -3140,8 +3142,8 @@ void GPUCommon::DoBlockTransfer(u32 skipDrawReason) {
|
|||
|
||||
// If we're tracking detail, it's useful to have the gaps illustrated properly.
|
||||
if (notifyDetail) {
|
||||
NotifyMemInfo(MemBlockFlags::READ, srcLineStartAddr, bytesToCopy, tag.c_str(), tag.size());
|
||||
NotifyMemInfo(MemBlockFlags::WRITE, dstLineStartAddr, bytesToCopy, tag.c_str(), tag.size());
|
||||
NotifyMemInfo(MemBlockFlags::READ, srcLineStartAddr, bytesToCopy, tag, tagSize);
|
||||
NotifyMemInfo(MemBlockFlags::WRITE, dstLineStartAddr, bytesToCopy, tag, tagSize);
|
||||
}
|
||||
} else {
|
||||
// We can wrap at any point, so along with overlap this gets a bit complicated.
|
||||
|
@ -3187,26 +3189,25 @@ void GPUCommon::DoBlockTransfer(u32 skipDrawReason) {
|
|||
if (notifyAll) {
|
||||
if (srcWraps) {
|
||||
u32 validSize = Memory::ValidSize(src, srcSize);
|
||||
NotifyMemInfo(MemBlockFlags::READ, src, validSize, tag.c_str(), tag.size());
|
||||
NotifyMemInfo(MemBlockFlags::READ, PSP_GetVidMemBase(), srcSize - validSize, tag.c_str(), tag.size());
|
||||
NotifyMemInfo(MemBlockFlags::READ, src, validSize, tag, tagSize);
|
||||
NotifyMemInfo(MemBlockFlags::READ, PSP_GetVidMemBase(), srcSize - validSize, tag, tagSize);
|
||||
} else {
|
||||
NotifyMemInfo(MemBlockFlags::READ, src, srcSize, tag.c_str(), tag.size());
|
||||
NotifyMemInfo(MemBlockFlags::READ, src, srcSize, tag, tagSize);
|
||||
}
|
||||
if (dstWraps) {
|
||||
u32 validSize = Memory::ValidSize(dst, dstSize);
|
||||
NotifyMemInfo(MemBlockFlags::WRITE, dst, validSize, tag.c_str(), tag.size());
|
||||
NotifyMemInfo(MemBlockFlags::WRITE, PSP_GetVidMemBase(), dstSize - validSize, tag.c_str(), tag.size());
|
||||
NotifyMemInfo(MemBlockFlags::WRITE, dst, validSize, tag, tagSize);
|
||||
NotifyMemInfo(MemBlockFlags::WRITE, PSP_GetVidMemBase(), dstSize - validSize, tag, tagSize);
|
||||
} else {
|
||||
NotifyMemInfo(MemBlockFlags::WRITE, dst, dstSize, tag.c_str(), tag.size());
|
||||
NotifyMemInfo(MemBlockFlags::WRITE, dst, dstSize, tag, tagSize);
|
||||
}
|
||||
}
|
||||
} else if (srcValid && dstValid) {
|
||||
u32 bytesToCopy = width * bpp;
|
||||
static std::string tag;
|
||||
bool notifyDetail = MemBlockInfoDetailed(bytesToCopy);
|
||||
bool notifyAll = !notifyDetail && MemBlockInfoDetailed(srcSize, dstSize);
|
||||
if (notifyDetail || notifyAll) {
|
||||
tag = GetMemWriteTagAt("GPUBlockTransfer/", src, srcSize);
|
||||
tagSize = FormatMemWriteTagAt(tag, sizeof(tag), "GPUBlockTransfer/", src, srcSize);
|
||||
}
|
||||
|
||||
for (int y = 0; y < height; y++) {
|
||||
|
@ -3219,14 +3220,14 @@ void GPUCommon::DoBlockTransfer(u32 skipDrawReason) {
|
|||
|
||||
// If we're tracking detail, it's useful to have the gaps illustrated properly.
|
||||
if (notifyDetail) {
|
||||
NotifyMemInfo(MemBlockFlags::READ, srcLineStartAddr, bytesToCopy, tag.c_str(), tag.size());
|
||||
NotifyMemInfo(MemBlockFlags::WRITE, dstLineStartAddr, bytesToCopy, tag.c_str(), tag.size());
|
||||
NotifyMemInfo(MemBlockFlags::READ, srcLineStartAddr, bytesToCopy, tag, tagSize);
|
||||
NotifyMemInfo(MemBlockFlags::WRITE, dstLineStartAddr, bytesToCopy, tag, tagSize);
|
||||
}
|
||||
}
|
||||
|
||||
if (notifyAll) {
|
||||
NotifyMemInfo(MemBlockFlags::READ, src, srcSize, tag.c_str(), tag.size());
|
||||
NotifyMemInfo(MemBlockFlags::WRITE, dst, dstSize, tag.c_str(), tag.size());
|
||||
NotifyMemInfo(MemBlockFlags::READ, src, srcSize, tag, tagSize);
|
||||
NotifyMemInfo(MemBlockFlags::WRITE, dst, dstSize, tag, tagSize);
|
||||
}
|
||||
} else {
|
||||
// This seems to cause the GE to require a break/reset on a PSP.
|
||||
|
|
Loading…
Add table
Reference in a new issue