From: José Fonseca Date: Wed, 28 Nov 2012 12:56:01 +0000 (+0000) Subject: d3d10state: Dump rendertargets. X-Git-Url: https://git.cworth.org/git?p=apitrace;a=commitdiff_plain;h=65ba497caca56134f9b4f18658d104ce89092c11 d3d10state: Dump rendertargets. --- diff --git a/retrace/d3d10state.cpp b/retrace/d3d10state.cpp index fd0eb5b..543017d 100644 --- a/retrace/d3d10state.cpp +++ b/retrace/d3d10state.cpp @@ -30,6 +30,7 @@ #include "d3d11imports.hpp" #include "json.hpp" +#include "d3dstate.hpp" namespace d3dstate { @@ -41,6 +42,23 @@ dumpDevice(std::ostream &os, ID3D10Device *pDevice) JSONWriter json(os); /* TODO */ + json.beginMember("parameters"); + json.beginObject(); + json.endObject(); + json.endMember(); // parameters + + json.beginMember("shaders"); + json.beginObject(); + json.endObject(); + json.endMember(); // shaders + + json.beginMember("textures"); + json.beginObject(); + json.endObject(); + json.endMember(); // textures + + dumpFramebuffer(json, pDevice); + } diff --git a/retrace/d3d10state_images.cpp b/retrace/d3d10state_images.cpp index d56c756..a9d95c9 100644 --- a/retrace/d3d10state_images.cpp +++ b/retrace/d3d10state_images.cpp @@ -30,7 +30,9 @@ #include #include "image.hpp" +#include "json.hpp" #include "d3d10imports.hpp" +#include "d3dstate.hpp" namespace d3dstate { @@ -179,10 +181,10 @@ unmapResource(ID3D10Resource *pResource, UINT Subresource) { } } -image::Image * -getRenderTargetImage(ID3D10Device *pDevice) { +static image::Image * +getRenderTargetViewImage(ID3D10Device *pDevice, + ID3D10RenderTargetView *pRenderTargetView) { image::Image *image = NULL; - ID3D10RenderTargetView *pRenderTargetView = NULL; D3D10_RENDER_TARGET_VIEW_DESC Desc; ID3D10Resource *pResource = NULL; ID3D10Resource *pStagingResource = NULL; @@ -194,9 +196,8 @@ getRenderTargetImage(ID3D10Device *pDevice) { const unsigned char *src; unsigned char *dst; - pDevice->OMGetRenderTargets(1, &pRenderTargetView, NULL); if (!pRenderTargetView) { - goto no_rendertarget; + return NULL; } pRenderTargetView->GetResource(&pResource); @@ -300,12 +301,55 @@ no_staging: if (pResource) { pResource->Release(); } + return image; +} + + +image::Image * +getRenderTargetImage(ID3D10Device *pDevice) { + ID3D10RenderTargetView *pRenderTargetView = NULL; + pDevice->OMGetRenderTargets(1, &pRenderTargetView, NULL); + + image::Image *image = NULL; if (pRenderTargetView) { + image = getRenderTargetViewImage(pDevice, pRenderTargetView); pRenderTargetView->Release(); } -no_rendertarget: + return image; } +void +dumpFramebuffer(JSONWriter &json, ID3D10Device *pDevice) +{ + json.beginMember("framebuffer"); + json.beginObject(); + + ID3D10RenderTargetView *pRenderTargetViews[D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT]; + pDevice->OMGetRenderTargets(D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT, pRenderTargetViews, NULL); + + for (UINT i = 0; i < D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i) { + if (!pRenderTargetViews[i]) { + continue; + } + + image::Image *image; + image = getRenderTargetViewImage(pDevice, pRenderTargetViews[i]); + if (image) { + char label[64]; + snprintf(label, sizeof label, "RENDER_TARGET_%u", i); + json.beginMember(label); + json.writeImage(image, "UNKNOWN"); + json.endMember(); // RENDER_TARGET_* + } + + pRenderTargetViews[i]->Release(); + } + + json.endObject(); + json.endMember(); // framebuffer +} + + } /* namespace d3dstate */ diff --git a/retrace/d3dstate.hpp b/retrace/d3dstate.hpp index c21c361..5985052 100644 --- a/retrace/d3dstate.hpp +++ b/retrace/d3dstate.hpp @@ -35,6 +35,8 @@ struct ID3D10Device; struct ID3D11DeviceContext; +class JSONWriter; + namespace image { class Image; } @@ -53,6 +55,9 @@ dumpDevice(std::ostream &os, IDirect3DDevice9 *pDevice); image::Image * getRenderTargetImage(ID3D10Device *pDevice); +void +dumpFramebuffer(JSONWriter &json, ID3D10Device *pDevice); + void dumpDevice(std::ostream &os, ID3D10Device *pDevice); diff --git a/retrace/json.cpp b/retrace/json.cpp index bb901c2..53a61a3 100644 --- a/retrace/json.cpp +++ b/retrace/json.cpp @@ -304,6 +304,11 @@ JSONWriter::writeBool(bool b) { void JSONWriter::writeImage(image::Image *image, const char *format, unsigned depth) { + if (!image) { + writeNull(); + return; + } + beginObject(); // Tell the GUI this is no ordinary object, but an image