diff --git a/GPU/Common/FramebufferCommon.cpp b/GPU/Common/FramebufferCommon.cpp index a5a7d81fc3..1d9cfc87cc 100644 --- a/GPU/Common/FramebufferCommon.cpp +++ b/GPU/Common/FramebufferCommon.cpp @@ -387,3 +387,39 @@ void FramebufferManagerCommon::DoSetRenderFrameBuffer() { gstate_c.curRTRenderWidth = vfb->renderWidth; gstate_c.curRTRenderHeight = vfb->renderHeight; } + +void FramebufferManagerCommon::UpdateFromMemory(u32 addr, int size, bool safe) { + addr &= ~0x40000000; + // TODO: Could go through all FBOs, but probably not important? + // TODO: Could also check for inner changes, but video is most important. + bool isDisplayBuf = addr == DisplayFramebufAddr() || addr == PrevDisplayFramebufAddr(); + if (isDisplayBuf || safe) { + // TODO: Deleting the FBO is a heavy hammer solution, so let's only do it if it'd help. + if (!Memory::IsValidAddress(displayFramebufPtr_)) + return; + + for (size_t i = 0; i < vfbs_.size(); ++i) { + VirtualFramebuffer *vfb = vfbs_[i]; + if (MaskedEqual(vfb->fb_address, addr)) { + FlushBeforeCopy(); + + if (useBufferedRendering_ && vfb->fbo) { + DisableState(); + GEBufferFormat fmt = vfb->format; + if (vfb->last_frame_render + 1 < gpuStats.numFlips && isDisplayBuf) { + // If we're not rendering to it, format may be wrong. Use displayFormat_ instead. + fmt = displayFormat_; + } + DrawPixels(vfb, 0, 0, Memory::GetPointer(addr | 0x04000000), fmt, vfb->fb_stride, vfb->width, vfb->height); + SetColorUpdated(vfb); + } else { + INFO_LOG(SCEGE, "Invalidating FBO for %08x (%i x %i x %i)", vfb->fb_address, vfb->width, vfb->height, vfb->format); + DestroyFramebuf(vfb); + vfbs_.erase(vfbs_.begin() + i--); + } + } + } + + RebindFramebuffer(); + } +} diff --git a/GPU/Common/FramebufferCommon.h b/GPU/Common/FramebufferCommon.h index a494d7450d..2d7b6ed24b 100644 --- a/GPU/Common/FramebufferCommon.h +++ b/GPU/Common/FramebufferCommon.h @@ -94,9 +94,7 @@ public: virtual ~FramebufferManagerCommon(); void BeginFrame(); - - virtual bool NotifyFramebufferCopy(u32 src, u32 dest, int size, bool isMemset = false) = 0; - virtual bool NotifyStencilUpload(u32 addr, int size, bool skipZero = false) = 0; + void SetDisplayFramebuffer(u32 framebuf, u32 stride, GEBufferFormat format); void DoSetRenderFrameBuffer(); void SetRenderFrameBuffer() { @@ -112,9 +110,15 @@ public: } virtual void RebindFramebuffer() = 0; - size_t NumVFBs() const { return vfbs_.size(); } + void UpdateFromMemory(u32 addr, int size, bool safe); + virtual bool NotifyFramebufferCopy(u32 src, u32 dest, int size, bool isMemset = false) = 0; + virtual bool NotifyStencilUpload(u32 addr, int size, bool skipZero = false) = 0; - void SetDisplayFramebuffer(u32 framebuf, u32 stride, GEBufferFormat format); + virtual void MakePixelTexture(const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, int width, int height) = 0; + virtual void DrawPixels(VirtualFramebuffer *vfb, int dstX, int dstY, const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, int width, int height) = 0; + virtual void DrawFramebuffer(const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, bool applyPostShader) = 0; + + size_t NumVFBs() const { return vfbs_.size(); } u32 PrevDisplayFramebufAddr() { return prevDisplayFramebuf_ ? (0x04000000 | prevDisplayFramebuf_->fb_address) : 0; @@ -123,17 +127,6 @@ public: return displayFramebuf_ ? (0x04000000 | displayFramebuf_->fb_address) : 0; } - void SetDepthUpdated() { - if (currentRenderVfb_) { - currentRenderVfb_->depthUpdated = true; - } - } - void SetColorUpdated() { - if (currentRenderVfb_) { - SetColorUpdated(currentRenderVfb_); - } - } - bool MayIntersectFramebuffer(u32 start) { // Clear the cache/kernel bits. start = start & 0x3FFFFFFF; @@ -159,6 +152,17 @@ public: int GetTargetStride() const { return currentRenderVfb_ ? currentRenderVfb_->fb_stride : 512; } GEBufferFormat GetTargetFormat() const { return currentRenderVfb_ ? currentRenderVfb_->format : displayFormat_; } + void SetDepthUpdated() { + if (currentRenderVfb_) { + currentRenderVfb_->depthUpdated = true; + } + } + void SetColorUpdated() { + if (currentRenderVfb_) { + SetColorUpdated(currentRenderVfb_); + } + } + protected: virtual void DisableState() = 0; virtual void ClearBuffer() = 0; diff --git a/GPU/Directx9/FramebufferDX9.cpp b/GPU/Directx9/FramebufferDX9.cpp index f230016048..f9b904d643 100644 --- a/GPU/Directx9/FramebufferDX9.cpp +++ b/GPU/Directx9/FramebufferDX9.cpp @@ -983,42 +983,6 @@ namespace DX9 { vfbs_.clear(); } - void FramebufferManagerDX9::UpdateFromMemory(u32 addr, int size, bool safe) { - addr &= ~0x40000000; - // TODO: Could go through all FBOs, but probably not important? - // TODO: Could also check for inner changes, but video is most important. - bool isDisplayBuf = addr == DisplayFramebufAddr() || addr == PrevDisplayFramebufAddr(); - if (isDisplayBuf || safe) { - // TODO: Deleting the FBO is a heavy hammer solution, so let's only do it if it'd help. - if (!Memory::IsValidAddress(displayFramebufPtr_)) - return; - - for (size_t i = 0; i < vfbs_.size(); ++i) { - VirtualFramebuffer *vfb = vfbs_[i]; - if (MaskedEqual(vfb->fb_address, addr)) { - FlushBeforeCopy(); - - if (useBufferedRendering_ && vfb->fbo) { - DisableState(); - GEBufferFormat fmt = vfb->format; - if (vfb->last_frame_render + 1 < gpuStats.numFlips && isDisplayBuf) { - // If we're not rendering to it, format may be wrong. Use displayFormat_ instead. - fmt = displayFormat_; - } - DrawPixels(vfb, 0, 0, Memory::GetPointer(addr | 0x04000000), fmt, vfb->fb_stride, vfb->width, vfb->height); - SetColorUpdated(vfb); - } else { - INFO_LOG(SCEGE, "Invalidating FBO for %08x (%i x %i x %i)", vfb->fb_address, vfb->width, vfb->height, vfb->format); - DestroyFramebuf(vfb); - vfbs_.erase(vfbs_.begin() + i--); - } - } - } - - RebindFramebuffer(); - } - } - void FramebufferManagerDX9::FlushBeforeCopy() { // Flush anything not yet drawn before blitting, downloading, or uploading. // This might be a stalled list, or unflushed before a block transfer, etc. diff --git a/GPU/Directx9/FramebufferDX9.h b/GPU/Directx9/FramebufferDX9.h index 0991871006..de56082a2b 100644 --- a/GPU/Directx9/FramebufferDX9.h +++ b/GPU/Directx9/FramebufferDX9.h @@ -57,10 +57,9 @@ public: transformDraw_ = td; } - void MakePixelTexture(const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, int width, int height); - - void DrawPixels(VirtualFramebuffer *vfb, int dstX, int dstY, const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, int width, int height); - void DrawFramebuffer(const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, bool applyPostShader); + virtual void MakePixelTexture(const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, int width, int height) override; + virtual void DrawPixels(VirtualFramebuffer *vfb, int dstX, int dstY, const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, int width, int height) override; + virtual void DrawFramebuffer(const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, bool applyPostShader) override; void DrawActiveTexture(LPDIRECT3DTEXTURE9 texture, float x, float y, float w, float h, float destW, float destH, bool flip = false, float u0 = 0.0f, float v0 = 0.0f, float u1 = 1.0f, float v1 = 1.0f); @@ -70,7 +69,6 @@ public: void Resized(); void DeviceLost(); void CopyDisplayToOutput(); - void UpdateFromMemory(u32 addr, int size, bool safe); void ReadFramebufferToMemory(VirtualFramebuffer *vfb, bool sync = true); diff --git a/GPU/GLES/Framebuffer.cpp b/GPU/GLES/Framebuffer.cpp index 8b247bf456..a0b24ff213 100644 --- a/GPU/GLES/Framebuffer.cpp +++ b/GPU/GLES/Framebuffer.cpp @@ -1803,42 +1803,6 @@ void FramebufferManager::DestroyAllFBOs() { DisableState(); } -void FramebufferManager::UpdateFromMemory(u32 addr, int size, bool safe) { - addr &= ~0x40000000; - // TODO: Could go through all FBOs, but probably not important? - // TODO: Could also check for inner changes, but video is most important. - bool isDisplayBuf = addr == DisplayFramebufAddr() || addr == PrevDisplayFramebufAddr(); - if (isDisplayBuf || safe) { - // TODO: Deleting the FBO is a heavy hammer solution, so let's only do it if it'd help. - if (!Memory::IsValidAddress(displayFramebufPtr_)) - return; - - for (size_t i = 0; i < vfbs_.size(); ++i) { - VirtualFramebuffer *vfb = vfbs_[i]; - if (MaskedEqual(vfb->fb_address, addr)) { - FlushBeforeCopy(); - - if (useBufferedRendering_ && vfb->fbo) { - DisableState(); - GEBufferFormat fmt = vfb->format; - if (vfb->last_frame_render + 1 < gpuStats.numFlips && isDisplayBuf) { - // If we're not rendering to it, format may be wrong. Use displayFormat_ instead. - fmt = displayFormat_; - } - DrawPixels(vfb, 0, 0, Memory::GetPointer(addr | 0x04000000), fmt, vfb->fb_stride, vfb->width, vfb->height); - SetColorUpdated(vfb); - } else { - INFO_LOG(SCEGE, "Invalidating FBO for %08x (%i x %i x %i)", vfb->fb_address, vfb->width, vfb->height, vfb->format); - DestroyFramebuf(vfb); - vfbs_.erase(vfbs_.begin() + i--); - } - } - } - - RebindFramebuffer(); - } -} - bool FramebufferManager::NotifyFramebufferCopy(u32 src, u32 dst, int size, bool isMemset) { if (updateVRAM_ || size == 0) { return false; diff --git a/GPU/GLES/Framebuffer.h b/GPU/GLES/Framebuffer.h index 16bba3c6db..23900d08df 100644 --- a/GPU/GLES/Framebuffer.h +++ b/GPU/GLES/Framebuffer.h @@ -71,10 +71,9 @@ public: transformDraw_ = td; } - void MakePixelTexture(const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, int width, int height); - - void DrawPixels(VirtualFramebuffer *vfb, int dstX, int dstY, const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, int width, int height); - void DrawFramebuffer(const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, bool applyPostShader); + virtual void MakePixelTexture(const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, int width, int height) override; + virtual void DrawPixels(VirtualFramebuffer *vfb, int dstX, int dstY, const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, int width, int height) override; + virtual void DrawFramebuffer(const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, bool applyPostShader) override; // If texture != 0, will bind it. // x,y,w,h are relative to destW, destH which fill out the target completely. @@ -89,7 +88,6 @@ public: void Resized(); void DeviceLost(); void CopyDisplayToOutput(); - void UpdateFromMemory(u32 addr, int size, bool safe); void SetLineWidth(); void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old);