summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/nvflinger/parcel.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/service/nvflinger/parcel.h')
-rw-r--r--src/core/hle/service/nvflinger/parcel.h87
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