diff options
author | bunnei <bunneidev@gmail.com> | 2023-02-03 04:04:50 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-03 04:04:50 +0100 |
commit | 25fc5c0e1158cb8e81cbc769b24ad84032a1fbfd (patch) | |
tree | a86c945d2e8789250005ac38ebbb36c48e95b30c /src/core/hle/service/nvflinger/parcel.h | |
parent | Merge pull request #9704 from liamwhite/das (diff) | |
parent | Revert "hle_ipc: Use std::span to avoid heap allocations/copies when calling ReadBuffer" (diff) | |
download | yuzu-25fc5c0e1158cb8e81cbc769b24ad84032a1fbfd.tar yuzu-25fc5c0e1158cb8e81cbc769b24ad84032a1fbfd.tar.gz yuzu-25fc5c0e1158cb8e81cbc769b24ad84032a1fbfd.tar.bz2 yuzu-25fc5c0e1158cb8e81cbc769b24ad84032a1fbfd.tar.lz yuzu-25fc5c0e1158cb8e81cbc769b24ad84032a1fbfd.tar.xz yuzu-25fc5c0e1158cb8e81cbc769b24ad84032a1fbfd.tar.zst yuzu-25fc5c0e1158cb8e81cbc769b24ad84032a1fbfd.zip |
Diffstat (limited to '')
-rw-r--r-- | src/core/hle/service/nvflinger/parcel.h | 87 |
1 files changed, 41 insertions, 46 deletions
diff --git a/src/core/hle/service/nvflinger/parcel.h b/src/core/hle/service/nvflinger/parcel.h index d1b6201e0..f3fa2587d 100644 --- a/src/core/hle/service/nvflinger/parcel.h +++ b/src/core/hle/service/nvflinger/parcel.h @@ -4,7 +4,6 @@ #pragma once #include <memory> -#include <span> #include <vector> #include "common/alignment.h" @@ -13,17 +12,18 @@ namespace Service::android { -struct ParcelHeader { - u32 data_size; - u32 data_offset; - u32 objects_size; - u32 objects_offset; -}; -static_assert(sizeof(ParcelHeader) == 16, "ParcelHeader has wrong size"); - -class InputParcel final { +class Parcel final { public: - explicit InputParcel(std::span<const u8> in_data) : read_buffer(std::move(in_data)) { + static constexpr std::size_t DefaultBufferSize = 0x40; + + Parcel() : buffer(DefaultBufferSize) {} + + template <typename T> + explicit Parcel(const T& out_data) : buffer(DefaultBufferSize) { + Write(out_data); + } + + explicit Parcel(std::vector<u8> in_data) : buffer(std::move(in_data)) { DeserializeHeader(); [[maybe_unused]] const std::u16string token = ReadInterfaceToken(); } @@ -31,9 +31,9 @@ public: template <typename T> void Read(T& val) { static_assert(std::is_trivially_copyable_v<T>, "T must be trivially copyable."); - ASSERT(read_index + sizeof(T) <= read_buffer.size()); + ASSERT(read_index + sizeof(T) <= buffer.size()); - std::memcpy(&val, read_buffer.data() + read_index, sizeof(T)); + std::memcpy(&val, buffer.data() + read_index, sizeof(T)); read_index += sizeof(T); read_index = Common::AlignUp(read_index, 4); } @@ -62,10 +62,10 @@ public: template <typename T> T ReadUnaligned() { static_assert(std::is_trivially_copyable_v<T>, "T must be trivially copyable."); - ASSERT(read_index + sizeof(T) <= read_buffer.size()); + ASSERT(read_index + sizeof(T) <= buffer.size()); T val; - std::memcpy(&val, read_buffer.data() + read_index, sizeof(T)); + std::memcpy(&val, buffer.data() + read_index, sizeof(T)); read_index += sizeof(T); return val; } @@ -101,31 +101,6 @@ public: return token; } - void DeserializeHeader() { - ASSERT(read_buffer.size() > sizeof(ParcelHeader)); - - ParcelHeader header{}; - std::memcpy(&header, read_buffer.data(), sizeof(ParcelHeader)); - - read_index = header.data_offset; - } - -private: - std::span<const u8> read_buffer; - std::size_t read_index = 0; -}; - -class OutputParcel final { -public: - static constexpr std::size_t DefaultBufferSize = 0x40; - - OutputParcel() : buffer(DefaultBufferSize) {} - - template <typename T> - explicit OutputParcel(const T& out_data) : buffer(DefaultBufferSize) { - Write(out_data); - } - template <typename T> void Write(const T& val) { static_assert(std::is_trivially_copyable_v<T>, "T must be trivially copyable."); @@ -158,20 +133,40 @@ public: WriteObject(ptr.get()); } + void DeserializeHeader() { + ASSERT(buffer.size() > sizeof(Header)); + + Header header{}; + std::memcpy(&header, buffer.data(), sizeof(Header)); + + read_index = header.data_offset; + } + std::vector<u8> Serialize() const { - ParcelHeader header{}; - header.data_size = static_cast<u32>(write_index - sizeof(ParcelHeader)); - header.data_offset = sizeof(ParcelHeader); + ASSERT(read_index == 0); + + Header header{}; + header.data_size = static_cast<u32>(write_index - sizeof(Header)); + header.data_offset = sizeof(Header); header.objects_size = 4; - header.objects_offset = static_cast<u32>(sizeof(ParcelHeader) + header.data_size); - std::memcpy(buffer.data(), &header, sizeof(ParcelHeader)); + header.objects_offset = static_cast<u32>(sizeof(Header) + header.data_size); + std::memcpy(buffer.data(), &header, sizeof(Header)); return buffer; } private: + struct Header { + u32 data_size; + u32 data_offset; + u32 objects_size; + u32 objects_offset; + }; + static_assert(sizeof(Header) == 16, "ParcelHeader has wrong size"); + mutable std::vector<u8> buffer; - std::size_t write_index = sizeof(ParcelHeader); + std::size_t read_index = 0; + std::size_t write_index = sizeof(Header); }; } // namespace Service::android |