diff --git a/modules/assets/private/shader.cpp b/modules/assets/private/shader.cpp index 53c3b1a..500c45d 100644 --- a/modules/assets/private/shader.cpp +++ b/modules/assets/private/shader.cpp @@ -10,10 +10,12 @@ ShaderAsset::ShaderAsset(const std::filesystem::path &path): m_stream(path) + sizeof(BlobMetadata); ensure(m_stream.is_open(), "Failed to open shader asset at: {}", path.string()); + const auto read = [this](auto &field) { + m_stream.read(std::bit_cast(&field), sizeof(field)); + }; m_stream.seekg(0, std::ifstream::end); const auto file_size = static_cast(m_stream.tellg()); - ensure( file_size > total_metadata_size, "Failed to open shader asset at: {}, file smaller than metadata: {} < {}", @@ -22,12 +24,15 @@ ShaderAsset::ShaderAsset(const std::filesystem::path &path): m_stream(path) file_size ); - // NOLINTBEGIN(cppcoreguidelines-pro-type-cstyle-cast) m_stream.seekg(0, std::ifstream::beg); - m_stream.read((char *)&m_asset_metadata, sizeof(m_asset_metadata)); - m_stream.read((char *)&m_metadata, sizeof(m_metadata)); - m_stream.read((char *)&m_code_blob_metadata, sizeof(m_code_blob_metadata)); - // NOLINTEND(cppcoreguidelines-pro-type-cstyle-cast) + read(m_asset_metadata.type); + read(m_asset_metadata.version); + read(m_metadata.type); + read(m_code_blob_metadata.tag); + read(m_code_blob_metadata.offset); + read(m_code_blob_metadata.compression_type); + read(m_code_blob_metadata.compressed_size); + read(m_code_blob_metadata.uncompressed_size); ensure( m_asset_metadata.type == asset_type_identifier, @@ -69,4 +74,69 @@ ShaderAsset::ShaderAsset(const std::filesystem::path &path): m_stream(path) ); } +/* static */ void ShaderAsset::pack( + const std::filesystem::path &destination, + AssetMetadata asset_metadata, + Metadata metadata, + Blob code_blob +) +{ + auto stream = std::ofstream { + destination, + std::ios::binary | std::ios::trunc, + }; + const auto code_blob_metadata = BlobMetadata { + .tag = std::to_underlying(BlobTag::code), + .offset = static_cast(stream.tellp()) + sizeof(BlobMetadata), + .compression_type = CompressionType::none, + .compressed_size = code_blob.size(), + .uncompressed_size = code_blob.size(), + }; + + ensure(stream.is_open(), "Failed to pack shader asset to {}", destination.string()); + const auto write = [&stream](auto &field) { + stream.write(std::bit_cast(&field), sizeof(field)); + }; + write(asset_metadata.type); + write(asset_metadata.version); + write(metadata.type); + write(code_blob_metadata.tag); + write(code_blob_metadata.offset); + write(code_blob_metadata.compression_type); + write(code_blob_metadata.compressed_size); + write(code_blob_metadata.uncompressed_size); + stream.write(std::bit_cast(code_blob.data()), static_cast(code_blob.size())); +} + +void ShaderAsset::unpack_to(BlobTag tag, std::span destination) const +{ + ensure(tag == BlobTag::code, "Invalid blob tag for shader asset: {}", std::to_underlying(tag)); + + ensure( + destination.size() >= m_code_blob_metadata.uncompressed_size, + "Failed to unpack shader blob {} to destination ({}) of size {} since it's smaller " + "than the blobl's uncompressed size: {}", + std::to_underlying(tag), + std::bit_cast(destination.data()), + destination.size(), + m_code_blob_metadata.uncompressed_size + ); + + m_stream.seekg(static_cast(m_code_blob_metadata.offset)); + m_stream.read( + std::bit_cast(destination.data()), + static_cast(m_code_blob_metadata.uncompressed_size) + ); +} + +[[nodiscard]] auto ShaderAsset::unpack(BlobTag tag) const -> Blob +{ + ensure(tag == BlobTag::code, "Invalid blob tag for shader asset: {}", std::to_underlying(tag)); + + auto blob = Blob(m_code_blob_metadata.uncompressed_size); + unpack_to(tag, blob); + + return blob; +} + } // namespace lt::assets diff --git a/modules/assets/public/shader.hpp b/modules/assets/public/shader.hpp index 96e3b53..c8f6061 100644 --- a/modules/assets/public/shader.hpp +++ b/modules/assets/public/shader.hpp @@ -32,41 +32,14 @@ public: AssetMetadata asset_metadata, Metadata metadata, Blob code_blob - ) - { - auto stream = std::ofstream { - destination, - std::ios::binary | std::ios::trunc, - }; - const auto code_blob_metadata = BlobMetadata { - .tag = std::to_underlying(BlobTag::code), - .offset = static_cast(stream.tellp()) + sizeof(BlobMetadata), - .compression_type = CompressionType::none, - .compressed_size = code_blob.size(), - .uncompressed_size = code_blob.size(), - }; - - ensure(stream.is_open(), "Failed to pack shader asset to {}", destination.string()); - const auto write = [&stream](auto &field) { - stream.write(std::bit_cast(&field), sizeof(field)); - }; - - write(asset_metadata.type); - write(asset_metadata.version); - write(metadata.type); - write(code_blob_metadata.tag); - write(code_blob_metadata.offset); - write(code_blob_metadata.compression_type); - write(code_blob_metadata.compressed_size); - write(code_blob_metadata.uncompressed_size); - stream.write( - std::bit_cast(code_blob.data()), - static_cast(code_blob.size()) - ); - } + ); ShaderAsset(const std::filesystem::path &path); + void unpack_to(BlobTag tag, std::span destination) const; + + [[nodiscard]] auto unpack(BlobTag tag) const -> Blob; + [[nodiscard]] auto get_asset_metadata() const -> const AssetMetadata & { return m_asset_metadata; @@ -88,45 +61,6 @@ public: return m_code_blob_metadata; } - void unpack_to(BlobTag tag, std::span destination) const - { - ensure( - tag == BlobTag::code, - "Invalid blob tag for shader asset: {}", - std::to_underlying(tag) - ); - - ensure( - destination.size() >= m_code_blob_metadata.uncompressed_size, - "Failed to unpack shader blob {} to destination ({}) of size {} since it's smaller " - "than the blobl's uncompressed size: {}", - std::to_underlying(tag), - (size_t)(destination.data()), // NOLINT(cppcoreguidelines-pro-type-cstyle-cast) - destination.size(), - m_code_blob_metadata.uncompressed_size - ); - - m_stream.seekg(static_cast(m_code_blob_metadata.offset)); - m_stream.read( - (char *)destination.data(), // NOLINT(cppcoreguidelines-pro-type-cstyle-cast) - static_cast(m_code_blob_metadata.uncompressed_size) - ); - } - - [[nodiscard]] auto unpack(BlobTag tag) const -> Blob - { - ensure( - tag == BlobTag::code, - "Invalid blob tag for shader asset: {}", - std::to_underlying(tag) - ); - - auto blob = Blob(m_code_blob_metadata.uncompressed_size); - unpack_to(tag, blob); - - return blob; - } - private: AssetMetadata m_asset_metadata {};