diff options
| author | 2018-02-14 18:31:53 -0500 | |
|---|---|---|
| committer | 2018-02-14 18:31:53 -0500 | |
| commit | db873a232ca92191df89e7e5a13f254f3d58b966 (patch) | |
| tree | 0b0c4a1116f6ef1af1a3144781c149ebd4429577 /src/core/hle/kernel | |
| parent | Merge pull request #192 from jroweboy/fix-fps (diff) | |
| parent | hle_ipc: Remove const from WriteBuffer size. (diff) | |
| download | yuzu-db873a232ca92191df89e7e5a13f254f3d58b966.tar.gz yuzu-db873a232ca92191df89e7e5a13f254f3d58b966.tar.xz yuzu-db873a232ca92191df89e7e5a13f254f3d58b966.zip | |
Merge pull request #188 from bunnei/refactor-buffer-descriptor
Refactor IPC buffer descriptor interface
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 44 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.h | 15 |
2 files changed, 59 insertions, 0 deletions
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index db104e8a2..6d16f71a7 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include "core/hle/kernel/kernel.h" | 12 | #include "core/hle/kernel/kernel.h" |
| 13 | #include "core/hle/kernel/process.h" | 13 | #include "core/hle/kernel/process.h" |
| 14 | #include "core/hle/kernel/server_session.h" | 14 | #include "core/hle/kernel/server_session.h" |
| 15 | #include "core/memory.h" | ||
| 15 | 16 | ||
| 16 | namespace Kernel { | 17 | namespace Kernel { |
| 17 | 18 | ||
| @@ -210,4 +211,47 @@ ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(u32_le* dst_cmdbuf, P | |||
| 210 | return RESULT_SUCCESS; | 211 | return RESULT_SUCCESS; |
| 211 | } | 212 | } |
| 212 | 213 | ||
| 214 | std::vector<u8> HLERequestContext::ReadBuffer() const { | ||
| 215 | std::vector<u8> buffer; | ||
| 216 | const bool is_buffer_a{BufferDescriptorA().size() && BufferDescriptorA()[0].Size()}; | ||
| 217 | |||
| 218 | if (is_buffer_a) { | ||
| 219 | buffer.resize(BufferDescriptorA()[0].Size()); | ||
| 220 | Memory::ReadBlock(BufferDescriptorA()[0].Address(), buffer.data(), buffer.size()); | ||
| 221 | } else { | ||
| 222 | buffer.resize(BufferDescriptorX()[0].Size()); | ||
| 223 | Memory::ReadBlock(BufferDescriptorX()[0].Address(), buffer.data(), buffer.size()); | ||
| 224 | } | ||
| 225 | |||
| 226 | return buffer; | ||
| 227 | } | ||
| 228 | |||
| 229 | size_t HLERequestContext::WriteBuffer(const void* buffer, size_t size) const { | ||
| 230 | const bool is_buffer_b{BufferDescriptorB().size() && BufferDescriptorB()[0].Size()}; | ||
| 231 | |||
| 232 | ASSERT_MSG(size <= GetWriteBufferSize(), "Size %d is too big", size); | ||
| 233 | |||
| 234 | if (is_buffer_b) { | ||
| 235 | Memory::WriteBlock(BufferDescriptorB()[0].Address(), buffer, size); | ||
| 236 | } else { | ||
| 237 | Memory::WriteBlock(BufferDescriptorC()[0].Address(), buffer, size); | ||
| 238 | } | ||
| 239 | |||
| 240 | return size; | ||
| 241 | } | ||
| 242 | |||
| 243 | size_t HLERequestContext::WriteBuffer(const std::vector<u8>& buffer) const { | ||
| 244 | return WriteBuffer(buffer.data(), buffer.size()); | ||
| 245 | } | ||
| 246 | |||
| 247 | size_t HLERequestContext::GetReadBufferSize() const { | ||
| 248 | const bool is_buffer_a{BufferDescriptorA().size() && BufferDescriptorA()[0].Size()}; | ||
| 249 | return is_buffer_a ? BufferDescriptorA()[0].Size() : BufferDescriptorX()[0].Size(); | ||
| 250 | } | ||
| 251 | |||
| 252 | size_t HLERequestContext::GetWriteBufferSize() const { | ||
| 253 | const bool is_buffer_b{BufferDescriptorB().size() && BufferDescriptorB()[0].Size()}; | ||
| 254 | return is_buffer_b ? BufferDescriptorB()[0].Size() : BufferDescriptorC()[0].Size(); | ||
| 255 | } | ||
| 256 | |||
| 213 | } // namespace Kernel | 257 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h index da8335b35..81e3489c8 100644 --- a/src/core/hle/kernel/hle_ipc.h +++ b/src/core/hle/kernel/hle_ipc.h | |||
| @@ -143,6 +143,21 @@ public: | |||
| 143 | return domain_message_header; | 143 | return domain_message_header; |
| 144 | } | 144 | } |
| 145 | 145 | ||
| 146 | /// Helper function to read a buffer using the appropriate buffer descriptor | ||
| 147 | std::vector<u8> ReadBuffer() const; | ||
| 148 | |||
| 149 | /// Helper function to write a buffer using the appropriate buffer descriptor | ||
| 150 | size_t WriteBuffer(const void* buffer, size_t size) const; | ||
| 151 | |||
| 152 | /// Helper function to write a buffer using the appropriate buffer descriptor | ||
| 153 | size_t WriteBuffer(const std::vector<u8>& buffer) const; | ||
| 154 | |||
| 155 | /// Helper function to get the size of the input buffer | ||
| 156 | size_t GetReadBufferSize() const; | ||
| 157 | |||
| 158 | /// Helper function to get the size of the output buffer | ||
| 159 | size_t GetWriteBufferSize() const; | ||
| 160 | |||
| 146 | template <typename T> | 161 | template <typename T> |
| 147 | SharedPtr<T> GetCopyObject(size_t index) { | 162 | SharedPtr<T> GetCopyObject(size_t index) { |
| 148 | ASSERT(index < copy_objects.size()); | 163 | ASSERT(index < copy_objects.size()); |