summaryrefslogtreecommitdiff
path: root/source/core/slang-lz4-compression-system.cpp
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2021-01-11 15:24:11 -0500
committerGitHub <noreply@github.com>2021-01-11 15:24:11 -0500
commit723796a0a0fed8e5b8c3222b1c90443189113098 (patch)
tree41fa039f2f2fcec4c24746203ad119a8054f021a /source/core/slang-lz4-compression-system.cpp
parent5554777188225266e2295db3588f6cb17cae0c4d (diff)
LZ4 compression support (#1654)
* #include an absolute path didn't work - because paths were taken to always be relative. * Testing out use of lz4. * Added ICompressionSystem, and LZ4 implementation. * Add support for deflate compression. Simplify compression interface - to make more easily work across apis. * WIP on CompressedFileSystem. * ImplicitDirectoryCollector * SubStringIndexMap - > StringSliceIndexMap. * WIP save stdlib in different containers. * Support for different archive types for stdlib. * Fix project. * CompressedFileSystem -> ArchiveFileSystem. Added CompressionSystemType::None * Added ArchiveFileSystem * Fix problem RiffFileSystem load withoug compression system. * Test archive types. Improve diagnostic message. * Fix typo in testing file system archives. * Split out archive detection. * Fix gcc warning issue. * Fix warning. * RiffArchiveFileSystem -> RiffFileSystem Co-authored-by: Tim Foley <tfoleyNV@users.noreply.github.com>
Diffstat (limited to 'source/core/slang-lz4-compression-system.cpp')
-rw-r--r--source/core/slang-lz4-compression-system.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/source/core/slang-lz4-compression-system.cpp b/source/core/slang-lz4-compression-system.cpp
new file mode 100644
index 000000000..fa5c5f5ab
--- /dev/null
+++ b/source/core/slang-lz4-compression-system.cpp
@@ -0,0 +1,71 @@
+#include "slang-lz4-compression-system.h"
+
+#include "../../slang-com-helper.h"
+#include "../../slang-com-ptr.h"
+
+#include "slang-blob.h"
+
+#include "../../external/lz4/lib/lz4.h"
+
+namespace Slang
+{
+
+// Allocate static const storage for the various interface IDs that the Slang API needs to expose
+static const Guid IID_ISlangUnknown = SLANG_UUID_ISlangUnknown;
+static const Guid IID_ICompressionSystem = SLANG_UUID_ICompressionSystem;
+
+class LZ4CompressionSystemImpl : public RefObject, public ICompressionSystem
+{
+public:
+ // ISlangUnknown
+ // override ref counting, as singleton
+ SLANG_IUNKNOWN_QUERY_INTERFACE
+ SLANG_NO_THROW uint32_t SLANG_MCALL addRef() SLANG_OVERRIDE { return 1; }
+ SLANG_NO_THROW uint32_t SLANG_MCALL release() SLANG_OVERRIDE { return 1; }
+
+ // ICompressionSystem
+ virtual SLANG_NO_THROW CompressionSystemType SLANG_MCALL getSystemType() SLANG_OVERRIDE { return CompressionSystemType::LZ4; }
+ virtual SLANG_NO_THROW SlangResult SLANG_MCALL compress(const CompressionStyle* style, const void* src, size_t srcSizeInBytes, ISlangBlob** outBlob) SLANG_OVERRIDE;
+ virtual SLANG_NO_THROW SlangResult SLANG_MCALL decompress(const void* compressed, size_t compressedSizeInBytes, size_t decompressedSizeInBytes, void* outDecompressed) SLANG_OVERRIDE;
+
+protected:
+
+ ICompressionSystem* getInterface(const Guid& guid);
+};
+
+ICompressionSystem* LZ4CompressionSystemImpl::getInterface(const Guid& guid)
+{
+ return (guid == IID_ISlangUnknown || guid == IID_ICompressionSystem) ? static_cast<ICompressionSystem*>(this) : nullptr;
+}
+
+SlangResult LZ4CompressionSystemImpl::compress(const CompressionStyle* style, const void* src, size_t srcSizeInBytes, ISlangBlob** outBlob)
+{
+ SLANG_UNUSED(style);
+ const size_t compressedBound = LZ4_compressBound(int(srcSizeInBytes));
+
+ ScopedAllocation alloc;
+ void* compressedData = alloc.allocate(compressedBound);
+
+ const int compressedSize = LZ4_compress_default((const char*)src, (char*)compressedData, int(srcSizeInBytes), int(compressedBound));
+ alloc.reallocate(compressedSize);
+
+ auto blob = RawBlob::moveCreate(alloc);
+
+ *outBlob = blob.detach();
+ return SLANG_OK;
+}
+
+SlangResult LZ4CompressionSystemImpl::decompress(const void* compressed, size_t compressedSizeInBytes, size_t decompressedSizeInBytes, void* outDecompressed)
+{
+ const int decompressedSize = LZ4_decompress_safe((const char*)compressed, (char*)outDecompressed, int(compressedSizeInBytes), int(decompressedSizeInBytes));
+ SLANG_ASSERT(size_t(decompressedSize) == decompressedSizeInBytes);
+ return SLANG_OK;
+}
+
+/* static */ICompressionSystem* LZ4CompressionSystem::getSingleton()
+{
+ static LZ4CompressionSystemImpl impl;
+ return &impl;
+}
+
+} // namespace Slang