|
@@ -13,27 +13,43 @@
|
|
#define __DXCAPI_USE_H__
|
|
#define __DXCAPI_USE_H__
|
|
|
|
|
|
#include "dxc/dxcapi.h"
|
|
#include "dxc/dxcapi.h"
|
|
-#include "llvm/Support/DynamicLibrary.h"
|
|
|
|
|
|
|
|
namespace dxc {
|
|
namespace dxc {
|
|
|
|
|
|
// Helper class to dynamically load the dxcompiler or a compatible libraries.
|
|
// Helper class to dynamically load the dxcompiler or a compatible libraries.
|
|
class DxcDllSupport {
|
|
class DxcDllSupport {
|
|
protected:
|
|
protected:
|
|
- using DynamicLibrary = llvm::sys::DynamicLibrary;
|
|
|
|
- DynamicLibrary m_dll;
|
|
|
|
|
|
+ HMODULE m_dll;
|
|
DxcCreateInstanceProc m_createFn;
|
|
DxcCreateInstanceProc m_createFn;
|
|
DxcCreateInstance2Proc m_createFn2;
|
|
DxcCreateInstance2Proc m_createFn2;
|
|
|
|
|
|
HRESULT InitializeInternal(LPCWSTR dllName, LPCSTR fnName) {
|
|
HRESULT InitializeInternal(LPCWSTR dllName, LPCSTR fnName) {
|
|
- if (m_dll.isValid()) return S_OK;
|
|
|
|
- m_dll = DynamicLibrary::getPermanentLibrary(CW2A(dllName));
|
|
|
|
- if (!m_dll.isValid()) return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
|
|
|
|
- m_createFn = (DxcCreateInstanceProc)m_dll.getAddressOfSymbol(fnName);
|
|
|
|
|
|
+ if (m_dll != nullptr) return S_OK;
|
|
|
|
+
|
|
|
|
+#ifdef _WIN32
|
|
|
|
+ m_dll = LoadLibraryW(dllName);
|
|
|
|
+#else
|
|
|
|
+ char nameStr[256];
|
|
|
|
+ std::wcstombs(nameStr, dllName, 256);
|
|
|
|
+ m_dll = ::dlopen(nameStr, RTLD_LAZY);
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+ if (m_dll == nullptr) return HRESULT_FROM_WIN32(GetLastError());
|
|
|
|
+
|
|
|
|
+#ifdef _WIN32
|
|
|
|
+ m_createFn = (DxcCreateInstanceProc)GetProcAddress(m_dll, fnName);
|
|
|
|
+#else
|
|
|
|
+ m_createFn = (DxcCreateInstanceProc)::dlsym(m_dll, fnName);
|
|
|
|
+#endif
|
|
|
|
|
|
if (m_createFn == nullptr) {
|
|
if (m_createFn == nullptr) {
|
|
HRESULT hr = HRESULT_FROM_WIN32(GetLastError());
|
|
HRESULT hr = HRESULT_FROM_WIN32(GetLastError());
|
|
- m_dll = DynamicLibrary();
|
|
|
|
|
|
+#ifdef _WIN32
|
|
|
|
+ FreeLibrary(m_dll);
|
|
|
|
+#else
|
|
|
|
+ ::dlclose(m_dll);
|
|
|
|
+#endif
|
|
|
|
+ m_dll = nullptr;
|
|
return hr;
|
|
return hr;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -45,18 +61,22 @@ protected:
|
|
memcpy(fnName2, fnName, s);
|
|
memcpy(fnName2, fnName, s);
|
|
fnName2[s] = '2';
|
|
fnName2[s] = '2';
|
|
fnName2[s + 1] = '\0';
|
|
fnName2[s + 1] = '\0';
|
|
- m_createFn2 = (DxcCreateInstance2Proc)m_dll.getAddressOfSymbol(fnName2);
|
|
|
|
|
|
+#ifdef _WIN32
|
|
|
|
+ m_createFn2 = (DxcCreateInstance2Proc)GetProcAddress(m_dll, fnName2);
|
|
|
|
+#else
|
|
|
|
+ m_createFn2 = (DxcCreateInstance2Proc)::dlsym(m_dll, fnName2);
|
|
|
|
+#endif
|
|
}
|
|
}
|
|
|
|
|
|
return S_OK;
|
|
return S_OK;
|
|
}
|
|
}
|
|
|
|
|
|
public:
|
|
public:
|
|
- DxcDllSupport() : m_dll(), m_createFn(nullptr), m_createFn2(nullptr) {
|
|
|
|
|
|
+ DxcDllSupport() : m_dll(nullptr), m_createFn(nullptr), m_createFn2(nullptr) {
|
|
}
|
|
}
|
|
|
|
|
|
DxcDllSupport(DxcDllSupport&& other) {
|
|
DxcDllSupport(DxcDllSupport&& other) {
|
|
- m_dll = other.m_dll; other.m_dll = DynamicLibrary();
|
|
|
|
|
|
+ m_dll = other.m_dll; other.m_dll = nullptr;
|
|
m_createFn = other.m_createFn; other.m_createFn = nullptr;
|
|
m_createFn = other.m_createFn; other.m_createFn = nullptr;
|
|
m_createFn2 = other.m_createFn2; other.m_createFn2 = nullptr;
|
|
m_createFn2 = other.m_createFn2; other.m_createFn2 = nullptr;
|
|
}
|
|
}
|
|
@@ -86,7 +106,7 @@ public:
|
|
|
|
|
|
HRESULT CreateInstance(REFCLSID clsid, REFIID riid, _Outptr_ IUnknown **pResult) {
|
|
HRESULT CreateInstance(REFCLSID clsid, REFIID riid, _Outptr_ IUnknown **pResult) {
|
|
if (pResult == nullptr) return E_POINTER;
|
|
if (pResult == nullptr) return E_POINTER;
|
|
- if (!m_dll.isValid()) return E_FAIL;
|
|
|
|
|
|
+ if (m_dll == nullptr) return E_FAIL;
|
|
HRESULT hr = m_createFn(clsid, riid, (LPVOID*)pResult);
|
|
HRESULT hr = m_createFn(clsid, riid, (LPVOID*)pResult);
|
|
return hr;
|
|
return hr;
|
|
}
|
|
}
|
|
@@ -98,7 +118,7 @@ public:
|
|
|
|
|
|
HRESULT CreateInstance2(IMalloc *pMalloc, REFCLSID clsid, REFIID riid, _Outptr_ IUnknown **pResult) {
|
|
HRESULT CreateInstance2(IMalloc *pMalloc, REFCLSID clsid, REFIID riid, _Outptr_ IUnknown **pResult) {
|
|
if (pResult == nullptr) return E_POINTER;
|
|
if (pResult == nullptr) return E_POINTER;
|
|
- if (!m_dll.isValid()) return E_FAIL;
|
|
|
|
|
|
+ if (m_dll == nullptr) return E_FAIL;
|
|
if (m_createFn2 == nullptr) return E_FAIL;
|
|
if (m_createFn2 == nullptr) return E_FAIL;
|
|
HRESULT hr = m_createFn2(pMalloc, clsid, riid, (LPVOID*)pResult);
|
|
HRESULT hr = m_createFn2(pMalloc, clsid, riid, (LPVOID*)pResult);
|
|
return hr;
|
|
return hr;
|
|
@@ -109,20 +129,25 @@ public:
|
|
}
|
|
}
|
|
|
|
|
|
bool IsEnabled() const {
|
|
bool IsEnabled() const {
|
|
- return m_dll.isValid();
|
|
|
|
|
|
+ return m_dll != nullptr;
|
|
}
|
|
}
|
|
|
|
|
|
void Cleanup() {
|
|
void Cleanup() {
|
|
- if (m_dll.isValid()) {
|
|
|
|
|
|
+ if (m_dll != nullptr) {
|
|
m_createFn = nullptr;
|
|
m_createFn = nullptr;
|
|
m_createFn2 = nullptr;
|
|
m_createFn2 = nullptr;
|
|
- m_dll = DynamicLibrary();
|
|
|
|
|
|
+#ifdef _WIN32
|
|
|
|
+ FreeLibrary(m_dll);
|
|
|
|
+#else
|
|
|
|
+ ::dlclose(m_dll);
|
|
|
|
+#endif
|
|
|
|
+ m_dll = nullptr;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- DynamicLibrary Detach() {
|
|
|
|
- DynamicLibrary module = m_dll;
|
|
|
|
- m_dll = DynamicLibrary();
|
|
|
|
|
|
+ HMODULE Detach() {
|
|
|
|
+ HMODULE module = m_dll;
|
|
|
|
+ m_dll = nullptr;
|
|
return module;
|
|
return module;
|
|
}
|
|
}
|
|
};
|
|
};
|