diff options
Diffstat (limited to 'source/slang/slang-emit-cpp.cpp')
| -rw-r--r-- | source/slang/slang-emit-cpp.cpp | 48 |
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. |
