diff options
| author | Yong He <yonghe@outlook.com> | 2022-04-12 15:23:53 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-04-12 15:23:53 -0700 |
| commit | 65c2e7f1ccc6cdb5daec343c7e32b4a9dc463ae4 (patch) | |
| tree | b13a93f5fa621a50ce3c100f018730c882ca3e9c /source/slang-rt/slang-rt.cpp | |
| parent | 89560d62f3fb42e0f76cbae76c23eac437b65eba (diff) | |
Support `[DllImport]` (#2181)
* Support `[DllImport]`
* Fix.
* Fix.
* Fix array type emit in cpp.
* Fix.
* Fix.
* Fix
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang-rt/slang-rt.cpp')
| -rw-r--r-- | source/slang-rt/slang-rt.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/source/slang-rt/slang-rt.cpp b/source/slang-rt/slang-rt.cpp new file mode 100644 index 000000000..163a1b99c --- /dev/null +++ b/source/slang-rt/slang-rt.cpp @@ -0,0 +1,49 @@ +#include "slang-rt.h" +#include "../core/slang-basic.h" +#include "../core/slang-shared-library.h" + +#if SLANG_WINDOWS_FAMILY +# include <Windows.h> +#endif + +using namespace Slang; +Dictionary<String, ComPtr<ISlangSharedLibrary>> slangRT_loadedLibraries; + +extern "C" +{ + SLANG_RT_API void SLANG_MCALL _slang_rt_abort(Slang::String errorMessage) + { + fprintf(stderr, "%s", errorMessage.getBuffer()); +#if SLANG_WINDOWS_FAMILY + MessageBoxA(0, errorMessage.getBuffer(), "Slang Runtime Error", MB_ICONERROR); +#endif + abort(); + } + + SLANG_RT_API void* SLANG_MCALL _slang_rt_load_dll(Slang::String modulePath) + { + ComPtr<ISlangSharedLibrary> lib; + if (!slangRT_loadedLibraries.TryGetValue(modulePath, lib)) + { + if (DefaultSharedLibraryLoader::getSingleton()->loadSharedLibrary( + modulePath.getBuffer(), lib.writeRef()) != SLANG_OK) + { + _slang_rt_abort("Failed to load DLL \"" + modulePath + "\""); + } + slangRT_loadedLibraries[modulePath] = lib; + } + return lib.get(); + } + + SLANG_RT_API void* SLANG_MCALL + _slang_rt_load_dll_func(void* moduleHandle, Slang::String funcName) + { + auto lib = static_cast<ISlangSharedLibrary*>(moduleHandle); + auto funcPtr = lib->findFuncByName(funcName.getBuffer()); + if (!funcPtr) + { + _slang_rt_abort("Cannot find function \"" + funcName + "\" in loaded library."); + } + return (void*)funcPtr; + } +} |
