diff --git a/GPU/Directx9/FramebufferDX9.cpp b/GPU/Directx9/FramebufferDX9.cpp index cfeb7dff2f..c576b2749a 100644 --- a/GPU/Directx9/FramebufferDX9.cpp +++ b/GPU/Directx9/FramebufferDX9.cpp @@ -1106,8 +1106,8 @@ namespace DX9 { hr = offscreen->LockRect(&locked, &rect, D3DLOCK_READONLY); if (SUCCEEDED(hr)) { // TODO: Handle the other formats? We don't currently create them, I think. - buffer.Allocate(locked.Pitch / 4, vfb->renderHeight, GPU_DBG_FORMAT_8888_BGRA, false); - memcpy(buffer.GetData(), locked.pBits, locked.Pitch * vfb->renderHeight); + buffer.Allocate(locked.Pitch / 4, desc.Height, GPU_DBG_FORMAT_8888_BGRA, false); + memcpy(buffer.GetData(), locked.pBits, locked.Pitch * desc.Height); offscreen->UnlockRect(); success = true; } diff --git a/GPU/Directx9/GPU_DX9.cpp b/GPU/Directx9/GPU_DX9.cpp index ad97e2566d..5697cf2121 100644 --- a/GPU/Directx9/GPU_DX9.cpp +++ b/GPU/Directx9/GPU_DX9.cpp @@ -1584,6 +1584,7 @@ bool DIRECTX9_GPU::GetCurrentTexture(GPUDebugBuffer &buffer, int level) { LPDIRECT3DBASETEXTURE9 baseTex; LPDIRECT3DTEXTURE9 tex; + LPDIRECT3DSURFACE9 offscreen = nullptr; HRESULT hr; bool success; @@ -1596,6 +1597,22 @@ bool DIRECTX9_GPU::GetCurrentTexture(GPUDebugBuffer &buffer, int level) { tex->GetLevelDesc(level, &desc); RECT rect = {0, 0, desc.Width, desc.Height}; hr = tex->LockRect(level, &locked, &rect, D3DLOCK_READONLY); + + // If it fails, this means it's a render-to-texture, so we have to get creative. + if (FAILED(hr)) { + LPDIRECT3DSURFACE9 renderTarget; + hr = tex->GetSurfaceLevel(level, &renderTarget); + if (SUCCEEDED(hr)) { + hr = pD3Ddevice->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format, D3DPOOL_SYSTEMMEM, &offscreen, NULL); + if (SUCCEEDED(hr)) { + hr = pD3Ddevice->GetRenderTargetData(renderTarget, offscreen); + if (SUCCEEDED(hr)) { + hr = offscreen->LockRect(&locked, &rect, D3DLOCK_READONLY); + } + } + } + } + if (SUCCEEDED(hr)) { GPUDebugBufferFormat fmt; int pixelSize; @@ -1628,7 +1645,12 @@ bool DIRECTX9_GPU::GetCurrentTexture(GPUDebugBuffer &buffer, int level) { } else { success = false; } - tex->UnlockRect(level); + if (offscreen) { + offscreen->UnlockRect(); + offscreen->Release(); + } else { + tex->UnlockRect(level); + } } tex->Release(); }