summaryrefslogtreecommitdiff
path: root/source/compiler-core/slang-dxc-compiler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/compiler-core/slang-dxc-compiler.cpp')
-rw-r--r--source/compiler-core/slang-dxc-compiler.cpp51
1 files changed, 50 insertions, 1 deletions
diff --git a/source/compiler-core/slang-dxc-compiler.cpp b/source/compiler-core/slang-dxc-compiler.cpp
index c92eea47b..6619d000c 100644
--- a/source/compiler-core/slang-dxc-compiler.cpp
+++ b/source/compiler-core/slang-dxc-compiler.cpp
@@ -14,6 +14,8 @@
#include "../core/slang-semantic-version.h"
#include "../core/slang-char-util.h"
+#include "../core/slang-digest.h"
+
#include "slang-include-system.h"
#include "slang-source-loc.h"
@@ -168,6 +170,7 @@ public:
virtual SLANG_NO_THROW bool SLANG_MCALL canConvert(const ArtifactDesc& from, const ArtifactDesc& to) SLANG_OVERRIDE;
virtual SLANG_NO_THROW SlangResult SLANG_MCALL convert(IArtifact* from, const ArtifactDesc& to, IArtifact** outArtifact) SLANG_OVERRIDE;
virtual SLANG_NO_THROW bool SLANG_MCALL isFileBased() SLANG_OVERRIDE { return false; }
+ virtual SLANG_NO_THROW SlangResult SLANG_MCALL getVersionString(slang::IBlob** outVersionString) SLANG_OVERRIDE;
/// Must be called before use
SlangResult init(ISlangSharedLibrary* library);
@@ -191,7 +194,7 @@ SlangResult DXCDownstreamCompiler::init(ISlangSharedLibrary* library)
return SLANG_FAIL;
}
- m_desc = Desc(SLANG_PASS_THROUGH_DXC);
+ m_desc = Desc(SLANG_PASS_THROUGH_DXC);
return SLANG_OK;
}
@@ -572,6 +575,52 @@ SlangResult DXCDownstreamCompiler::convert(IArtifact* from, const ArtifactDesc&
return SLANG_OK;
}
+SlangResult DXCDownstreamCompiler::getVersionString(slang::IBlob** outVersionString)
+{
+ ComPtr<IDxcCompiler> dxcCompiler;
+ SLANG_RETURN_ON_FAIL(m_createInstance(CLSID_DxcCompiler, __uuidof(dxcCompiler), (LPVOID*)dxcCompiler.writeRef()));
+
+ ComPtr<ISlangBlob> version;
+ ComPtr<IDxcVersionInfo> versionInfo;
+ if (SLANG_SUCCEEDED(dxcCompiler->QueryInterface(versionInfo.writeRef())))
+ {
+ // Because the major/minor version alone does not necessarily capture different releases
+ // of the DX compiler, we also need to query for the commit hash. If we are unable to
+ // obtain the commit hash, then we return the shared library timestamp instead.
+ ComPtr<IDxcVersionInfo2> versionInfo2;
+ if (SLANG_SUCCEEDED(dxcCompiler->QueryInterface(versionInfo2.writeRef())))
+ {
+ uint32_t major;
+ uint32_t minor;
+ versionInfo->GetVersion(&major, &minor);
+
+ StringBuilder versionString;
+ versionString.append(major);
+ versionString.append(".");
+ versionString.append(minor);
+
+ char* commitHash;
+ uint32_t unused;
+ versionInfo2->GetCommitInfo(&unused, &commitHash);
+
+ versionString.append(commitHash);
+ CoTaskMemFree(commitHash);
+
+ version = StringBlob::create(versionString.getBuffer());
+ *outVersionString = version.detach();
+ return SLANG_OK;
+ }
+ }
+
+ // If either of the QueryInterface calls fails, we return the shared library timestamp
+ // as the version instead.
+ auto timestamp = SharedLibraryUtils::getSharedLibraryTimestamp(m_createInstance);
+ auto timestampString = String(timestamp);
+ version = StringBlob::create(timestampString.getBuffer());
+ *outVersionString = version.detach();
+ return SLANG_OK;
+}
+
/* static */SlangResult DXCDownstreamCompilerUtil::locateCompilers(const String& path, ISlangSharedLibraryLoader* loader, DownstreamCompilerSet* set)
{
ComPtr<ISlangSharedLibrary> library;