From 9349f06963759705f69bd3a23a4df5354bbf6951 Mon Sep 17 00:00:00 2001 From: ameerj <52414509+ameerj@users.noreply.github.com> Date: Sun, 25 Dec 2022 13:20:59 -0500 Subject: [PATCH] hle_ipc: Add ReadBufferSpan function Returns a std::span to the buffer address, rather than create a copy of the memory into a std::vector --- src/core/hle/kernel/hle_ipc.cpp | 19 +++++++++++++++++++ src/core/hle/kernel/hle_ipc.h | 3 +++ 2 files changed, 22 insertions(+) diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index 738b6d0f1..549fd8aea 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp @@ -345,6 +345,25 @@ std::vector HLERequestContext::ReadBuffer(std::size_t buffer_index) const { } } +std::span HLERequestContext::ReadBufferSpan(std::size_t buffer_index) const { + LOG_CRITICAL(Debug, "called"); + const bool is_buffer_a{BufferDescriptorA().size() > buffer_index && + BufferDescriptorA()[buffer_index].Size()}; + if (is_buffer_a) { + ASSERT_OR_EXECUTE_MSG( + BufferDescriptorA().size() > buffer_index, { return {}; }, + "BufferDescriptorA invalid buffer_index {}", buffer_index); + const u8* const mem_ptr = memory.GetPointer(BufferDescriptorA()[buffer_index].Address()); + return std::span(mem_ptr, BufferDescriptorA()[buffer_index].Size()); + } else { + ASSERT_OR_EXECUTE_MSG( + BufferDescriptorX().size() > buffer_index, { return {}; }, + "BufferDescriptorX invalid buffer_index {}", buffer_index); + const u8* const mem_ptr = memory.GetPointer(BufferDescriptorX()[buffer_index].Address()); + return std::span(mem_ptr, BufferDescriptorX()[buffer_index].Size()); + } +} + std::size_t HLERequestContext::WriteBuffer(const void* buffer, std::size_t size, std::size_t buffer_index) const { if (size == 0) { diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h index e252b5f4b..2242ff922 100644 --- a/src/core/hle/kernel/hle_ipc.h +++ b/src/core/hle/kernel/hle_ipc.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -273,6 +274,8 @@ public: /// Helper function to read a buffer using the appropriate buffer descriptor [[nodiscard]] std::vector ReadBuffer(std::size_t buffer_index = 0) const; + [[nodiscard]] std::span ReadBufferSpan(std::size_t buffer_index = 0) const; + /// Helper function to write a buffer using the appropriate buffer descriptor std::size_t WriteBuffer(const void* buffer, std::size_t size, std::size_t buffer_index = 0) const;