diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2021-01-11 15:24:11 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-01-11 15:24:11 -0500 |
| commit | 723796a0a0fed8e5b8c3222b1c90443189113098 (patch) | |
| tree | 41fa039f2f2fcec4c24746203ad119a8054f021a /source/core/slang-lz4-compression-system.cpp | |
| parent | 5554777188225266e2295db3588f6cb17cae0c4d (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.cpp | 71 |
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 |
