summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-emit-cpp.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2020-09-02 12:21:28 -0700
committerGitHub <noreply@github.com>2020-09-02 12:21:28 -0700
commita2a7c4d988b2b7126130d9dcbe4ec94e1ce8424b (patch)
tree5e9559abd79b9e2f7d4f22f65a77daaaae3eed16 /source/slang/slang-emit-cpp.cpp
parent7f567df6937b33c653c424af3abb20d32eb80561 (diff)
Allow unspecialized existential shader parameters (dynamic dispatch). (#1529)
* Allow unspecialized existential shader parameters (dynamic dispatch). * Fixes. * Fixes * disable cuda test
Diffstat (limited to 'source/slang/slang-emit-cpp.cpp')
-rw-r--r--source/slang/slang-emit-cpp.cpp19
1 files changed, 12 insertions, 7 deletions
diff --git a/source/slang/slang-emit-cpp.cpp b/source/slang/slang-emit-cpp.cpp
index 1f40a2640..d22b202f5 100644
--- a/source/slang/slang-emit-cpp.cpp
+++ b/source/slang/slang-emit-cpp.cpp
@@ -1615,12 +1615,12 @@ void CPPSourceEmitter::emitWitnessTable(IRWitnessTable* witnessTable)
auto witnessTableItems = witnessTable->getChildren();
_maybeEmitWitnessTableTypeDefinition(interfaceType);
- // Define a global variable for the witness table.
- m_writer->emit("extern \"C\" ");
+ // Declare a global variable for the witness table.
+ m_writer->emit("extern \"C\" { SLANG_PRELUDE_SHARED_LIB_EXPORT extern ");
emitSimpleType(interfaceType);
m_writer->emit(" ");
m_writer->emit(getName(witnessTable));
- m_writer->emit(";\n");
+ m_writer->emit("; }\n");
// The actual definition of this witness table global variable
// is deferred until the entire `Context` class is emitted, so
@@ -1636,6 +1636,9 @@ void CPPSourceEmitter::_emitWitnessTableDefinitions()
{
auto interfaceType = cast<IRInterfaceType>(witnessTable->getOperand(0));
List<IRWitnessTableEntry*> sortedWitnessTableEntries = getSortedWitnessTableEntries(witnessTable);
+ m_writer->emit("extern \"C\"\n{\n");
+ m_writer->indent();
+ m_writer->emit("SLANG_PRELUDE_SHARED_LIB_EXPORT\n");
emitSimpleType(interfaceType);
m_writer->emit(" ");
m_writer->emit(getName(witnessTable));
@@ -1679,6 +1682,8 @@ void CPPSourceEmitter::_emitWitnessTableDefinitions()
}
m_writer->dedent();
m_writer->emit("\n};\n");
+ m_writer->dedent();
+ m_writer->emit("\n}\n");
}
}
@@ -1698,18 +1703,18 @@ void CPPSourceEmitter::emitInterface(IRInterfaceType* interfaceType)
void CPPSourceEmitter::emitRTTIObject(IRRTTIObject* rttiObject)
{
// Declare the type info object as `extern "C"` first.
- m_writer->emit("extern \"C\" TypeInfo ");
+ m_writer->emit("extern \"C\"{ SLANG_PRELUDE_SHARED_LIB_EXPORT extern TypeInfo ");
m_writer->emit(getName(rttiObject));
- m_writer->emit(";\n");
+ m_writer->emit("; }\n");
// Now actually define the object.
- m_writer->emit("TypeInfo ");
+ m_writer->emit("extern \"C\" { SLANG_PRELUDE_SHARED_LIB_EXPORT TypeInfo ");
m_writer->emit(getName(rttiObject));
m_writer->emit(" = {");
auto typeSizeDecoration = rttiObject->findDecoration<IRRTTITypeSizeDecoration>();
SLANG_ASSERT(typeSizeDecoration);
m_writer->emit(typeSizeDecoration->getTypeSize());
- m_writer->emit("};\n");
+ m_writer->emit("}; }\n");
}