From 9bb6d55b32ce8ad6d453237a8ccce6469c912f66 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Wed, 7 Nov 2012 19:10:31 +0000 Subject: [PATCH] d3d10: Fallback to D3D10DisassembleShader. Should be always present. --- wrappers/d3d10shader.cpp | 54 ++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/wrappers/d3d10shader.cpp b/wrappers/d3d10shader.cpp index 3670f2f..a6b4377 100644 --- a/wrappers/d3d10shader.cpp +++ b/wrappers/d3d10shader.cpp @@ -56,46 +56,64 @@ typedef HRESULT ID3DBlob **ppDisassembly ); - -static HMODULE hD3DCompilerModule = NULL; 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; + static bool firsttime = true; if (firsttime) { - if (!hD3DCompilerModule) { - int version; - for (version = 44; version >= 33; --version) { - char filename[256]; - _snprintf(filename, sizeof(filename), "d3dcompiler_%u.dll", version); - hD3DCompilerModule = LoadLibraryA(filename); - if (hD3DCompilerModule) { + 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 (hD3DCompilerModule) { - if (!pfnD3DDisassemble) { - pfnD3DDisassemble = (PFND3DDISASSEMBLE)GetProcAddress(hD3DCompilerModule, "D3DDisassemble"); + 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; + firsttime = false; } - /* - * TODO: Fallback to D3D10DisassembleShader, which should be always present. - */ - 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); } if (SUCCEEDED(hr)) { -- 2.43.0