From ad3220f8572faca0d8756d65e6823f73d7d2a4c9 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 9 Oct 2022 01:08:04 -0700 Subject: [PATCH] GLES: Hook up depth download. Currently, only used by one hook. --- GPU/Common/FramebufferManagerCommon.cpp | 17 ++++++++++++++++- GPU/Common/FramebufferManagerCommon.h | 2 ++ GPU/Directx9/FramebufferManagerDX9.h | 2 +- GPU/GLES/FramebufferManagerGLES.h | 3 +-- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 308bd8bfeb..7fbb9a74fc 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -2619,7 +2619,11 @@ void FramebufferManagerCommon::PackFramebufferSync(VirtualFramebuffer *vfb, int DEBUG_LOG(G3D, "Reading framebuffer to mem, fb_address = %08x, ptr=%p", fb_address, destPtr); if (destPtr) { - draw_->CopyFramebufferToMemorySync(vfb->fbo, channel == RASTER_COLOR ? Draw::FB_COLOR_BIT : Draw::FB_DEPTH_BIT, x, y, w, h, destFormat, destPtr, vfb->fb_stride, "PackFramebufferSync"); + if (channel == RASTER_DEPTH) + PackDepthbuffer(vfb, x, y, w, h); + else + draw_->CopyFramebufferToMemorySync(vfb->fbo, channel == RASTER_COLOR ? Draw::FB_COLOR_BIT : Draw::FB_DEPTH_BIT, x, y, w, h, destFormat, destPtr, vfb->fb_stride, "PackFramebufferSync"); + char tag[128]; size_t len = snprintf(tag, sizeof(tag), "FramebufferPack/%08x_%08x_%dx%d_%s", vfb->fb_address, vfb->z_address, w, h, GeBufferFormatToString(vfb->fb_format)); NotifyMemInfo(MemBlockFlags::WRITE, fb_address + dstByteOffset, dstSize, tag, len); @@ -2630,6 +2634,17 @@ void FramebufferManagerCommon::PackFramebufferSync(VirtualFramebuffer *vfb, int gpuStats.numReadbacks++; } +void FramebufferManagerCommon::PackDepthbuffer(VirtualFramebuffer *vfb, int x, int y, int w, int h) { + _assert_msg_(vfb && vfb->z_address != 0 && vfb->z_stride != 0, "Depth buffer invalid"); + + Draw::DataFormat destFormat = GEFormatToThin3D(GE_FORMAT_DEPTH16); + const int dstByteOffset = (y * vfb->z_stride + x) * 2; + u8 *destPtr = Memory::GetPointerWriteUnchecked(vfb->z_address + dstByteOffset); + if (!draw_->CopyFramebufferToMemorySync(vfb->fbo, Draw::FB_DEPTH_BIT, x, y, w, h, destFormat, destPtr, vfb->fb_stride, "PackDepthbuffer")) { + WARN_LOG(G3D, "PackDepthbuffer failed"); + } +} + void FramebufferManagerCommon::ReadFramebufferToMemory(VirtualFramebuffer *vfb, int x, int y, int w, int h, RasterChannel channel) { // Clamp to bufferWidth. Sometimes block transfers can cause this to hit. if (x + w >= vfb->bufferWidth) { diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index b3bd21d7c9..e727c1a25a 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -442,6 +442,8 @@ public: protected: virtual void PackFramebufferSync(VirtualFramebuffer *vfb, int x, int y, int w, int h, RasterChannel channel); + // Used for when a shader is required, such as GLES. + virtual void PackDepthbuffer(VirtualFramebuffer *vfb, int x, int y, int w, int h); void SetViewport2D(int x, int y, int w, int h); Draw::Texture *MakePixelTexture(const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, int width, int height); void DrawActiveTexture(float x, float y, float w, float h, float destW, float destH, float u0, float v0, float u1, float v1, int uvRotation, int flags); diff --git a/GPU/Directx9/FramebufferManagerDX9.h b/GPU/Directx9/FramebufferManagerDX9.h index 0f4f7d7ce1..1d7e522b48 100644 --- a/GPU/Directx9/FramebufferManagerDX9.h +++ b/GPU/Directx9/FramebufferManagerDX9.h @@ -49,10 +49,10 @@ public: protected: void DecimateFBOs() override; + void PackDepthbuffer(VirtualFramebuffer *vfb, int x, int y, int w, int h) override; private: void PackFramebufferSync(VirtualFramebuffer *vfb, int x, int y, int w, int h, RasterChannel channel) override; - void PackDepthbuffer(VirtualFramebuffer *vfb, int x, int y, int w, int h); bool GetRenderTargetFramebuffer(LPDIRECT3DSURFACE9 renderTarget, LPDIRECT3DSURFACE9 offscreen, int w, int h, GPUDebugBuffer &buffer); LPDIRECT3DDEVICE9 device_; diff --git a/GPU/GLES/FramebufferManagerGLES.h b/GPU/GLES/FramebufferManagerGLES.h index eb5354b60e..e75de97308 100644 --- a/GPU/GLES/FramebufferManagerGLES.h +++ b/GPU/GLES/FramebufferManagerGLES.h @@ -38,10 +38,9 @@ public: protected: void UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) override; + void PackDepthbuffer(VirtualFramebuffer *vfb, int x, int y, int w, int h) override; private: - void PackDepthbuffer(VirtualFramebuffer *vfb, int x, int y, int w, int h); - u8 *convBuf_ = nullptr; u32 convBufSize_ = 0;