summaryrefslogtreecommitdiff
path: root/source/slang
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2022-08-11 11:55:49 -0400
committerGitHub <noreply@github.com>2022-08-11 11:55:49 -0400
commitb5d84f60d36b81c7e8263048dda031a9be14a106 (patch)
tree8b64722cd66a7928942c84ca8c17a27459df17e4 /source/slang
parenta083a37ee58dc48d92cf2b844466a295eb3e643e (diff)
Artifact closer to being able to replace CompileResult (#2354)
* #include an absolute path didn't work - because paths were taken to always be relative. * WIP with hierarchical enums. * Some small fixes and improvements around artifact desc related types. * Improvements around hierarchical enum. * Fixes to get Artifact types refactor to be able to execute tests. * Attempt to better categorize PTX. * Work around for potentially unused function warning. * Typo fix. * Simplify Artifact header. * Small improvements around Artifact kind/payload/style. * Added IDestroyable/ICastable * Add IArtifactList. * First impl of IArtifactUtil. * Use the ICastable interface for IArtifactRepresentation. * Added IArtifactRepresentation & IArtifactAssociated. * Add SLANG_OVERRIDE to avoid gcc/clang warning. * Fix calling convention issue on win32. * Fix missing SLANG_OVERRIDE. * First attempt at file abstraction around Artifact. * Added creation of lock file. * Move functionality for determining file paths to the IArtifactUtil. Add casting to ICastable. * Added some casting/finding mechanisms. * Simplify IArtifact interface, and use Items for file reps. * Fix problem with libraries on DXIL. * Split out ArtifactRepresentation. * Move ArtifactDesc functionality to ArtifactDescUtil. ArtifactInfoUtil becomes ArtifactDescUtil. * Split implementations from the interfaces for Artifact. * Use TypeTextUtil for target name outputting. * Add artifact impls. * Add ICastableList * Added UnknownCastableAdapter * Make ISlangSharedLibrary derive from ICastable, and remain backwards compatible with slang-llvm. * Refactor Representation on Artifact. * Make our ISlangBlobs also derive from ICastable. Make ISlangBlob atomic ref counted. * Split out CastableList and related types, and placed in core. * Small fixes around IArtifact. Improve IArtifact docs. First impl of getChildren for IArtifact. * Documentation improvements for Artifact related types. * Fix typo. * Special case adding a ICastableList to a LazyCastableList. * Small simplification of LazyCastableList, by adding State member. * Removed the ILockFile interface because IFileArtifactRepresentation can be used. * Implement DiagnosticsArtifactRepresentation. * Added PostEmitMetadataArtifactRepresentation * Add searching by predicate. Added handling of accessing Artifact as ISharedLibrary * Fix typo. * Add find to IArtifacgtList. Fix some missing SLANG_NO_THROW. * Small improvements around ArtifactDesc types. * Another small change around ArtifactKind. * Some more shuffling of ArtifactDesc. * Make IArtifact castable Remove IArtifactList Made IArtifactContainer derive from IArtifact Made ModuleLibrary atomic ref counted/given IModuleLibrary interface. * Must call _requireChildren before any children access. * Fix missing SLANG_MCALL on castAs. * Fix missing SLANG_OVERRIDE. * Added IArtifactHandler * Use ICastable for basis of scope/lookup.
Diffstat (limited to 'source/slang')
-rw-r--r--source/slang/slang-compiler.cpp2
-rwxr-xr-xsource/slang/slang-compiler.h71
-rw-r--r--source/slang/slang-module-library.cpp22
-rw-r--r--source/slang/slang-module-library.h13
-rw-r--r--source/slang/slang-options.cpp2
-rw-r--r--source/slang/slang.cpp17
6 files changed, 37 insertions, 90 deletions
diff --git a/source/slang/slang-compiler.cpp b/source/slang/slang-compiler.cpp
index 17785bdc6..80015440a 100644
--- a/source/slang/slang-compiler.cpp
+++ b/source/slang/slang-compiler.cpp
@@ -1366,7 +1366,7 @@ namespace Slang
options.libraryPaths.add(Path::getParentDirectory(Path::getExecutablePath()));
// Set up the library artifact
- ComPtr<IArtifact> artifact(new Artifact(ArtifactDesc::make(ArtifactKind::Library, Artifact::Payload::HostCPU), "slang-rt"));
+ auto artifact = Artifact::create(ArtifactDesc::make(ArtifactKind::Library, Artifact::Payload::HostCPU), "slang-rt");
ComPtr<IFileArtifactRepresentation> fileRep(new FileArtifactRepresentation(IFileArtifactRepresentation::Kind::NameOnly, "slang-rt", nullptr, nullptr));
artifact->addRepresentation(fileRep);
diff --git a/source/slang/slang-compiler.h b/source/slang/slang-compiler.h
index fd338361e..56e161483 100755
--- a/source/slang/slang-compiler.h
+++ b/source/slang/slang-compiler.h
@@ -25,6 +25,8 @@
#include "slang-serialize-ir-types.h"
+#include "../compiler-core/slang-artifact-representation-impl.h"
+
#include "../../slang.h"
namespace Slang
@@ -142,75 +144,6 @@ namespace Slang
class Module;
class TranslationUnitRequest;
- struct ShaderBindingRange
- {
- slang::ParameterCategory category = slang::ParameterCategory::None;
- UInt spaceIndex = 0;
- UInt registerIndex = 0;
- UInt registerCount = 0; // 0 for unsized
-
- bool isInfinite() const
- {
- return registerCount == 0;
- }
-
- bool containsBinding(slang::ParameterCategory _category, UInt _spaceIndex, UInt _registerIndex) const
- {
- return category == _category
- && spaceIndex == _spaceIndex
- && registerIndex <= _registerIndex
- && (isInfinite() || registerCount + registerIndex > _registerIndex);
- }
-
- bool intersectsWith(const ShaderBindingRange& other) const
- {
- if (category != other.category || spaceIndex != other.spaceIndex)
- return false;
-
- const bool leftIntersection = (registerIndex < other.registerIndex + other.registerCount) || other.isInfinite();
- const bool rightIntersection = (other.registerIndex < registerIndex + registerCount) || isInfinite();
-
- return leftIntersection && rightIntersection;
- }
-
- bool adjacentTo(const ShaderBindingRange& other) const
- {
- if (category != other.category || spaceIndex != other.spaceIndex)
- return false;
-
- const bool leftIntersection = (registerIndex <= other.registerIndex + other.registerCount) || other.isInfinite();
- const bool rightIntersection = (other.registerIndex <= registerIndex + registerCount) || isInfinite();
-
- return leftIntersection && rightIntersection;
- }
-
- void mergeWith(const ShaderBindingRange other)
- {
- UInt newRegisterIndex = Math::Min(registerIndex, other.registerIndex);
-
- if (other.isInfinite())
- registerCount = 0;
- else if (!isInfinite())
- registerCount = Math::Max(registerIndex + registerCount, other.registerIndex + other.registerCount) - newRegisterIndex;
-
- registerIndex = newRegisterIndex;
- }
-
- static bool isUsageTracked(slang::ParameterCategory category)
- {
- switch(category)
- {
- case slang::ConstantBuffer:
- case slang::ShaderResource:
- case slang::UnorderedAccess:
- case slang::SamplerState:
- return true;
- default:
- return false;
- }
- }
- };
-
struct PostEmitMetadata : public RefObject
{
List<ShaderBindingRange> usedBindings;
diff --git a/source/slang/slang-module-library.cpp b/source/slang/slang-module-library.cpp
index 75450d7b3..b7290008b 100644
--- a/source/slang/slang-module-library.cpp
+++ b/source/slang/slang-module-library.cpp
@@ -15,9 +15,12 @@ namespace Slang {
void* ModuleLibrary::getInterface(const Guid& uuid)
{
- if (uuid == ISlangUnknown::getTypeGuid() || uuid == ICastable::getTypeGuid() || uuid == IArtifactRepresentation::getTypeGuid())
+ if (uuid == ISlangUnknown::getTypeGuid() ||
+ uuid == ICastable::getTypeGuid() ||
+ uuid == IArtifactRepresentation::getTypeGuid() ||
+ uuid == IModuleLibrary::getTypeGuid())
{
- return static_cast<IArtifactRepresentation*>(this);
+ return static_cast<IModuleLibrary*>(this);
}
return nullptr;
}
@@ -36,9 +39,10 @@ void* ModuleLibrary::castAs(const Guid& guid)
return getObject(guid);
}
-SlangResult loadModuleLibrary(const Byte* inBytes, size_t bytesCount, EndToEndCompileRequest* req, RefPtr<ModuleLibrary>& outLibrary)
+SlangResult loadModuleLibrary(const Byte* inBytes, size_t bytesCount, EndToEndCompileRequest* req, ComPtr<IModuleLibrary>& outLibrary)
{
- RefPtr<ModuleLibrary> library = new ModuleLibrary;
+ auto library = new ModuleLibrary;
+ ComPtr<IModuleLibrary> scopeLibrary(library);
// Load up the module
MemoryStreamBase memoryStream(FileAccess::Read, inBytes, bytesCount);
@@ -85,13 +89,13 @@ SlangResult loadModuleLibrary(const Byte* inBytes, size_t bytesCount, EndToEndCo
}
}
- outLibrary = library;
+ outLibrary.swap(scopeLibrary);
return SLANG_OK;
}
-SlangResult loadModuleLibrary(ArtifactKeep keep, IArtifact* artifact, EndToEndCompileRequest* req, RefPtr<ModuleLibrary>& outLibrary)
+SlangResult loadModuleLibrary(ArtifactKeep keep, IArtifact* artifact, EndToEndCompileRequest* req, ComPtr<IModuleLibrary>& outLibrary)
{
- if (auto foundLibrary = findRepresentation<ModuleLibrary>(artifact))
+ if (auto foundLibrary = findRepresentation<IModuleLibrary>(artifact))
{
outLibrary = foundLibrary;
return SLANG_OK;
@@ -102,7 +106,7 @@ SlangResult loadModuleLibrary(ArtifactKeep keep, IArtifact* artifact, EndToEndCo
SLANG_RETURN_ON_FAIL(artifact->loadBlob(getIntermediateKeep(keep), blob.writeRef()));
// Load the module
- RefPtr<ModuleLibrary> library;
+ ComPtr<IModuleLibrary> library;
SLANG_RETURN_ON_FAIL(loadModuleLibrary((const Byte*)blob->getBufferPointer(), blob->getBufferSize(), req, library));
if (canKeep(keep))
@@ -110,7 +114,7 @@ SlangResult loadModuleLibrary(ArtifactKeep keep, IArtifact* artifact, EndToEndCo
artifact->addRepresentation(library);
}
- outLibrary = library;
+ outLibrary.swap(library);
return SLANG_OK;
}
diff --git a/source/slang/slang-module-library.h b/source/slang/slang-module-library.h
index 40e655e85..dd74193a4 100644
--- a/source/slang/slang-module-library.h
+++ b/source/slang/slang-module-library.h
@@ -9,11 +9,16 @@
namespace Slang
{
+class IModuleLibrary : public IArtifactRepresentation
+{
+ SLANG_COM_INTERFACE(0x8f630911, 0xea96, 0x4075, { 0xbf, 0x6b, 0xd2, 0xae, 0x96, 0xbe, 0xb6, 0xde });
+};
+
// Class to hold information serialized in from a -r slang-lib/slang-module
-class ModuleLibrary : public ComObject, public IArtifactRepresentation
+class ModuleLibrary : public ComBaseObject, public IModuleLibrary
{
public:
- SLANG_COM_OBJECT_IUNKNOWN_ALL
+ SLANG_COM_BASE_IUNKNOWN_ALL
SLANG_CLASS_GUID(0x2f7412bd, 0x6154, 0x40a9, { 0x89, 0xb3, 0x62, 0xe0, 0x24, 0x17, 0x24, 0xa1 });
@@ -31,10 +36,10 @@ public:
void* getObject(const Guid& uuid);
};
-SlangResult loadModuleLibrary(const Byte* inBytes, size_t bytesCount, EndToEndCompileRequest* req, RefPtr<ModuleLibrary>& module);
+SlangResult loadModuleLibrary(const Byte* inBytes, size_t bytesCount, EndToEndCompileRequest* req, ComPtr<IModuleLibrary>& outModule);
// Given a product make available as a module
-SlangResult loadModuleLibrary(ArtifactKeep keep, IArtifact* artifact, EndToEndCompileRequest* req, RefPtr<ModuleLibrary>& module);
+SlangResult loadModuleLibrary(ArtifactKeep keep, IArtifact* artifact, EndToEndCompileRequest* req, ComPtr<IModuleLibrary>& outModule);
} // namespace Slang
diff --git a/source/slang/slang-options.cpp b/source/slang/slang-options.cpp
index 6351ffbd4..c40e5d16c 100644
--- a/source/slang/slang-options.cpp
+++ b/source/slang/slang-options.cpp
@@ -1484,7 +1484,7 @@ struct OptionsParser
const String name = ArtifactDescUtil::getBaseNameFromPath(desc, path.getUnownedSlice());
// Create the artifact
- ComPtr<IArtifact> artifact(new Artifact(desc, name));
+ auto artifact = Artifact::create(desc, name);
// There is a problem here if I want to reference a library that is a 'system' library or is not directly a file
// In that case the path shouldn't be set and the name should completely define the library.
diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp
index 684b0660d..c0c7c4f5a 100644
--- a/source/slang/slang.cpp
+++ b/source/slang/slang.cpp
@@ -4485,9 +4485,15 @@ SlangResult _addLibraryReference(EndToEndCompileRequest* req, IArtifact* artifac
if (desc.kind == ArtifactKind::Library && desc.payload == ArtifactPayload::SlangIR)
{
- RefPtr<ModuleLibrary> library;
+ ComPtr<IModuleLibrary> libraryIntf;
- SLANG_RETURN_ON_FAIL(loadModuleLibrary(ArtifactKeep::Yes, artifact, req, library));
+ SLANG_RETURN_ON_FAIL(loadModuleLibrary(ArtifactKeep::Yes, artifact, req, libraryIntf));
+
+ auto library = as<ModuleLibrary>(libraryIntf);
+ if (!library)
+ {
+ return SLANG_FAIL;
+ }
FrontEndCompileRequest* frontEndRequest = req->getFrontEndReq();
frontEndRequest->m_extraEntryPoints.addRange(library->m_entryPoints.getBuffer(), library->m_entryPoints.getCount());
@@ -4508,13 +4514,12 @@ SlangResult _addLibraryReference(EndToEndCompileRequest* req, IArtifact* artifac
SlangResult EndToEndCompileRequest::addLibraryReference(const void* libData, size_t libDataSize)
{
// We need to deserialize and add the modules
- RefPtr<ModuleLibrary> library;
- SLANG_RETURN_ON_FAIL(loadModuleLibrary((const Byte*)libData, libDataSize, this, library));
+ ComPtr<IModuleLibrary> library;
- const auto desc = ArtifactDesc::make(ArtifactKind::Library, ArtifactPayload::SlangIR);
+ SLANG_RETURN_ON_FAIL(loadModuleLibrary((const Byte*)libData, libDataSize, this, library));
// Create an artifact without any name (as one is not provided)
- ComPtr<IArtifact> artifact(new Artifact(desc, String()));
+ auto artifact = Artifact::create(ArtifactDesc::make(ArtifactKind::Library, ArtifactPayload::SlangIR));
artifact->addRepresentation(library);
return _addLibraryReference(this, artifact);