X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=wrappers%2Fd3dcommonshader.cpp;h=a66e0179f90251dafbffcb2704ca40535fd0e3bc;hb=3b18682ec801546fc7b2a1b9593161fa99c5adcd;hp=2ae804b9223c6f16a8a6a9bc26c71fb38a9488df;hpb=52cd6f0c427a1345ffeb578c01294bf602f16894;p=apitrace diff --git a/wrappers/d3dcommonshader.cpp b/wrappers/d3dcommonshader.cpp index 2ae804b..a66e017 100644 --- a/wrappers/d3dcommonshader.cpp +++ b/wrappers/d3dcommonshader.cpp @@ -27,106 +27,24 @@ #include +#include "d3dshader.hpp" #include "d3dcommonshader.hpp" -struct ID3D10Blob : public IUnknown { -public: - virtual LPVOID STDMETHODCALLTYPE GetBufferPointer( void) = 0; - virtual SIZE_T STDMETHODCALLTYPE GetBufferSize( void) = 0; -}; - -typedef ID3D10Blob ID3DBlob; -typedef ID3DBlob* LPD3DBLOB; - -#define D3D_DISASM_ENABLE_COLOR_CODE 0x00000001 -#define D3D_DISASM_ENABLE_DEFAULT_VALUE_PRINTS 0x00000002 -#define D3D_DISASM_ENABLE_INSTRUCTION_NUMBERING 0x00000004 -#define D3D_DISASM_ENABLE_INSTRUCTION_CYCLE 0x00000008 -#define D3D_DISASM_DISABLE_DEBUG_INFO 0x00000010 -#define D3D_DISASM_ENABLE_INSTRUCTION_OFFSET 0x00000020 -#define D3D_DISASM_INSTRUCTION_ONLY 0x00000040 - -typedef HRESULT -(WINAPI *PFND3DDISASSEMBLE)( - LPCVOID pSrcData, - SIZE_T SrcDataSize, - UINT Flags, - LPCSTR szComments, - ID3DBlob **ppDisassembly -); - -static PFND3DDISASSEMBLE pfnD3DDisassemble = NULL; - -typedef HRESULT -(WINAPI *PFND3D10DISASSEMBLESHADER)( - const void *pShader, - SIZE_T BytecodeLength, - BOOL EnableColorCode, - LPCSTR pComments, - ID3D10Blob **ppDisassembly -); - -static PFND3D10DISASSEMBLESHADER pfnD3D10DisassembleShader = NULL; - void DumpShader(trace::Writer &writer, const void *pShaderBytecode, SIZE_T BytecodeLength) { - static bool firsttime = true; - - if (firsttime) { - char szFilename[MAX_PATH]; - HMODULE hModule = NULL; - - int version; - for (version = 44; version >= 33; --version) { - _snprintf(szFilename, sizeof(szFilename), "d3dcompiler_%i.dll", version); - hModule = LoadLibraryA(szFilename); - if (hModule) { - pfnD3DDisassemble = (PFND3DDISASSEMBLE) - GetProcAddress(hModule, "D3DDisassemble"); - if (pfnD3DDisassemble) { - break; - } - } - } - - if (!pfnD3DDisassemble) { - /* - * Fallback to D3D10DisassembleShader, which should be always present. - */ - if (GetSystemDirectoryA(szFilename, MAX_PATH)) { - strcat(szFilename, "\\d3d10.dll"); - hModule = LoadLibraryA(szFilename); - if (hModule) { - pfnD3D10DisassembleShader = (PFND3D10DISASSEMBLESHADER) - GetProcAddress(hModule, "D3D10DisassembleShader"); - } - } - } - - firsttime = false; - } - - LPD3DBLOB pDisassembly = NULL; - HRESULT hr = E_FAIL; - - if (pfnD3DDisassemble) { - hr = pfnD3DDisassemble(pShaderBytecode, BytecodeLength, 0, NULL, &pDisassembly); - } else if (pfnD3D10DisassembleShader) { - hr = pfnD3D10DisassembleShader(pShaderBytecode, BytecodeLength, 0, NULL, &pDisassembly); - } + IDisassemblyBuffer *pDisassembly = NULL; + HRESULT hr = DisassembleShader(pShaderBytecode, BytecodeLength, &pDisassembly); if (SUCCEEDED(hr)) { writer.beginRepr(); - writer.writeString((const char *)pDisassembly->GetBufferPointer(), pDisassembly->GetBufferSize()); + writer.writeString((const char *)pDisassembly->GetBufferPointer(), + pDisassembly->GetBufferSize()); + pDisassembly->Release(); } writer.writeBlob(pShaderBytecode, BytecodeLength); - if (pDisassembly) { - pDisassembly->Release(); - } - if (SUCCEEDED(hr)) { writer.endRepr(); }