From 9d8029d0547807611fd6efaa0b4b86392f409ab0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Wed, 5 Dec 2012 12:00:37 +0000 Subject: [PATCH] d3d9state: Dump rendertarget images to JSON. --- retrace/d3d9state.cpp | 14 +++++- retrace/d3d9state_images.cpp | 83 +++++++++++++++++++++++++++++++----- retrace/d3dstate.hpp | 3 ++ 3 files changed, 89 insertions(+), 11 deletions(-) diff --git a/retrace/d3d9state.cpp b/retrace/d3d9state.cpp index 99cb603..a90ee6d 100644 --- a/retrace/d3d9state.cpp +++ b/retrace/d3d9state.cpp @@ -30,6 +30,7 @@ #include "d3d9imports.hpp" #include "d3dshader.hpp" +#include "d3dstate.hpp" #include "json.hpp" @@ -100,9 +101,20 @@ dumpDevice(std::ostream &os, IDirect3DDevice9 *pDevice) { JSONWriter json(os); + /* TODO */ + json.beginMember("parameters"); + json.beginObject(); + json.endObject(); + json.endMember(); // parameters + dumpShaders(json, pDevice); - /* TODO */ + json.beginMember("textures"); + json.beginObject(); + json.endObject(); + json.endMember(); // textures + + dumpFramebuffer(json, pDevice); } diff --git a/retrace/d3d9state_images.cpp b/retrace/d3d9state_images.cpp index 855dede..81f7f7f 100644 --- a/retrace/d3d9state_images.cpp +++ b/retrace/d3d9state_images.cpp @@ -27,16 +27,18 @@ #include #include "image.hpp" +#include "json.hpp" #include "d3d9imports.hpp" +#include "d3dstate.hpp" namespace d3dstate { -image::Image * -getRenderTargetImage(IDirect3DDevice9 *pDevice) { +static image::Image * +getRenderTargetImage(IDirect3DDevice9 *pDevice, + IDirect3DSurface9 *pRenderTarget) { image::Image *image = NULL; - IDirect3DSurface9 *pRenderTarget = NULL; D3DSURFACE_DESC Desc; IDirect3DSurface9 *pStagingSurface = NULL; D3DLOCKED_RECT LockedRect; @@ -44,15 +46,17 @@ getRenderTargetImage(IDirect3DDevice9 *pDevice) { unsigned char *dst; HRESULT hr; - hr = pDevice->GetRenderTarget(0, &pRenderTarget); - if (FAILED(hr)) { - goto no_rendertarget; + if (!pRenderTarget) { + return NULL; } - assert(pRenderTarget); hr = pRenderTarget->GetDesc(&Desc); assert(SUCCEEDED(hr)); - assert(Desc.Format == D3DFMT_X8R8G8B8 || Desc.Format == D3DFMT_A8R8G8B8); + + if (Desc.Format != D3DFMT_X8R8G8B8 && Desc.Format != D3DFMT_A8R8G8B8) { + std::cerr << "warning: unsupported D3DFORMAT " << Desc.Format << "\n"; + goto no_staging; + } hr = pDevice->CreateOffscreenPlainSurface(Desc.Width, Desc.Height, Desc.Format, D3DPOOL_SYSTEMMEM, &pStagingSurface, NULL); if (FAILED(hr)) { @@ -91,10 +95,69 @@ no_image: no_rendertargetdata: pStagingSurface->Release(); no_staging: - pRenderTarget->Release(); -no_rendertarget: return image; } +image::Image * +getRenderTargetImage(IDirect3DDevice9 *pDevice) { + HRESULT hr; + + IDirect3DSurface9 *pRenderTarget = NULL; + hr = pDevice->GetRenderTarget(0, &pRenderTarget); + if (FAILED(hr)) { + return NULL; + } + assert(pRenderTarget); + + image::Image *image = NULL; + if (pRenderTarget) { + image = getRenderTargetImage(pDevice, pRenderTarget); + pRenderTarget->Release(); + } + + return image; +} + + +void +dumpFramebuffer(JSONWriter &json, IDirect3DDevice9 *pDevice) +{ + HRESULT hr; + + json.beginMember("framebuffer"); + json.beginObject(); + + D3DCAPS9 Caps; + pDevice->GetDeviceCaps(&Caps); + + for (UINT i = 0; i < Caps.NumSimultaneousRTs; ++i) { + IDirect3DSurface9 *pRenderTarget = NULL; + hr = pDevice->GetRenderTarget(i, &pRenderTarget); + if (FAILED(hr)) { + continue; + } + + if (!pRenderTarget) { + continue; + } + + image::Image *image; + image = getRenderTargetImage(pDevice, pRenderTarget); + if (image) { + char label[64]; + _snprintf(label, sizeof label, "RENDER_TARGET_%u", i); + json.beginMember(label); + json.writeImage(image, "UNKNOWN"); + json.endMember(); // RENDER_TARGET_* + } + + pRenderTarget->Release(); + } + + json.endObject(); + json.endMember(); // framebuffer +} + + } /* namespace d3dstate */ diff --git a/retrace/d3dstate.hpp b/retrace/d3dstate.hpp index 86614d5..3766a91 100644 --- a/retrace/d3dstate.hpp +++ b/retrace/d3dstate.hpp @@ -53,6 +53,9 @@ extern const GUID GUID_D3DSTATE; image::Image * getRenderTargetImage(IDirect3DDevice9 *pDevice); +void +dumpFramebuffer(JSONWriter &json, IDirect3DDevice9 *pDevice); + void dumpDevice(std::ostream &os, IDirect3DDevice9 *pDevice); -- 2.43.0