+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
+}
+
+