summaryrefslogtreecommitdiff
path: root/source/slang-wasm/slang-wasm-bindings.cpp
diff options
context:
space:
mode:
authorAnders Leino <aleino@nvidia.com>2024-10-11 13:13:04 +0300
committerGitHub <noreply@github.com>2024-10-11 18:13:04 +0800
commitdfab34e4bf508fc517d4d645ebb3b6b1179a5003 (patch)
tree0a75a9618ffdbd0604145cade8dbaff7b2af01cd /source/slang-wasm/slang-wasm-bindings.cpp
parent5fa35fcce532267a2ae5779dee9ff4d07fab6bf4 (diff)
Add slang-wasm target (#5237)
Support for exceptions is enabled, since Slang uses them for diagnostics. The size optimization arguments ('-Os') resolves some internal emscripten error during the slang-wasm.wasm linking step, which happens when enabling exceptions. ("parse exception: too many locals")
Diffstat (limited to 'source/slang-wasm/slang-wasm-bindings.cpp')
-rw-r--r--source/slang-wasm/slang-wasm-bindings.cpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/source/slang-wasm/slang-wasm-bindings.cpp b/source/slang-wasm/slang-wasm-bindings.cpp
new file mode 100644
index 000000000..4880596a9
--- /dev/null
+++ b/source/slang-wasm/slang-wasm-bindings.cpp
@@ -0,0 +1,59 @@
+#include <emscripten/bind.h>
+#include <slang-com-ptr.h>
+#include "slang-wasm.h"
+
+using namespace emscripten;
+
+EMSCRIPTEN_BINDINGS(slang)
+{
+ constant("SLANG_OK", SLANG_OK);
+
+ function(
+ "createGlobalSession",
+ &slang::wgsl::createGlobalSession,
+ return_value_policy::take_ownership());
+
+ function(
+ "getLastError",
+ &slang::wgsl::getLastError);
+
+ class_<slang::wgsl::GlobalSession>("GlobalSession")
+ .function(
+ "createSession",
+ &slang::wgsl::GlobalSession::createSession,
+ return_value_policy::take_ownership());
+
+ class_<slang::wgsl::Session>("Session")
+ .function(
+ "loadModuleFromSource",
+ &slang::wgsl::Session::loadModuleFromSource,
+ return_value_policy::take_ownership())
+ .function(
+ "createCompositeComponentType",
+ &slang::wgsl::Session::createCompositeComponentType,
+ return_value_policy::take_ownership());
+
+ class_<slang::wgsl::ComponentType>("ComponentType")
+ .function(
+ "link",
+ &slang::wgsl::ComponentType::link,
+ return_value_policy::take_ownership())
+ .function(
+ "getEntryPointCode",
+ &slang::wgsl::ComponentType::getEntryPointCode);
+
+ class_<slang::wgsl::Module, base<slang::wgsl::ComponentType>>("Module")
+ .function(
+ "findEntryPointByName",
+ &slang::wgsl::Module::findEntryPointByName,
+ return_value_policy::take_ownership());
+
+ value_object<slang::wgsl::Error>("Error")
+ .field("type", &slang::wgsl::Error::type)
+ .field("result", &slang::wgsl::Error::result)
+ .field("message", &slang::wgsl::Error::message);
+
+ class_<slang::wgsl::EntryPoint, base<slang::wgsl::ComponentType>>("EntryPoint");
+
+ register_vector<slang::wgsl::ComponentType*>("ComponentTypeList");
+}