diff --git a/Ryujinx.HLE/HOS/Services/Vi/GbpBuffer.cs b/Ryujinx.HLE/HOS/Services/Vi/GbpBuffer.cs index 9b0bd87f49..87541c9f37 100644 --- a/Ryujinx.HLE/HOS/Services/Vi/GbpBuffer.cs +++ b/Ryujinx.HLE/HOS/Services/Vi/GbpBuffer.cs @@ -1,3 +1,4 @@ +using System; using System.IO; using System.Runtime.InteropServices; @@ -60,6 +61,40 @@ namespace Ryujinx.HLE.HOS.Services.Android public long Size; } + [StructLayout(LayoutKind.Explicit)] + struct NvGraphicBufferSurfaceArray + { + [FieldOffset(0x0)] + private NvGraphicBufferSurface Surface0; + + [FieldOffset(0x58)] + private NvGraphicBufferSurface Surface1; + + [FieldOffset(0xb0)] + private NvGraphicBufferSurface Surface2; + + public NvGraphicBufferSurface this[int index] + { + get + { + if (index == 0) + { + return Surface0; + } + else if (index == 1) + { + return Surface1; + } + else if (index == 2) + { + return Surface2; + } + + throw new IndexOutOfRangeException(); + } + } + } + [StructLayout(LayoutKind.Explicit, Size = 0x144)] struct NvGraphicBuffer { @@ -93,19 +128,8 @@ namespace Ryujinx.HLE.HOS.Services.Android [FieldOffset(0x2C)] public int PlanesCount; - // This throw an exception because C# is dumb and want to make every entries of the array appears at the FieldOffset - /*[FieldOffset(0x34)] - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] - public NvGraphicBufferSurface[] Surfaces;*/ - [FieldOffset(0x34)] - public NvGraphicBufferSurface Surface0; - - [FieldOffset(0x8c)] - public NvGraphicBufferSurface Surface1; - - [FieldOffset(0xe4)] - public NvGraphicBufferSurface Surface2; + public NvGraphicBufferSurfaceArray Surfaces; } struct GbpBuffer diff --git a/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs b/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs index 7233e7889a..69d28848c5 100644 --- a/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs +++ b/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs @@ -385,14 +385,14 @@ namespace Ryujinx.HLE.HOS.Services.Android int fbWidth = _bufferQueue[slot].Data.Header.Width; int fbHeight = _bufferQueue[slot].Data.Header.Height; - int nvMapHandle = _bufferQueue[slot].Data.Buffer.Surface0.NvMapHandle; + int nvMapHandle = _bufferQueue[slot].Data.Buffer.Surfaces[0].NvMapHandle; if (nvMapHandle == 0) { nvMapHandle = _bufferQueue[slot].Data.Buffer.NvMapId; } - int bufferOffset = _bufferQueue[slot].Data.Buffer.Surface0.Offset; + int bufferOffset = _bufferQueue[slot].Data.Buffer.Surfaces[0].Offset; NvMapHandle map = NvMapIoctl.GetNvMap(context, nvMapHandle);