summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/vi/vi.cpp33
1 files changed, 22 insertions, 11 deletions
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp
index 3a69b85f9..993f1e65a 100644
--- a/src/core/hle/service/vi/vi.cpp
+++ b/src/core/hle/service/vi/vi.cpp
@@ -5,6 +5,8 @@
5#include <algorithm> 5#include <algorithm>
6#include <array> 6#include <array>
7#include <memory> 7#include <memory>
8#include <type_traits>
9#include <utility>
8#include <boost/optional.hpp> 10#include <boost/optional.hpp>
9#include "common/alignment.h" 11#include "common/alignment.h"
10#include "common/math_util.h" 12#include "common/math_util.h"
@@ -43,7 +45,9 @@ public:
43 45
44 template <typename T> 46 template <typename T>
45 T Read() { 47 T Read() {
48 static_assert(std::is_trivially_copyable_v<T>, "T must be trivially copyable.");
46 ASSERT(read_index + sizeof(T) <= buffer.size()); 49 ASSERT(read_index + sizeof(T) <= buffer.size());
50
47 T val; 51 T val;
48 std::memcpy(&val, buffer.data() + read_index, sizeof(T)); 52 std::memcpy(&val, buffer.data() + read_index, sizeof(T));
49 read_index += sizeof(T); 53 read_index += sizeof(T);
@@ -53,7 +57,9 @@ public:
53 57
54 template <typename T> 58 template <typename T>
55 T ReadUnaligned() { 59 T ReadUnaligned() {
60 static_assert(std::is_trivially_copyable_v<T>, "T must be trivially copyable.");
56 ASSERT(read_index + sizeof(T) <= buffer.size()); 61 ASSERT(read_index + sizeof(T) <= buffer.size());
62
57 T val; 63 T val;
58 std::memcpy(&val, buffer.data() + read_index, sizeof(T)); 64 std::memcpy(&val, buffer.data() + read_index, sizeof(T));
59 read_index += sizeof(T); 65 read_index += sizeof(T);
@@ -87,8 +93,12 @@ public:
87 93
88 template <typename T> 94 template <typename T>
89 void Write(const T& val) { 95 void Write(const T& val) {
90 if (buffer.size() < write_index + sizeof(T)) 96 static_assert(std::is_trivially_copyable_v<T>, "T must be trivially copyable.");
97
98 if (buffer.size() < write_index + sizeof(T)) {
91 buffer.resize(buffer.size() + sizeof(T) + DefaultBufferSize); 99 buffer.resize(buffer.size() + sizeof(T) + DefaultBufferSize);
100 }
101
92 std::memcpy(buffer.data() + write_index, &val, sizeof(T)); 102 std::memcpy(buffer.data() + write_index, &val, sizeof(T));
93 write_index += sizeof(T); 103 write_index += sizeof(T);
94 write_index = Common::AlignUp(write_index, 4); 104 write_index = Common::AlignUp(write_index, 4);
@@ -96,7 +106,9 @@ public:
96 106
97 template <typename T> 107 template <typename T>
98 void WriteObject(const T& val) { 108 void WriteObject(const T& val) {
99 u32_le size = static_cast<u32>(sizeof(val)); 109 static_assert(std::is_trivially_copyable_v<T>, "T must be trivially copyable.");
110
111 const u32_le size = static_cast<u32>(sizeof(val));
100 Write(size); 112 Write(size);
101 // TODO(Subv): Support file descriptors. 113 // TODO(Subv): Support file descriptors.
102 Write<u32_le>(0); // Fd count. 114 Write<u32_le>(0); // Fd count.
@@ -176,7 +188,7 @@ private:
176 188
177class IGBPConnectRequestParcel : public Parcel { 189class IGBPConnectRequestParcel : public Parcel {
178public: 190public:
179 explicit IGBPConnectRequestParcel(const std::vector<u8>& buffer) : Parcel(buffer) { 191 explicit IGBPConnectRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
180 Deserialize(); 192 Deserialize();
181 } 193 }
182 ~IGBPConnectRequestParcel() override = default; 194 ~IGBPConnectRequestParcel() override = default;
@@ -223,8 +235,8 @@ private:
223 235
224class IGBPSetPreallocatedBufferRequestParcel : public Parcel { 236class IGBPSetPreallocatedBufferRequestParcel : public Parcel {
225public: 237public:
226 explicit IGBPSetPreallocatedBufferRequestParcel(const std::vector<u8>& buffer) 238 explicit IGBPSetPreallocatedBufferRequestParcel(std::vector<u8> buffer)
227 : Parcel(buffer) { 239 : Parcel(std::move(buffer)) {
228 Deserialize(); 240 Deserialize();
229 } 241 }
230 ~IGBPSetPreallocatedBufferRequestParcel() override = default; 242 ~IGBPSetPreallocatedBufferRequestParcel() override = default;
@@ -256,7 +268,7 @@ protected:
256 268
257class IGBPDequeueBufferRequestParcel : public Parcel { 269class IGBPDequeueBufferRequestParcel : public Parcel {
258public: 270public:
259 explicit IGBPDequeueBufferRequestParcel(const std::vector<u8>& buffer) : Parcel(buffer) { 271 explicit IGBPDequeueBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
260 Deserialize(); 272 Deserialize();
261 } 273 }
262 ~IGBPDequeueBufferRequestParcel() override = default; 274 ~IGBPDequeueBufferRequestParcel() override = default;
@@ -307,7 +319,7 @@ protected:
307 319
308class IGBPRequestBufferRequestParcel : public Parcel { 320class IGBPRequestBufferRequestParcel : public Parcel {
309public: 321public:
310 explicit IGBPRequestBufferRequestParcel(const std::vector<u8>& buffer) : Parcel(buffer) { 322 explicit IGBPRequestBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
311 Deserialize(); 323 Deserialize();
312 } 324 }
313 ~IGBPRequestBufferRequestParcel() override = default; 325 ~IGBPRequestBufferRequestParcel() override = default;
@@ -322,8 +334,7 @@ public:
322 334
323class IGBPRequestBufferResponseParcel : public Parcel { 335class IGBPRequestBufferResponseParcel : public Parcel {
324public: 336public:
325 explicit IGBPRequestBufferResponseParcel(NVFlinger::IGBPBuffer buffer) 337 explicit IGBPRequestBufferResponseParcel(NVFlinger::IGBPBuffer buffer) : buffer(buffer) {}
326 : Parcel(), buffer(buffer) {}
327 ~IGBPRequestBufferResponseParcel() override = default; 338 ~IGBPRequestBufferResponseParcel() override = default;
328 339
329protected: 340protected:
@@ -340,7 +351,7 @@ protected:
340 351
341class IGBPQueueBufferRequestParcel : public Parcel { 352class IGBPQueueBufferRequestParcel : public Parcel {
342public: 353public:
343 explicit IGBPQueueBufferRequestParcel(const std::vector<u8>& buffer) : Parcel(buffer) { 354 explicit IGBPQueueBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
344 Deserialize(); 355 Deserialize();
345 } 356 }
346 ~IGBPQueueBufferRequestParcel() override = default; 357 ~IGBPQueueBufferRequestParcel() override = default;
@@ -409,7 +420,7 @@ private:
409 420
410class IGBPQueryRequestParcel : public Parcel { 421class IGBPQueryRequestParcel : public Parcel {
411public: 422public:
412 explicit IGBPQueryRequestParcel(const std::vector<u8>& buffer) : Parcel(buffer) { 423 explicit IGBPQueryRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
413 Deserialize(); 424 Deserialize();
414 } 425 }
415 ~IGBPQueryRequestParcel() override = default; 426 ~IGBPQueryRequestParcel() override = default;