From 65c2e7f1ccc6cdb5daec343c7e32b4a9dc463ae4 Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 12 Apr 2022 15:23:53 -0700 Subject: Support `[DllImport]` (#2181) * Support `[DllImport]` * Fix. * Fix. * Fix array type emit in cpp. * Fix. * Fix. * Fix Co-authored-by: Yong He --- source/slang-rt/slang-rt.cpp | 49 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 source/slang-rt/slang-rt.cpp (limited to 'source/slang-rt/slang-rt.cpp') 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 +#endif + +using namespace Slang; +Dictionary> 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 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(moduleHandle); + auto funcPtr = lib->findFuncByName(funcName.getBuffer()); + if (!funcPtr) + { + _slang_rt_abort("Cannot find function \"" + funcName + "\" in loaded library."); + } + return (void*)funcPtr; + } +} -- cgit v1.2.3