summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
authorGravatar bunnei2018-02-14 18:31:53 -0500
committerGravatar GitHub2018-02-14 18:31:53 -0500
commitdb873a232ca92191df89e7e5a13f254f3d58b966 (patch)
tree0b0c4a1116f6ef1af1a3144781c149ebd4429577 /src/core/hle/kernel
parentMerge pull request #192 from jroweboy/fix-fps (diff)
parenthle_ipc: Remove const from WriteBuffer size. (diff)
downloadyuzu-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.cpp44
-rw-r--r--src/core/hle/kernel/hle_ipc.h15
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
16namespace Kernel { 17namespace 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
214std::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
229size_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
243size_t HLERequestContext::WriteBuffer(const std::vector<u8>& buffer) const {
244 return WriteBuffer(buffer.data(), buffer.size());
245}
246
247size_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
252size_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());