From b39c99661b3ad482bbd419c24991ed325b5738a9 Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Thu, 2 Jun 2022 14:13:35 -0400 Subject: COM interfaces with host callable (#2258) * #include an absolute path didn't work - because paths were taken to always be relative. * Use TerminatedUnownedStringSlice for literals in output C++. * Remove Escape/Unescape functions used in slang-token-reader.cpp Add target type of 'host-cpp' etc to map to the target types. * Fix some corner cases around string encoding. * Added unit test for string escaping. Fixed some assorted escaping bugs. * Updated test output. * Added decode test. * Stop using hex output, to get around 'greedy' aspect. Use octal instead. * Added HostHostCallable Small changes to use ArtifactDesc/Info instead of large switches. * Fix C++ emit to handle arbitrary function export. * Add options handling for callable without an output being specified. * Can compile with COM interface. Added example using com interface. * Use the IR Ptr type instead of hack in C++ emit for interfaces. * Fix issue with outputting the COM call when ptr is used. * Fix crash issue on compilation failure. --- source/slang/slang.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'source/slang/slang.cpp') diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp index 7b22d04de..9379f3b03 100644 --- a/source/slang/slang.cpp +++ b/source/slang/slang.cpp @@ -670,17 +670,17 @@ SlangPassThrough Session::getDownstreamCompilerForTransition(SlangCompileTarget return (SlangPassThrough)m_codeGenTransitionMap.getTransition(source, target); } + const auto desc = ArtifactDesc::makeFromCompileTarget(inTarget); + // Special case host-callable - if (target == CodeGenTarget::ShaderHostCallable) + if ((desc.kind == ArtifactKind::Callable) && + (source == CodeGenTarget::CSource || source == CodeGenTarget::CPPSource)) { - if (source == CodeGenTarget::CSource || source == CodeGenTarget::CPPSource) + // We prefer LLVM if it's available + DownstreamCompiler* llvm = getOrLoadDownstreamCompiler(PassThroughMode::LLVM, nullptr); + if (llvm) { - // We prefer LLVM if it's available - DownstreamCompiler* llvm = getOrLoadDownstreamCompiler(PassThroughMode::LLVM, nullptr); - if (llvm) - { - return SLANG_PASS_THROUGH_LLVM; - } + return SLANG_PASS_THROUGH_LLVM; } } @@ -1334,6 +1334,7 @@ CapabilitySet TargetRequest::getTargetCaps() case CodeGenTarget::CPPSource: case CodeGenTarget::HostExecutable: case CodeGenTarget::ShaderSharedLibrary: + case CodeGenTarget::HostHostCallable: case CodeGenTarget::ShaderHostCallable: atoms.add(CapabilityAtom::CPP); break; @@ -4711,6 +4712,11 @@ static SlangResult _getWholeProgramResult( auto linkage = req->getLinkage(); auto program = req->getSpecializedGlobalAndEntryPointsComponentType(); + if (!program) + { + return SLANG_FAIL; + } + Index targetCount = linkage->targets.getCount(); if ((targetIndex < 0) || (targetIndex >= targetCount)) { -- cgit v1.2.3