From f4e879a1e6ad810aa38c1c020467a2589441871b Mon Sep 17 00:00:00 2001
From: Mary-nyan <mary@mary.zone>
Date: Thu, 24 Nov 2022 15:26:29 +0100
Subject: Reduce usage of Marshal.PtrToStructure and Marshal.StructureToPtr
 (#3805)

* common: Make BinaryReaderExtensions Read & Write take unamanged types

This allows us to not rely on Marshal.PtrToStructure and Marshal.StructureToPtr for those.

* common: Make MemoryHelper Read & Write takes unamanged types

* Update Marshal.SizeOf => Unsafe.SizeOf when appropriate and start moving software applet to unmanaged types
---
 .../SoftwareKeyboard/SoftwareKeyboardApplet.cs     | 23 +++++++++++-----------
 1 file changed, 11 insertions(+), 12 deletions(-)

(limited to 'Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardApplet.cs')

diff --git a/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardApplet.cs b/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardApplet.cs
index e287318a..74073420 100644
--- a/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardApplet.cs
+++ b/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardApplet.cs
@@ -1,4 +1,5 @@
-using Ryujinx.Common.Configuration.Hid;
+using Ryujinx.Common;
+using Ryujinx.Common.Configuration.Hid;
 using Ryujinx.Common.Logging;
 using Ryujinx.HLE.HOS.Applets.SoftwareKeyboard;
 using Ryujinx.HLE.HOS.Services.Am.AppletAE;
@@ -9,6 +10,7 @@ using Ryujinx.Memory;
 using System;
 using System.Diagnostics;
 using System.IO;
+using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
 using System.Text;
 
@@ -78,13 +80,13 @@ namespace Ryujinx.HLE.HOS.Applets
                 var launchParams   = _normalSession.Pop();
                 var keyboardConfig = _normalSession.Pop();
 
-                _isBackground = keyboardConfig.Length == Marshal.SizeOf<SoftwareKeyboardInitialize>();
+                _isBackground = keyboardConfig.Length == Unsafe.SizeOf<SoftwareKeyboardInitialize>();
 
                 if (_isBackground)
                 {
                     // Initialize the keyboard applet in background mode.
 
-                    _keyboardBackgroundInitialize = ReadStruct<SoftwareKeyboardInitialize>(keyboardConfig);
+                    _keyboardBackgroundInitialize = MemoryMarshal.Read<SoftwareKeyboardInitialize>(keyboardConfig);
                     _backgroundState              = InlineKeyboardState.Uninitialized;
 
                     if (_device.UiHandler == null)
@@ -342,7 +344,7 @@ namespace Ryujinx.HLE.HOS.Applets
                         else
                         {
                             int wordsCount = reader.ReadInt32();
-                            int wordSize = Marshal.SizeOf<SoftwareKeyboardUserWord>();
+                            int wordSize = Unsafe.SizeOf<SoftwareKeyboardUserWord>();
                             remaining = stream.Length - stream.Position;
 
                             if (wordsCount > MaxUserWords)
@@ -359,8 +361,7 @@ namespace Ryujinx.HLE.HOS.Applets
 
                                 for (int word = 0; word < wordsCount; word++)
                                 {
-                                    byte[] wordData = reader.ReadBytes(wordSize);
-                                    _keyboardBackgroundUserWords[word] = ReadStruct<SoftwareKeyboardUserWord>(wordData);
+                                    _keyboardBackgroundUserWords[word] = reader.ReadStruct<SoftwareKeyboardUserWord>();
                                 }
                             }
                         }
@@ -369,27 +370,25 @@ namespace Ryujinx.HLE.HOS.Applets
                     case InlineKeyboardRequest.SetCustomizeDic:
                         // Read the custom dic data.
                         remaining = stream.Length - stream.Position;
-                        if (remaining != Marshal.SizeOf<SoftwareKeyboardCustomizeDic>())
+                        if (remaining != Unsafe.SizeOf<SoftwareKeyboardCustomizeDic>())
                         {
                             Logger.Warning?.Print(LogClass.ServiceAm, $"Received invalid Software Keyboard Customize Dic of {remaining} bytes");
                         }
                         else
                         {
-                            var keyboardDicData = reader.ReadBytes((int)remaining);
-                            _keyboardBackgroundDic = ReadStruct<SoftwareKeyboardCustomizeDic>(keyboardDicData);
+                            _keyboardBackgroundDic = reader.ReadStruct<SoftwareKeyboardCustomizeDic>();
                         }
                         break;
                     case InlineKeyboardRequest.SetCustomizedDictionaries:
                         // Read the custom dictionaries data.
                         remaining = stream.Length - stream.Position;
-                        if (remaining != Marshal.SizeOf<SoftwareKeyboardDictSet>())
+                        if (remaining != Unsafe.SizeOf<SoftwareKeyboardDictSet>())
                         {
                             Logger.Warning?.Print(LogClass.ServiceAm, $"Received invalid Software Keyboard DictSet of {remaining} bytes");
                         }
                         else
                         {
-                            var keyboardDictData = reader.ReadBytes((int)remaining);
-                            _keyboardBackgroundDictSet = ReadStruct<SoftwareKeyboardDictSet>(keyboardDictData);
+                            _keyboardBackgroundDictSet = reader.ReadStruct<SoftwareKeyboardDictSet>();
                         }
                         break;
                     case InlineKeyboardRequest.Calc:
-- 
cgit v1.2.3-70-g09d2