summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/slang/slang-api.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/source/slang/slang-api.cpp b/source/slang/slang-api.cpp
index 9b7b605a2..14bfc8a72 100644
--- a/source/slang/slang-api.cpp
+++ b/source/slang/slang-api.cpp
@@ -982,3 +982,87 @@ SLANG_API void spSetDiagnosticFlags(slang::ICompileRequest* request, SlangDiagno
request->setDiagnosticFlags(flags);
}
+
+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!! Blob Creation !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
+
+SLANG_EXTERN_C SLANG_API ISlangBlob* slang_createBlob(const void* data, size_t size)
+{
+ // Disallow empty blobs.
+ if (!data || size == 0)
+ return nullptr;
+
+ Slang::ComPtr<ISlangBlob> blob = Slang::RawBlob::create(data, size);
+ if (!blob)
+ return nullptr;
+
+ return blob.detach();
+}
+
+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!! Module Loading !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
+
+SLANG_EXTERN_C SLANG_API slang::IModule* slang_loadModuleFromSource(
+ slang::ISession* session,
+ const char* moduleName,
+ const char* path,
+ const char* source,
+ size_t sourceSize,
+ ISlangBlob** outDiagnostics)
+{
+ if (!session || !moduleName || !path || !source || sourceSize == 0)
+ return nullptr;
+
+ // Create a blob from the source data using the slang_createBlob function.
+ Slang::ComPtr<ISlangBlob> sourceBlob;
+ sourceBlob = slang_createBlob(source, sourceSize);
+ if (!sourceBlob)
+ return nullptr;
+
+ // Load the module using the existing blob-based API.
+ return session->loadModuleFromSource(moduleName, path, sourceBlob, outDiagnostics);
+}
+
+SLANG_EXTERN_C SLANG_API slang::IModule* slang_loadModuleFromIRBlob(
+ slang::ISession* session,
+ const char* moduleName,
+ const char* path,
+ const void* source,
+ size_t sourceSize,
+ ISlangBlob** outDiagnostics)
+{
+ if (!session || !moduleName || !path || !source || sourceSize == 0)
+ return nullptr;
+
+ // Create a blob from the source data using the slang_createBlob function.
+ Slang::ComPtr<ISlangBlob> sourceBlob;
+ sourceBlob = slang_createBlob(source, sourceSize);
+ if (!sourceBlob)
+ return nullptr;
+
+ // Load the module using the existing IR blob-based API.
+ return session->loadModuleFromIRBlob(moduleName, path, sourceBlob, outDiagnostics);
+}
+
+SLANG_EXTERN_C SLANG_API SlangResult slang_loadModuleInfoFromIRBlob(
+ slang::ISession* session,
+ const void* source,
+ size_t sourceSize,
+ SlangInt& outModuleVersion,
+ const char*& outModuleCompilerVersion,
+ const char*& outModuleName)
+{
+ if (!session || !source || sourceSize == 0)
+ return SLANG_E_INVALID_ARG;
+
+ // Create a blob from the source data using the slang_createBlob function.
+ Slang::ComPtr<ISlangBlob> sourceBlob;
+ sourceBlob = slang_createBlob(source, sourceSize);
+ if (!sourceBlob)
+ return SLANG_E_INVALID_ARG;
+
+ // Load module info using the existing IR blob-based API.
+ return session->loadModuleInfoFromIRBlob(
+ sourceBlob,
+ outModuleVersion,
+ outModuleCompilerVersion,
+ outModuleName);
+}