summaryrefslogtreecommitdiff
path: root/source/compiler-core/slang-glslang-compiler.cpp
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2022-08-22 10:08:25 -0400
committerGitHub <noreply@github.com>2022-08-22 10:08:25 -0400
commit15055d20c143cb398bd3e269541eebf24777390a (patch)
tree81f96a53824765fabc1fbb81d2d588476996eaa9 /source/compiler-core/slang-glslang-compiler.cpp
parentaf70651a4843b16dd24e14b5cedffe399ebeb862 (diff)
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.
Diffstat (limited to 'source/compiler-core/slang-glslang-compiler.cpp')
-rw-r--r--source/compiler-core/slang-glslang-compiler.cpp44
1 files changed, 25 insertions, 19 deletions
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<DownstreamCompileResult>& 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<UnownedStringSlice>& lineSlices, DownstreamDiagnostic& outDiagnostic)
+static SlangResult _parseDiagnosticLine(CharSliceAllocator& allocator, const UnownedStringSlice& line, List<UnownedStringSlice>& lineSlices, ArtifactDiagnostic& outDiagnostic)
{
/* ERROR: tests/diagnostics/syntax-error-intrinsic.slang:13: '@' : unexpected token */
@@ -105,23 +107,23 @@ static SlangResult _parseDiagnosticLine(const UnownedStringSlice& line, List<Uno
{
const UnownedStringSlice severitySlice = lineSlices[0].trim();
- outDiagnostic.severity = DownstreamDiagnostic::Severity::Error;
+ outDiagnostic.severity = ArtifactDiagnostic::Severity::Error;
if (severitySlice.caseInsensitiveEquals(UnownedStringSlice::fromLiteral("warning")))
{
- outDiagnostic.severity = DownstreamDiagnostic::Severity::Warning;
+ outDiagnostic.severity = ArtifactDiagnostic::Severity::Warning;
}
}
- outDiagnostic.filePath = lineSlices[1];
+ outDiagnostic.filePath = allocator.allocate(lineSlices[1]);
- SLANG_RETURN_ON_FAIL(StringUtil::parseInt(lineSlices[2], outDiagnostic.fileLine));
- outDiagnostic.text = UnownedStringSlice(lineSlices[3].begin(), line.end());
+ SLANG_RETURN_ON_FAIL(StringUtil::parseInt(lineSlices[2], outDiagnostic.location.line));
+ outDiagnostic.text = allocator.allocate(lineSlices[3].begin(), line.end());
return SLANG_OK;
}
-SlangResult GlslangDownstreamCompiler::compile(const CompileOptions& options, RefPtr<DownstreamCompileResult>& 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<ISlangBlob> spirvBlob = ListBlob::moveCreate(spirv);
- outResult = new BlobDownstreamCompileResult(diagnostics, spirvBlob);
-
+ *outArtifact = artifact.detach();
return SLANG_OK;
}