diff --git a/thin3d/d3dx9_loader.cpp b/thin3d/d3dx9_loader.cpp index a18453045..539916fb9 100644 --- a/thin3d/d3dx9_loader.cpp +++ b/thin3d/d3dx9_loader.cpp @@ -33,73 +33,22 @@ typedef HRESULT(__stdcall *TFunc_D3DXAssembleShader)( static HMODULE hm_d3dx; static unsigned int d3dx_version; +static int failedFunctions; + static TFunc_D3DXCheckVersion m_TFunc_D3DXCheckVersion; static TFunc_D3DXAssembleShader m_TFunc_D3DXAssembleShader; static TFunc_D3DXCompileShader m_TFunc_D3DXCompileShader; -void makeD3DX9dllFilename_by_version(std::string& strOut, unsigned int vers, bool bDebugV = false) { - strOut = ""; - strOut += "d3dx9"; - if (bDebugV) { - strOut += "d"; - } - strOut += "_"; - char buf[32]; - sprintf(buf, "%02i", vers); - strOut += buf; - strOut += ".dll"; - // temp mon - if (vers < 10) { - int _stop = 0; - } -} - -void makeD3DX9dllFilename_by_versionW(std::wstring& strOut, unsigned int vers, bool bDebugV = false) -{ - strOut = L""; - strOut += L"d3dx9"; - - if (bDebugV) { - strOut += L"d"; - } - - strOut += L"_"; - - wchar_t buf[32]; - wsprintf(buf, L"%02i", vers); - strOut += buf; - strOut += L".dll"; - - // temp mon - if (vers < 10) { - int _stop = 0; - } -} - -bool checkDllExistsA(const char* fname, bool bIncludeExeDir) { - return ::GetFileAttributesA(fname) != DWORD(-1); +void makeD3DX9dllFilename_by_versionW(std::wstring& strOut, unsigned int versionNumber, bool debugVersion = false) { + wchar_t buf[256]; + wsprintf(buf, L"d3dx9%s_%02i.dll", debugVersion ? L"d" : L"", versionNumber); + strOut = buf; } bool checkDllExistsW(const WCHAR* fname, bool bIncludeExeDir) { return ::GetFileAttributesW(fname) != DWORD(-1); } -bool checkExistsDll(const char* sDllFilename) { - std::string sfullpath; - char bufsysdir[MAX_PATH]; - - if (!::GetSystemDirectoryA(bufsysdir, MAX_PATH)) { - throw (std::runtime_error("system error")); - } - sfullpath = bufsysdir; - sfullpath += '\\'; - sfullpath += sDllFilename; - if (checkDllExistsA(sfullpath.c_str(), true)) { - return true; - } - return false; -} - bool checkExistsDllW(const WCHAR* sDllFilename) { std::wstring sfullpath; WCHAR bufsysdir[MAX_PATH]; @@ -119,12 +68,12 @@ bool checkExistsDllW(const WCHAR* sDllFilename) { return false; } -bool getInstaledD3DXlastVersion(unsigned int* piOutVers) { +bool getLatestInstalledD3DXVersion(unsigned int* piOutVers) { *piOutVers = 0; - std::string fname; + std::wstring fname; for (unsigned int cvers = 45; cvers > 0; cvers--) { - makeD3DX9dllFilename_by_version(fname, cvers); - if (checkExistsDll(fname.c_str())) { + makeD3DX9dllFilename_by_versionW(fname, cvers); + if (checkExistsDllW(fname.c_str())) { *piOutVers = cvers; return true; } @@ -132,60 +81,22 @@ bool getInstaledD3DXlastVersion(unsigned int* piOutVers) { return false; } -//==================================================================== -bool getInstaledD3DXallVersion(std::vector& versions) { - bool result = false; - versions.clear(); +HMODULE loadDllLastVersion(unsigned int* version, bool debugVersion) { + failedFunctions = 0; - std::string fname; - for (unsigned int cvers = 45; cvers > 0; cvers--) { - makeD3DX9dllFilename_by_version(fname, cvers); - if (checkExistsDll(fname.c_str())) { - versions.push_back(cvers); - result = true; - } - } - return result; -} - -//==================================================================== -HMODULE loadDllLastVersion(unsigned int* piOutVers) { - if (piOutVers) - *piOutVers = 0; - - // old code ansi string -#if 0 - - if (!getInstaledD3DXlastVersion(piOutVers)) { + if (version) + *version = 0; + if (!getLatestInstalledD3DXVersion(version)) { return 0; } - std::string dllfname; - makeD3DX9dllFilename_by_version(dllfname, *piOutVers); - - HMODULE hm = 0; - hm = ::LoadLibraryA(dllfname.c_str()); - -#else - // unicode - if (!getInstaledD3DXlastVersion(piOutVers)) { - return 0; - } - - bool bdebugvers = false; -#ifdef _DEBUG - bdebugvers = false; // true; -#endif std::wstring dllfname; - makeD3DX9dllFilename_by_versionW(dllfname, *piOutVers, bdebugvers); - HMODULE hm = 0; - hm = ::LoadLibraryW(dllfname.c_str()); -#endif + makeD3DX9dllFilename_by_versionW(dllfname, *version, debugVersion); + HMODULE hm = ::LoadLibraryW(dllfname.c_str()); return hm; } - #define GB_MAKE_STR(s) # s #define GB_MAKE_STR2(x) GB_MAKE_STR(x) @@ -196,34 +107,18 @@ HMODULE loadDllLastVersion(unsigned int* piOutVers) { handleNotFoundAddr( GB_MAKE_STR(funcname) ); \ } -//============================================================== void handleNotFoundAddr(const char* sFuncName) { -#ifdef _DEBUG - std::string temp; - temp = " Entry point not found in d3dx dll : \n"; - temp += sFuncName; - // ELOG(temp.c_str()); - - assert(false && temp.c_str()); - - static FILE* st_file = NULL; - if (st_file == NULL) { - st_file = fopen("__getProcAddrlog.txt", "w"); - } - - fputs(sFuncName, st_file); - fputs("\n", st_file); - -#endif + ELOG("Failed to find D3DX fucntion %s", sFuncName); + failedFunctions++; } -int LoadD3DX9Dynamic() { +int LoadD3DX9Dynamic(bool debugVersion) { if (hm_d3dx) { // Already loaded return d3dx_version; } - hm_d3dx = loadDllLastVersion(&d3dx_version); + hm_d3dx = loadDllLastVersion(&d3dx_version, debugVersion); void* ptr = NULL; const int NERROR = -1; int _begin = 0; @@ -232,6 +127,10 @@ int LoadD3DX9Dynamic() { __HANDLE_DLL_ENTRY(D3DXAssembleShader); __HANDLE_DLL_ENTRY(D3DXCompileShader); + if (failedFunctions > 0) { + ELOG("Failed to load %i D3DX functions. This will not go well.", failedFunctions); + } + return d3dx_version; } @@ -256,7 +155,6 @@ BOOL dyn_D3DXCheckVersion(UINT D3DSDKVersion, UINT D3DXSDKVersion) { if (!m_TFunc_D3DXCheckVersion) { GB_D3D9_D3DXDLL_LOADER_CHECK_ENTRY_NULL_PTR(D3DXCheckVersion) } - return m_TFunc_D3DXCheckVersion(D3DSDKVersion, D3DXSDKVersion); } diff --git a/thin3d/d3dx9_loader.h b/thin3d/d3dx9_loader.h index b4950809f..a194077a2 100644 --- a/thin3d/d3dx9_loader.h +++ b/thin3d/d3dx9_loader.h @@ -7,7 +7,7 @@ #include // Returns the D3DX9 version we got. 0 if none. -int LoadD3DX9Dynamic(); +int LoadD3DX9Dynamic(bool debugVersion = false); // If debugVersion is set, load d3dx9d.dll int GetD3DXVersion(); void UnloadD3DXDynamic(); diff --git a/thin3d/thin3d_d3d9.cpp b/thin3d/thin3d_d3d9.cpp index 1f500671c..93c2d1589 100644 --- a/thin3d/thin3d_d3d9.cpp +++ b/thin3d/thin3d_d3d9.cpp @@ -394,10 +394,6 @@ private: }; Thin3DDX9Context::Thin3DDX9Context(LPDIRECT3DDEVICE9 device) : device_(device) { - int d3dx_ver = LoadD3DX9Dynamic(); - if (!d3dx_ver) { - ELOG("Failed to load D3DX9!"); - } CreatePresets(); } @@ -586,10 +582,6 @@ void Thin3DDX9Context::Clear(int mask, uint32_t colorval, float depthVal, int st device_->Clear(0, NULL, d3dMask, (D3DCOLOR)colorval, depthVal, stencilVal); } -Thin3DContext *T3DCreateDX9Context(LPDIRECT3DDEVICE9 device) { - return new Thin3DDX9Context(device); -} - void Thin3DDX9Context::SetScissorEnabled(bool enable) { device_->SetRenderState(D3DRS_SCISSORTESTENABLE, enable); } @@ -673,3 +665,12 @@ void Thin3DDX9Shader::SetMatrix4x4(LPDIRECT3DDEVICE9 device, const char *name, c constantTable_->SetFloatArray(device, handle, value.getReadPtr(), 16); } } + +Thin3DContext *T3DCreateDX9Context(LPDIRECT3DDEVICE9 device) { + int d3dx_ver = LoadD3DX9Dynamic(); + if (!d3dx_ver) { + ELOG("Failed to load D3DX9!"); + return NULL; + } + return new Thin3DDX9Context(device); +}