]> git.cworth.org Git - apitrace/blobdiff - wrappers/d3dcommonshader.cpp
d3dtrace,d3dretrace: Move shader disassembly helpers to common location.
[apitrace] / wrappers / d3dcommonshader.cpp
index 2ae804b9223c6f16a8a6a9bc26c71fb38a9488df..a66e0179f90251dafbffcb2704ca40535fd0e3bc 100644 (file)
 
 #include <stdio.h>
 
+#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();
     }