diff options
Diffstat (limited to 'source/slang/slang-emit.cpp')
| -rw-r--r-- | source/slang/slang-emit.cpp | 57 |
1 files changed, 42 insertions, 15 deletions
diff --git a/source/slang/slang-emit.cpp b/source/slang/slang-emit.cpp index f3e78e48f..43f9da3df 100644 --- a/source/slang/slang-emit.cpp +++ b/source/slang/slang-emit.cpp @@ -69,6 +69,8 @@ #include "slang-emit-cuda.h" #include "../compiler-core/slang-artifact-desc-util.h" +#include "../compiler-core/slang-artifact-util.h" +#include "../compiler-core/slang-artifact-impl.h" #include <assert.h> @@ -834,17 +836,20 @@ Result linkAndOptimizeIR( #endif validateIRModuleIfEnabled(codeGenContext, irModule); - outLinkedIR.metadata = new PostEmitMetadata(); - collectMetadata(irModule, *outLinkedIR.metadata); + auto metadata = Artifact::create(ArtifactDesc::make(ArtifactKind::Instance, ArtifactPayload::PostEmitMetadata, artifactDesc.style)); + auto postEmitMetaRep = new PostEmitMetadataArtifactRepresentation; + metadata->addRepresentation(postEmitMetaRep); + + collectMetadata(irModule, postEmitMetaRep->m_metadata); + + outLinkedIR.metadata = metadata; return SLANG_OK; } -SlangResult CodeGenContext::emitEntryPointsSourceFromIR( - String& outSource, - RefPtr<PostEmitMetadata>& outMetadata) +SlangResult CodeGenContext::emitEntryPointsSourceFromIR(ComPtr<IArtifact>& outArtifact) { - outSource = String(); + outArtifact.setNull(); auto session = getSession(); auto sink = getSink(); @@ -852,6 +857,8 @@ SlangResult CodeGenContext::emitEntryPointsSourceFromIR( auto target = getTargetFormat(); auto targetRequest = getTargetReq(); + auto artifactContainer = ArtifactUtil::createResultsContainer(); + auto lineDirectiveMode = targetRequest->getLineDirectiveMode(); // To try to make the default behavior reasonable, we will // always use C-style line directives (to give the user @@ -923,6 +930,7 @@ SlangResult CodeGenContext::emitEntryPointsSourceFromIR( SLANG_RETURN_ON_FAIL(sourceEmitter->init()); + { LinkingAndOptimizationOptions linkingAndOptimizationOptions; @@ -947,8 +955,11 @@ SlangResult CodeGenContext::emitEntryPointsSourceFromIR( auto irModule = linkedIR.module; - outMetadata = linkedIR.metadata; - + if (linkedIR.metadata) + { + artifactContainer->addChild(linkedIR.metadata); + } + // After all of the required optimization and legalization // passes have been performed, we can emit target code from // the IR module. @@ -1017,7 +1028,13 @@ SlangResult CodeGenContext::emitEntryPointsSourceFromIR( finalResult.append(code); // Write out the result - outSource = finalResult; + + auto targetArtifact = ArtifactUtil::createArtifactForCompileTarget(asExternal(target)); + targetArtifact->addRepresentationUnknown(StringBlob::moveCreate(finalResult)); + + artifactContainer->addChild(targetArtifact); + + outArtifact = artifactContainer; return SLANG_OK; } @@ -1029,9 +1046,10 @@ SlangResult emitSPIRVFromIR( SlangResult emitSPIRVForEntryPointsDirectly( CodeGenContext* codeGenContext, - List<uint8_t>& spirvOut, - RefPtr<PostEmitMetadata>& outMetadata) + ComPtr<IArtifact>& outArtifact) { + auto artifactContainer = ArtifactUtil::createResultsContainer(); + // Outside because we want to keep IR in scope whilst we are processing emits LinkedIR linkedIR; LinkingAndOptimizationOptions linkingAndOptimizationOptions; @@ -1043,13 +1061,22 @@ SlangResult emitSPIRVForEntryPointsDirectly( auto irModule = linkedIR.module; auto irEntryPoints = linkedIR.entryPoints; - emitSPIRVFromIR(codeGenContext, irModule, irEntryPoints, spirvOut); + List<uint8_t> spirv; + emitSPIRVFromIR(codeGenContext, irModule, irEntryPoints, spirv); - outMetadata = linkedIR.metadata; + auto targetArtifact = ArtifactUtil::createArtifactForCompileTarget(asExternal(codeGenContext->getTargetFormat())); + targetArtifact->addRepresentationUnknown(ListBlob::moveCreate(spirv)); - return SLANG_OK; -} + artifactContainer->addChild(targetArtifact); + if (linkedIR.metadata) + { + artifactContainer->addChild(linkedIR.metadata); + } + + outArtifact = artifactContainer; + return SLANG_OK; +} } // namespace Slang |
