diff --git a/GPU/GLES/Framebuffer.cpp b/GPU/GLES/Framebuffer.cpp index 01290f53e6..8d7e93e503 100644 --- a/GPU/GLES/Framebuffer.cpp +++ b/GPU/GLES/Framebuffer.cpp @@ -1603,6 +1603,36 @@ void FramebufferManager::UpdateFromMemory(u32 addr, int size, bool safe) { } } +void FramebufferManager::NotifyBlockTransfer(u32 dst, u32 src) { +#ifndef USING_GLES2 + if (!reportedBlits_.insert(std::make_pair(dst, src)).second) { + // Already reported/checked. + return; + } + + bool dstBuffer = false; + bool srcBuffer = false; + + for (size_t i = 0; i < vfbs_.size(); ++i) { + VirtualFramebuffer *vfb = vfbs_[i]; + if (MaskedEqual(vfb->fb_address, dst)) { + dstBuffer = true; + } + if (MaskedEqual(vfb->fb_address, src)) { + srcBuffer = true; + } + } + + if (dstBuffer && srcBuffer) { + WARN_LOG_REPORT(G3D, "Intra buffer block transfer (not supported) %08x -> %08x", src, dst); + } else if (dstBuffer) { + WARN_LOG_REPORT(G3D, "Block transfer upload (not supported) %08x -> %08x", src, dst); + } else if (srcBuffer && g_Config.iRenderingMode == FB_BUFFERED_MODE) { + WARN_LOG_REPORT(G3D, "Block transfer download (not supported) %08x -> %08x", src, dst); + } +#endif +} + void FramebufferManager::Resized() { resized_ = true; } diff --git a/GPU/GLES/Framebuffer.h b/GPU/GLES/Framebuffer.h index 0cbc2a093a..0a18b5d227 100644 --- a/GPU/GLES/Framebuffer.h +++ b/GPU/GLES/Framebuffer.h @@ -138,6 +138,9 @@ public: void UpdateFromMemory(u32 addr, int size, bool safe); void SetLineWidth(); + // Just for logging right now. Might remove/change. + void NotifyBlockTransfer(u32 dst, u32 src); + #ifdef USING_GLES2 void ReadFramebufferToMemory(VirtualFramebuffer *vfb, bool sync = true); #else @@ -230,4 +233,6 @@ private: AsyncPBO *pixelBufObj_; //this isn't that large u8 currentPBO_; #endif + + std::set> reportedBlits_; }; diff --git a/GPU/GLES/GLES_GPU.cpp b/GPU/GLES/GLES_GPU.cpp index a9e918ca58..1bd87cf69e 100644 --- a/GPU/GLES/GLES_GPU.cpp +++ b/GPU/GLES/GLES_GPU.cpp @@ -1571,6 +1571,7 @@ void GLES_GPU::DoBlockTransfer() { } // TODO: Notify all overlapping FBOs that they need to reload. + framebufferManager_.NotifyBlockTransfer(dstBasePtr, srcBasePtr); textureCache_.Invalidate(dstBasePtr + (dstY * dstStride + dstX) * bpp, height * dstStride * bpp, GPU_INVALIDATE_HINT); if (Memory::IsRAMAddress(srcBasePtr) && Memory::IsVRAMAddress(dstBasePtr)) {