1
1
mirror of https://github.com/ryujinx-mirror/ryujinx.git synced 2025-03-13 02:39:39 -05:00
jhorv 216026c096
Use pooled memory and avoid memory copies (#6691)
* perf: use ByteMemoryPool

* feat: KPageTableBase/KPageTable new methods to read and write `ReadOnlySequence<byte>`

* new: add IWritableBlock.Write(ulong, ReadOnlySequence<byte>) with default impl

* perf: use GetReadOnlySequence() instead of GetSpan()

* perf: make `Parcel` IDisposable, use `ByteMemoryPool` for internal allocation, and make Parcel consumers dispose of it

* remove comment about copySize

* remove unnecessary Clear()
2024-04-21 12:57:35 +02:00

42 lines
1.3 KiB
C#

using Ryujinx.Common.Logging;
using Ryujinx.HLE.HOS.Kernel.Threading;
using System;
using System.Runtime.CompilerServices;
namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger
{
interface IBinder
{
ResultCode AdjustRefcount(int addVal, int type);
void GetNativeHandle(uint typeId, out KReadableEvent readableEvent);
ResultCode OnTransact(uint code, uint flags, ReadOnlySpan<byte> inputParcel, Span<byte> outputParcel)
{
using Parcel inputParcelReader = new(inputParcel);
// TODO: support objects?
using Parcel outputParcelWriter = new((uint)(outputParcel.Length - Unsafe.SizeOf<ParcelHeader>()), 0);
string inputInterfaceToken = inputParcelReader.ReadInterfaceToken();
if (!InterfaceToken.Equals(inputInterfaceToken))
{
Logger.Error?.Print(LogClass.SurfaceFlinger, $"Invalid interface token {inputInterfaceToken} (expected: {InterfaceToken}");
return ResultCode.Success;
}
OnTransact(code, flags, inputParcelReader, outputParcelWriter);
outputParcelWriter.Finish().CopyTo(outputParcel);
return ResultCode.Success;
}
void OnTransact(uint code, uint flags, Parcel inputParcel, Parcel outputParcel);
string InterfaceToken { get; }
}
}