mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-30 19:24:23 +01:00
d3d: Improve GE debugger with render-to-tex.
Also fix a crash in oddly sized framebuffers.
This commit is contained in:
1 parent
e3d0703bbb
commit
d59aa06a3b
2 files changed
+25
-3
No files matched your search
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user