From 9d23939e282fa96fcce06c807d0481456dcfeed1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 3 Aug 2022 15:49:17 +0200 Subject: [PATCH] Replace D3D11's BlitFramebuffer with the common one --- GPU/Common/FramebufferManagerCommon.cpp | 8 ++++- GPU/D3D11/FramebufferManagerD3D11.cpp | 46 ------------------------- GPU/D3D11/FramebufferManagerD3D11.h | 4 --- 3 files changed, 7 insertions(+), 51 deletions(-) diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 52c328b90d..812fd33696 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -2623,7 +2623,13 @@ void FramebufferManagerCommon::BlitFramebuffer(VirtualFramebuffer *dst, int dstX if (useBlit) { draw_->BlitFramebuffer(src->fbo, srcX1, srcY1, srcX2, srcY2, dst->fbo, dstX1, dstY1, dstX2, dstY2, Draw::FB_COLOR_BIT, Draw::FB_BLIT_NEAREST, tag); } else { - BlitUsingRaster(src->fbo, srcX1, srcY1, srcX2, srcY2, dst->fbo, dstX1, dstY1, dstX2, dstY2, false); + Draw::Framebuffer *srcFBO = src->fbo; + if (src == dst) { + Draw::Framebuffer *tempFBO = GetTempFBO(TempFBO::BLIT, src->renderWidth, src->renderHeight); + BlitUsingRaster(src->fbo, srcX1, srcY1, srcX2, srcY2, tempFBO, dstX1, dstY1, dstX2, dstY2, false); + srcFBO = tempFBO; + } + BlitUsingRaster(srcFBO, srcX1, srcY1, srcX2, srcY2, dst->fbo, dstX1, dstY1, dstX2, dstY2, false); } gstate_c.Dirty(DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_BLEND_STATE | DIRTY_RASTER_STATE); diff --git a/GPU/D3D11/FramebufferManagerD3D11.cpp b/GPU/D3D11/FramebufferManagerD3D11.cpp index 72622d3ee6..a53aea9540 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.cpp +++ b/GPU/D3D11/FramebufferManagerD3D11.cpp @@ -198,52 +198,6 @@ static void CopyPixelDepthOnly(u32 *dstp, const u32 *srcp, size_t c) { } } -void FramebufferManagerD3D11::BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp, const char *tag) { - if (!dst->fbo || !src->fbo || !useBufferedRendering_) { - // This can happen if they recently switched from non-buffered. - if (useBufferedRendering_) { - draw_->BindFramebufferAsRenderTarget(nullptr, { Draw::RPAction::KEEP, Draw::RPAction::KEEP, Draw::RPAction::KEEP }, "BlitFramebuffer_Fail"); - } - return; - } - - float srcXFactor = src->renderScaleFactor; - float srcYFactor = src->renderScaleFactor; - const int srcBpp = src->format == GE_FORMAT_8888 ? 4 : 2; - if (srcBpp != bpp && bpp != 0) { - srcXFactor = (srcXFactor * bpp) / srcBpp; - } - int srcX1 = srcX * srcXFactor; - int srcX2 = (srcX + w) * srcXFactor; - int srcY1 = srcY * srcYFactor; - int srcY2 = (srcY + h) * srcYFactor; - - float dstXFactor = dst->renderScaleFactor; - float dstYFactor = dst->renderScaleFactor; - const int dstBpp = dst->format == GE_FORMAT_8888 ? 4 : 2; - if (dstBpp != bpp && bpp != 0) { - dstXFactor = (dstXFactor * bpp) / dstBpp; - } - int dstX1 = dstX * dstXFactor; - int dstX2 = (dstX + w) * dstXFactor; - int dstY1 = dstY * dstYFactor; - int dstY2 = (dstY + h) * dstYFactor; - - // Direct3D doesn't support rect -> self. - Draw::Framebuffer *srcFBO = src->fbo; - if (src == dst) { - Draw::Framebuffer *tempFBO = GetTempFBO(TempFBO::BLIT, src->renderWidth, src->renderHeight); - SimpleBlit(tempFBO, dstX1, dstY1, dstX2, dstY2, src->fbo, srcX1, srcY1, srcX2, srcY2, false); - srcFBO = tempFBO; - } - SimpleBlit( - dst->fbo, dstX1, dstY1, dstX2, dstY2, - srcFBO, srcX1, srcY1, srcX2, srcY2, - false); - - draw_->BindTexture(0, nullptr); -} - // Nobody calls this yet. void FramebufferManagerD3D11::PackDepthbuffer(VirtualFramebuffer *vfb, int x, int y, int w, int h) { if (!vfb->fbo) { diff --git a/GPU/D3D11/FramebufferManagerD3D11.h b/GPU/D3D11/FramebufferManagerD3D11.h index 2d37fb26e9..cc4a67bbd1 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.h +++ b/GPU/D3D11/FramebufferManagerD3D11.h @@ -47,10 +47,6 @@ public: return quadBuffer_; } -protected: - // Used by ReadFramebufferToMemory and later framebuffer block copies - void BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp, const char *tag) override; - private: void Bind2DShader() override; void PackDepthbuffer(VirtualFramebuffer *vfb, int x, int y, int w, int h);