summaryrefslogtreecommitdiffstats
path: root/source/slang/slang.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang.cpp')
-rw-r--r--source/slang/slang.cpp66
1 files changed, 49 insertions, 17 deletions
diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp
index eed172bbf..8d82ca1b7 100644
--- a/source/slang/slang.cpp
+++ b/source/slang/slang.cpp
@@ -23,6 +23,7 @@
#include "../core/slang-writer.h"
#include "../compiler-core/slang-source-loc.h"
+#include "../compiler-core/slang-struct-tag-converter.h"
#include "slang-ast-dump.h"
@@ -114,6 +115,32 @@ const char* getBuildTagString()
return SLANG_TAG_VERSION;
}
+static RefPtr<StructTagSystem> _createStructTagSystem()
+{
+ RefPtr<StructTagSystem> system = new StructTagSystem;
+
+ {
+#define SLANG_STRUCT_TAG_ADD_CATEGORY(x) system->addCategoryInfo(slang::StructTagCategory::x, #x);
+ SLANG_STRUCT_TAG_CATEGORIES(SLANG_STRUCT_TAG_ADD_CATEGORY)
+ }
+
+ {
+#define SLANG_STRUCT_TAG_ADD_TYPE(X) system->addType(slang::X::kStructTag, "slang::" #X, sizeof(slang::X));
+SLANG_TAGGED_STRUCTS(SLANG_STRUCT_TAG_ADD_TYPE)
+
+ // Add field that references more tagged structs
+ {
+ slang::SessionDesc desc;
+ auto field = StructTagTypeTraits::getFieldWithCount(&desc, &desc.targets, &desc.targetCount);
+
+ auto type = system->getType(slang::SessionDesc::kStructTag);
+ type->m_fields.add(field);
+ }
+ }
+
+ return system;
+}
+
void Session::init()
{
SLANG_ASSERT(BaseTypeInfo::check());
@@ -131,6 +158,8 @@ void Session::init()
m_sharedASTBuilder = new SharedASTBuilder;
m_sharedASTBuilder->init(this);
+ m_structTagSystem = _createStructTagSystem();
+
// Use to create a ASTBuilder
RefPtr<ASTBuilder> builtinAstBuilder(new ASTBuilder(m_sharedASTBuilder, "m_builtInLinkage::m_astBuilder"));
@@ -438,42 +467,45 @@ ISlangUnknown* Session::getInterface(const Guid& guid)
}
SLANG_NO_THROW SlangResult SLANG_MCALL Session::createSession(
- slang::SessionDesc const& desc,
+ slang::SessionDesc const& inDesc,
slang::ISession** outSession)
{
+ MemoryArena arena(1024);
+
+ LazyStructTagConverter converter(getStructTagSystem(), &arena, nullptr);
+
+ const slang::SessionDesc* desc = nullptr;
+ SLANG_RETURN_ON_FAIL(converter.convertToCurrent(&inDesc, &desc));
+
RefPtr<ASTBuilder> astBuilder(new ASTBuilder(m_sharedASTBuilder, "Session::astBuilder"));
RefPtr<Linkage> linkage = new Linkage(this, astBuilder, getBuiltinLinkage());
- Int targetCount = desc.targetCount;
- const uint8_t* targetDescPtr = reinterpret_cast<const uint8_t*>(desc.targets);
- for(Int ii = 0; ii < targetCount; ++ii)
{
- slang::TargetDesc targetDesc;
- // Copy the size field first.
- memcpy(&targetDesc.structureSize, targetDescPtr, sizeof(size_t));
- // Copy the entire desc structure.
- memcpy(&targetDesc, targetDescPtr, targetDesc.structureSize);
- linkage->addTarget(targetDesc);
- targetDescPtr += targetDesc.structureSize;
+ const Index targetCount = Index(desc->targetCount);
+ for(Index ii = 0; ii < targetCount; ++ii)
+ {
+ const auto& targetDesc = desc->targets[ii];
+ linkage->addTarget(targetDesc);
+ }
}
- if(desc.flags & slang::kSessionFlag_FalcorCustomSharedKeywordSemantics)
+ if(desc->flags & slang::kSessionFlag_FalcorCustomSharedKeywordSemantics)
{
linkage->m_useFalcorCustomSharedKeywordSemantics = true;
}
- linkage->setMatrixLayoutMode(desc.defaultMatrixLayoutMode);
+ linkage->setMatrixLayoutMode(desc->defaultMatrixLayoutMode);
- Int searchPathCount = desc.searchPathCount;
+ Int searchPathCount = desc->searchPathCount;
for(Int ii = 0; ii < searchPathCount; ++ii)
{
- linkage->addSearchPath(desc.searchPaths[ii]);
+ linkage->addSearchPath(desc->searchPaths[ii]);
}
- Int macroCount = desc.preprocessorMacroCount;
+ Int macroCount = desc->preprocessorMacroCount;
for(Int ii = 0; ii < macroCount; ++ii)
{
- auto& macro = desc.preprocessorMacros[ii];
+ auto& macro = desc->preprocessorMacros[ii];
linkage->addPreprocessorDefine(macro.name, macro.value);
}