summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-emit-cpp.cpp
diff options
context:
space:
mode:
authorTim Foley <tfoleyNV@users.noreply.github.com>2020-06-18 13:40:08 -0700
committerGitHub <noreply@github.com>2020-06-18 13:40:08 -0700
commit82ba914db9c3823ad7a0834d46b7fccedfe0acee (patch)
treea2361c042e6a03ff957bd4a921f73efbb89dc1b7 /source/slang/slang-emit-cpp.cpp
parent8c6e02bd094bbc0c9afb141265be9675f99ddb61 (diff)
parent5952e3b3d7f505a7e6d71ecd0793911224f5bac3 (diff)
Merge branch 'master' into dyndispatch
Diffstat (limited to 'source/slang/slang-emit-cpp.cpp')
-rw-r--r--source/slang/slang-emit-cpp.cpp48
1 files changed, 34 insertions, 14 deletions
diff --git a/source/slang/slang-emit-cpp.cpp b/source/slang/slang-emit-cpp.cpp
index cf6a5af49..accb290fa 100644
--- a/source/slang/slang-emit-cpp.cpp
+++ b/source/slang/slang-emit-cpp.cpp
@@ -1707,7 +1707,8 @@ void CPPSourceEmitter::_emitWitnessTableDefinitions()
m_writer->emit(",\n");
else
isFirstEntry = false;
- m_writer->emit("&Context::");
+
+ m_writer->emit("&KernelContext::");
m_writer->emit(_getWitnessTableWrapperFuncName(funcVal));
}
else
@@ -1755,7 +1756,7 @@ void CPPSourceEmitter::_maybeEmitWitnessTableTypeDefinition(
else
isFirstEntry = false;
emitType(funcVal->getResultType());
- m_writer->emit(" (Context::*");
+ m_writer->emit(" (KernelContext::*");
m_writer->emit(getName(entry->requirementKey.get()));
m_writer->emit(")");
m_writer->emit("(");
@@ -1843,7 +1844,7 @@ void CPPSourceEmitter::emitEntryPointAttributesImpl(IRFunc* irFunc, IREntryPoint
SLANG_UNUSED(entryPointDecor);
auto profile = m_effectiveProfile;
- auto stage = profile.GetStage();
+ auto stage = profile.getStage();
switch (stage)
{
@@ -2270,6 +2271,20 @@ void CPPSourceEmitter::emitPreprocessorDirectivesImpl()
writer->emit("\n");
+
+ if (m_target == CodeGenTarget::CPPSource)
+ {
+ // Put all into an anonymous namespace
+ // This includes any generated types, and generated intrinsics
+
+ m_writer->emit("namespace { // anonymous \n\n");
+ m_writer->emit("#ifdef SLANG_PRELUDE_NAMESPACE\n");
+ m_writer->emit("using namespace SLANG_PRELUDE_NAMESPACE;\n");
+ m_writer->emit("#endif\n\n");
+
+ m_writer->emit("struct KernelContext;\n\n");
+ }
+
if (m_target == CodeGenTarget::CSource)
{
// For C output we need to emit type definitions.
@@ -2305,7 +2320,6 @@ void CPPSourceEmitter::emitPreprocessorDirectivesImpl()
{
_maybeEmitSpecializedOperationDefinition(intrinsic);
}
-
}
}
@@ -2429,14 +2443,14 @@ void CPPSourceEmitter::_emitEntryPointDefinitionStart(IRFunc* func, IRGlobalPara
m_writer->emit("(");
m_writer->emit(varyingTypeName);
- m_writer->emit("* varyingInput, UniformEntryPointParams* params, UniformState* uniformState)");
+ m_writer->emit("* varyingInput, void* params, void* uniformState)");
emitSemantics(func);
m_writer->emit("\n{\n");
m_writer->indent();
// Initialize when constructing so that globals are zeroed
- m_writer->emit("Context context = {};\n");
- m_writer->emit("context.uniformState = uniformState;\n");
+ m_writer->emit("KernelContext context = {};\n");
+ m_writer->emit("context.uniformState = (UniformState*)uniformState;\n");
if (entryPointGlobalParams)
{
@@ -2726,11 +2740,11 @@ void CPPSourceEmitter::emitModuleImpl(IRModule* module)
List<EmitAction> actions;
computeEmitActions(module, actions);
-
+
_emitForwardDeclarations(actions);
IRGlobalParam* entryPointGlobalParams = nullptr;
-
+
// Output the global parameters in a 'UniformState' structure
{
m_writer->emit("struct UniformState\n{\n");
@@ -2741,15 +2755,14 @@ void CPPSourceEmitter::emitModuleImpl(IRModule* module)
m_writer->dedent();
m_writer->emit("\n};\n\n");
}
-
+
// Output the 'Context' which will be used for execution
{
- m_writer->emit("struct Context\n{\n");
+ m_writer->emit("struct KernelContext\n{\n");
m_writer->indent();
m_writer->emit("UniformState* uniformState;\n");
-
m_writer->emit("uint3 dispatchThreadID;\n");
//if (m_semanticUsedFlags & SemanticUsedFlag::GroupID)
@@ -2800,12 +2813,19 @@ void CPPSourceEmitter::emitModuleImpl(IRModule* module)
_emitWitnessTableWrappers();
m_writer->dedent();
- m_writer->emit("};\n\n");
+ m_writer->emit("};\n\n");
}
// Emit all witness table definitions.
_emitWitnessTableDefinitions();
+ if (m_target == CodeGenTarget::CPPSource)
+ {
+ // Need to close the anonymous namespace when outputting for C++
+
+ m_writer->emit("} // anonymous\n\n");
+ }
+
// Finally we need to output dll entry points
for (auto action : actions)
@@ -2816,7 +2836,7 @@ void CPPSourceEmitter::emitModuleImpl(IRModule* module)
IREntryPointDecoration* entryPointDecor = func->findDecoration<IREntryPointDecoration>();
- if (entryPointDecor && entryPointDecor->getProfile().GetStage() == Stage::Compute)
+ if (entryPointDecor && entryPointDecor->getProfile().getStage() == Stage::Compute)
{
// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/sv-dispatchthreadid
// SV_DispatchThreadID is the sum of SV_GroupID * numthreads and GroupThreadID.