From 15055d20c143cb398bd3e269541eebf24777390a Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Mon, 22 Aug 2022 10:08:25 -0400 Subject: Replace DownstreamCompileResult with Artifact (#2369) * #include an absolute path didn't work - because paths were taken to always be relative. * WIP replacing DownstreamCompileResult. * First attempt at replacing DownstreamCompileResult with IArtifact and associated types. * Small renaming around CharSlice. * ICastable -> ISlangCastable Added IClonable Fix issue with cloning in ArtifactDiagnostics. * Only add the blob if one is defined in DXC. * Guard adding blob representation. * Make cloneInterface available across code base. Set enums backing type for ArtifactDiagnostic. * Added ::create for ArtifactDiagnostics. --- source/compiler-core/slang-glslang-compiler.cpp | 44 ++++++++++++++----------- 1 file changed, 25 insertions(+), 19 deletions(-) (limited to 'source/compiler-core/slang-glslang-compiler.cpp') diff --git a/source/compiler-core/slang-glslang-compiler.cpp b/source/compiler-core/slang-glslang-compiler.cpp index b4e3d915d..5ae9419fd 100644 --- a/source/compiler-core/slang-glslang-compiler.cpp +++ b/source/compiler-core/slang-glslang-compiler.cpp @@ -14,6 +14,8 @@ #include "../core/slang-semantic-version.h" #include "../core/slang-char-util.h" +#include "slang-artifact-associated-impl.h" + #include "slang-include-system.h" #include "slang-source-loc.h" @@ -40,7 +42,7 @@ public: typedef DownstreamCompilerBase Super; // IDownstreamCompiler - virtual SLANG_NO_THROW SlangResult SLANG_MCALL compile(const CompileOptions& options, RefPtr& outResult) SLANG_OVERRIDE; + virtual SLANG_NO_THROW SlangResult SLANG_MCALL compile(const CompileOptions& options, IArtifact** outResult) SLANG_OVERRIDE; virtual SLANG_NO_THROW SlangResult SLANG_MCALL disassemble(SlangCompileTarget sourceBlobTarget, const void* blob, size_t blobSize, ISlangBlob** out) SLANG_OVERRIDE; virtual SLANG_NO_THROW bool SLANG_MCALL isFileBased() SLANG_OVERRIDE { return false; } @@ -94,7 +96,7 @@ SlangResult GlslangDownstreamCompiler::_invoke(glslang_CompileRequest_1_1& reque return err ? SLANG_FAIL : SLANG_OK; } -static SlangResult _parseDiagnosticLine(const UnownedStringSlice& line, List& lineSlices, DownstreamDiagnostic& outDiagnostic) +static SlangResult _parseDiagnosticLine(CharSliceAllocator& allocator, const UnownedStringSlice& line, List& lineSlices, ArtifactDiagnostic& outDiagnostic) { /* ERROR: tests/diagnostics/syntax-error-intrinsic.slang:13: '@' : unexpected token */ @@ -105,23 +107,23 @@ static SlangResult _parseDiagnosticLine(const UnownedStringSlice& line, List& outResult) +SlangResult GlslangDownstreamCompiler::compile(const CompileOptions& options, IArtifact** outArtifact) { // This compiler doesn't read files, they should be read externally and stored in sourceContents/sourceContentsPath if (options.sourceFiles.getCount() > 0) @@ -187,27 +189,31 @@ SlangResult GlslangDownstreamCompiler::compile(const CompileOptions& options, Re const SlangResult invokeResult = _invoke(request); - DownstreamDiagnostics diagnostics; + auto artifact = ArtifactUtil::createArtifactForCompileTarget(options.targetType); + + auto diagnostics = ArtifactDiagnostics::create(); // Set the diagnostics result - diagnostics.result = invokeResult; + diagnostics->setResult(invokeResult); + artifact->addAssociated(diagnostics); if (SLANG_FAILED(invokeResult)) { - diagnostics.rawDiagnostics = diagnosticOutput; + diagnostics->setRaw(CharSliceCaster::asCharSlice(diagnosticOutput)); - SlangResult diagnosticParseRes = DownstreamDiagnostic::parseColonDelimitedDiagnostics(diagnosticOutput.getUnownedSlice(), 1, _parseDiagnosticLine, diagnostics.diagnostics); - SLANG_UNUSED(diagnosticParseRes); + CharSliceAllocator allocator; - diagnostics.requireErrorDiagnostic(); + SlangResult diagnosticParseRes = ArtifactDiagnosticUtil::parseColonDelimitedDiagnostics(allocator, diagnosticOutput.getUnownedSlice(), 1, _parseDiagnosticLine, diagnostics); + SLANG_UNUSED(diagnosticParseRes); - outResult = new BlobDownstreamCompileResult(diagnostics, nullptr); - return SLANG_OK; + diagnostics->requireErrorDiagnostic(); + } + else + { + artifact->addRepresentationUnknown(ListBlob::moveCreate(spirv)); } - ComPtr spirvBlob = ListBlob::moveCreate(spirv); - outResult = new BlobDownstreamCompileResult(diagnostics, spirvBlob); - + *outArtifact = artifact.detach(); return SLANG_OK; } -- cgit v1.2.3