From: José Fonseca Date: Wed, 28 Nov 2012 15:06:22 +0000 (+0000) Subject: d3d10state: Dump shaders. X-Git-Url: https://git.cworth.org/git?p=apitrace;a=commitdiff_plain;h=1d4fd1471be8c29ed082bd6cdb3525c2b1215dc8 d3d10state: Dump shaders. --- diff --git a/retrace/d3d10state.cpp b/retrace/d3d10state.cpp index 543017d..f9b3661 100644 --- a/retrace/d3d10state.cpp +++ b/retrace/d3d10state.cpp @@ -30,12 +30,81 @@ #include "d3d11imports.hpp" #include "json.hpp" +#include "d3dshader.hpp" #include "d3dstate.hpp" namespace d3dstate { +const GUID +GUID_D3DSTATE = {0x7D71CAC9,0x7F58,0x432C,{0xA9,0x75,0xA1,0x9F,0xCF,0xCE,0xFD,0x14}}; + + +template< class T > +inline void +dumpShader(JSONWriter &json, const char *name, T *pShader) { + if (!pShader) { + return; + } + + HRESULT hr; + + /* + * There is no method to get the shader byte code, so the creator is supposed to + * attach it via the SetPrivateData method. + */ + UINT BytecodeLength = 0; + char dummy; + hr = pShader->GetPrivateData(GUID_D3DSTATE, &BytecodeLength, &dummy); + if (hr != DXGI_ERROR_MORE_DATA) { + return; + } + + void *pShaderBytecode = malloc(BytecodeLength); + if (!pShaderBytecode) { + return; + } + + hr = pShader->GetPrivateData(GUID_D3DSTATE, &BytecodeLength, pShaderBytecode); + if (SUCCEEDED(hr)) { + IDisassemblyBuffer *pDisassembly = NULL; + hr = DisassembleShader(pShaderBytecode, BytecodeLength, &pDisassembly); + if (SUCCEEDED(hr)) { + json.beginMember(name); + json.writeString((const char *)pDisassembly->GetBufferPointer() /*, pDisassembly->GetBufferSize() */); + json.endMember(); + pDisassembly->Release(); + } + } + + free(pShaderBytecode); +} + +static void +dumpShaders(JSONWriter &json, ID3D10Device *pDevice) +{ + json.beginMember("shaders"); + json.beginObject(); + + ID3D10VertexShader *pVertexShader = NULL; + pDevice->VSGetShader(&pVertexShader); + if (pVertexShader) { + dumpShader(json, "vertex", pVertexShader); + pVertexShader->Release(); + } + + ID3D10PixelShader *pPixelShader = NULL; + pDevice->PSGetShader(&pPixelShader); + if (pPixelShader) { + dumpShader(json, "pixel", pPixelShader); + } + + json.endObject(); + json.endMember(); // shaders +} + + void dumpDevice(std::ostream &os, ID3D10Device *pDevice) { @@ -47,10 +116,7 @@ dumpDevice(std::ostream &os, ID3D10Device *pDevice) json.endObject(); json.endMember(); // parameters - json.beginMember("shaders"); - json.beginObject(); - json.endObject(); - json.endMember(); // shaders + dumpShaders(json, pDevice); json.beginMember("textures"); json.beginObject(); @@ -58,7 +124,6 @@ dumpDevice(std::ostream &os, ID3D10Device *pDevice) json.endMember(); // textures dumpFramebuffer(json, pDevice); - } diff --git a/retrace/d3dstate.hpp b/retrace/d3dstate.hpp index 5985052..09e82a2 100644 --- a/retrace/d3dstate.hpp +++ b/retrace/d3dstate.hpp @@ -29,6 +29,8 @@ #include +#include + struct IDirect3DDevice9; struct ID3D10Device; @@ -45,6 +47,9 @@ namespace image { namespace d3dstate { +extern const GUID GUID_D3DSTATE; + + image::Image * getRenderTargetImage(IDirect3DDevice9 *pDevice); diff --git a/retrace/dxgiretrace.py b/retrace/dxgiretrace.py index 2263ba0..a412c3a 100644 --- a/retrace/dxgiretrace.py +++ b/retrace/dxgiretrace.py @@ -188,6 +188,14 @@ createWindow(DXGI_SWAP_CHAIN_DESC *pSwapChainDesc) { print ' _maps[_this] = 0;' print ' }' + # Attach shader byte code for lookup + if 'pShaderBytecode' in method.argNames(): + ppShader = method.args[-1] + assert ppShader.output + print r' if (retrace::dumpingState && SUCCEEDED(_result)) {' + print r' (*%s)->SetPrivateData(d3dstate::GUID_D3DSTATE, BytecodeLength, pShaderBytecode);' % ppShader.name + print r' }' + def main(): print r'#include '