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 ++++++++++++++++++++++++++++++++++++++++++++ source/slang-rt/slang-rt.h | 22 ++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 source/slang-rt/slang-rt.cpp create mode 100644 source/slang-rt/slang-rt.h (limited to 'source/slang-rt') 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; + } +} diff --git a/source/slang-rt/slang-rt.h b/source/slang-rt/slang-rt.h new file mode 100644 index 000000000..b6f397c72 --- /dev/null +++ b/source/slang-rt/slang-rt.h @@ -0,0 +1,22 @@ +// slang-rt.h +#ifndef SLANG_RT_H +#define SLANG_RT_H + +#include "../core/slang-string.h" +#include "../core/slang-smart-pointer.h" + +#ifdef SLANG_RT_DYNAMIC_EXPORT +# define SLANG_RT_API SLANG_DLL_EXPORT +#else +# define SLANG_RT_API +#endif + +extern "C" +{ + SLANG_RT_API void SLANG_MCALL _slang_rt_abort(Slang::String errorMessage); + SLANG_RT_API void* SLANG_MCALL _slang_rt_load_dll(Slang::String modulePath); + SLANG_RT_API void* SLANG_MCALL + _slang_rt_load_dll_func(void* moduleHandle, Slang::String modulePath); +} + +#endif -- cgit v1.2.3