summaryrefslogtreecommitdiffstats
path: root/source/slang/slang.cpp
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2022-06-02 14:13:35 -0400
committerGitHub <noreply@github.com>2022-06-02 14:13:35 -0400
commitb39c99661b3ad482bbd419c24991ed325b5738a9 (patch)
tree0f90fecdae10e704b2c1135c48ca5eeafa60b780 /source/slang/slang.cpp
parentbc6bc56db51d06b92dc63ef9c9e0def6c9760c9e (diff)
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.
Diffstat (limited to 'source/slang/slang.cpp')
-rw-r--r--source/slang/slang.cpp22
1 files changed, 14 insertions, 8 deletions
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))
{