diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/vi/vi.cpp | 33 |
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 | ||
| 177 | class IGBPConnectRequestParcel : public Parcel { | 189 | class IGBPConnectRequestParcel : public Parcel { |
| 178 | public: | 190 | public: |
| 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 | ||
| 224 | class IGBPSetPreallocatedBufferRequestParcel : public Parcel { | 236 | class IGBPSetPreallocatedBufferRequestParcel : public Parcel { |
| 225 | public: | 237 | public: |
| 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 | ||
| 257 | class IGBPDequeueBufferRequestParcel : public Parcel { | 269 | class IGBPDequeueBufferRequestParcel : public Parcel { |
| 258 | public: | 270 | public: |
| 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 | ||
| 308 | class IGBPRequestBufferRequestParcel : public Parcel { | 320 | class IGBPRequestBufferRequestParcel : public Parcel { |
| 309 | public: | 321 | public: |
| 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 | ||
| 323 | class IGBPRequestBufferResponseParcel : public Parcel { | 335 | class IGBPRequestBufferResponseParcel : public Parcel { |
| 324 | public: | 336 | public: |
| 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 | ||
| 329 | protected: | 340 | protected: |
| @@ -340,7 +351,7 @@ protected: | |||
| 340 | 351 | ||
| 341 | class IGBPQueueBufferRequestParcel : public Parcel { | 352 | class IGBPQueueBufferRequestParcel : public Parcel { |
| 342 | public: | 353 | public: |
| 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 | ||
| 410 | class IGBPQueryRequestParcel : public Parcel { | 421 | class IGBPQueryRequestParcel : public Parcel { |
| 411 | public: | 422 | public: |
| 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; |