IBinder.cs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. using Ryujinx.Common.Logging;
  2. using Ryujinx.HLE.HOS.Kernel.Threading;
  3. using System;
  4. using System.Runtime.CompilerServices;
  5. namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger
  6. {
  7. interface IBinder
  8. {
  9. ResultCode AdjustRefcount(int addVal, int type);
  10. void GetNativeHandle(uint typeId, out KReadableEvent readableEvent);
  11. ResultCode OnTransact(uint code, uint flags, ReadOnlySpan<byte> inputParcel, Span<byte> outputParcel)
  12. {
  13. Parcel inputParcelReader = new Parcel(inputParcel.ToArray());
  14. // TODO: support objects?
  15. Parcel outputParcelWriter = new Parcel((uint)(outputParcel.Length - Unsafe.SizeOf<ParcelHeader>()), 0);
  16. string inputInterfaceToken = inputParcelReader.ReadInterfaceToken();
  17. if (!InterfaceToken.Equals(inputInterfaceToken))
  18. {
  19. Logger.Error?.Print(LogClass.SurfaceFlinger, $"Invalid interface token {inputInterfaceToken} (expected: {InterfaceToken}");
  20. return ResultCode.Success;
  21. }
  22. OnTransact(code, flags, inputParcelReader, outputParcelWriter);
  23. outputParcelWriter.Finish().CopyTo(outputParcel);
  24. return ResultCode.Success;
  25. }
  26. void OnTransact(uint code, uint flags, Parcel inputParcel, Parcel outputParcel);
  27. string InterfaceToken { get; }
  28. }
  29. }