diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2018-09-18 01:30:35 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-09-18 01:30:35 -0300 |
| commit | d4187aaa9d7194aa26d04aee838edbc3a38f1862 (patch) | |
| tree | 06fe725c1067b4aeca21749799b835d85e7d2787 /Ryujinx.HLE/HOS | |
| parent | bec95cacc1061f91373a1e3a1411981af7fe2e4e (diff) | |
Allow "reinterpretation" of framebuffer/zeta formats (#418)
* (Re)Implement format reinterpretation, other changes
* Implement writeback to guest memory, some refactoring
* More refactoring, implement reinterpretation the old way again
* Clean up
* Some fixes on M2MF (old Dma engine), added partial support for P2MF, fix conditional ssy, add Z24S8 zeta format, other fixes
* nit: Formatting
* Address PR feedback
Diffstat (limited to 'Ryujinx.HLE/HOS')
| -rw-r--r-- | Ryujinx.HLE/HOS/Kernel/SvcSystem.cs | 3 | ||||
| -rw-r--r-- | Ryujinx.HLE/HOS/Services/Acc/IProfile.cs | 1 | ||||
| -rw-r--r-- | Ryujinx.HLE/HOS/Services/Vi/IHOSBinderDriver.cs | 12 | ||||
| -rw-r--r-- | Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs | 48 |
4 files changed, 33 insertions, 31 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/SvcSystem.cs b/Ryujinx.HLE/HOS/Kernel/SvcSystem.cs index 7cc1c858..d10eb117 100644 --- a/Ryujinx.HLE/HOS/Kernel/SvcSystem.cs +++ b/Ryujinx.HLE/HOS/Kernel/SvcSystem.cs @@ -288,7 +288,8 @@ namespace Ryujinx.HLE.HOS.Kernel //Fail for info not available on older Kernel versions. if (InfoType == 18 || InfoType == 19 || - InfoType == 20) + InfoType == 20 || + InfoType == 21) { ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidEnumValue); diff --git a/Ryujinx.HLE/HOS/Services/Acc/IProfile.cs b/Ryujinx.HLE/HOS/Services/Acc/IProfile.cs index 316f16d0..f68c8191 100644 --- a/Ryujinx.HLE/HOS/Services/Acc/IProfile.cs +++ b/Ryujinx.HLE/HOS/Services/Acc/IProfile.cs @@ -3,7 +3,6 @@ using Ryujinx.HLE.HOS.Ipc; using Ryujinx.HLE.HOS.SystemState; using Ryujinx.HLE.Logging; using Ryujinx.HLE.Utilities; -using System; using System.Collections.Generic; using System.IO; using System.Reflection; diff --git a/Ryujinx.HLE/HOS/Services/Vi/IHOSBinderDriver.cs b/Ryujinx.HLE/HOS/Services/Vi/IHOSBinderDriver.cs index bf5f20a2..19e0d949 100644 --- a/Ryujinx.HLE/HOS/Services/Vi/IHOSBinderDriver.cs +++ b/Ryujinx.HLE/HOS/Services/Vi/IHOSBinderDriver.cs @@ -13,7 +13,7 @@ namespace Ryujinx.HLE.HOS.Services.Vi public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => m_Commands; - private KEvent ReleaseEvent; + private KEvent BinderEvent; private NvFlinger Flinger; @@ -27,9 +27,11 @@ namespace Ryujinx.HLE.HOS.Services.Vi { 3, TransactParcelAuto } }; - ReleaseEvent = new KEvent(); + BinderEvent = new KEvent(); - Flinger = new NvFlinger(Renderer, ReleaseEvent); + BinderEvent.WaitEvent.Set(); + + Flinger = new NvFlinger(Renderer, BinderEvent); } public long TransactParcel(ServiceCtx Context) @@ -75,7 +77,7 @@ namespace Ryujinx.HLE.HOS.Services.Vi int Id = Context.RequestData.ReadInt32(); uint Unk = Context.RequestData.ReadUInt32(); - int Handle = Context.Process.HandleTable.OpenHandle(ReleaseEvent); + int Handle = Context.Process.HandleTable.OpenHandle(BinderEvent); Context.Response.HandleDesc = IpcHandleDesc.MakeMove(Handle); @@ -91,7 +93,7 @@ namespace Ryujinx.HLE.HOS.Services.Vi { if (Disposing) { - ReleaseEvent.Dispose(); + BinderEvent.Dispose(); Flinger.Dispose(); } diff --git a/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs b/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs index 2a6918c4..a8493758 100644 --- a/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs +++ b/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs @@ -1,6 +1,7 @@ using Ryujinx.Graphics.Gal; -using Ryujinx.Graphics.Texture; +using Ryujinx.Graphics.Memory; using Ryujinx.HLE.HOS.Kernel; +using Ryujinx.HLE.HOS.Services.Nv.NvGpuAS; using Ryujinx.HLE.HOS.Services.Nv.NvMap; using Ryujinx.HLE.Logging; using System; @@ -19,7 +20,7 @@ namespace Ryujinx.HLE.HOS.Services.Android private Dictionary<(string, int), ServiceProcessParcel> Commands; - private KEvent ReleaseEvent; + private KEvent BinderEvent; private IGalRenderer Renderer; @@ -67,7 +68,7 @@ namespace Ryujinx.HLE.HOS.Services.Android private bool Disposed; - public NvFlinger(IGalRenderer Renderer, KEvent ReleaseEvent) + public NvFlinger(IGalRenderer Renderer, KEvent BinderEvent) { Commands = new Dictionary<(string, int), ServiceProcessParcel>() { @@ -82,8 +83,8 @@ namespace Ryujinx.HLE.HOS.Services.Android { ("android.gui.IGraphicBufferProducer", 0xe), GbpPreallocBuffer } }; - this.Renderer = Renderer; - this.ReleaseEvent = ReleaseEvent; + this.Renderer = Renderer; + this.BinderEvent = BinderEvent; BufferQueue = new BufferEntry[0x40]; @@ -301,42 +302,41 @@ namespace Ryujinx.HLE.HOS.Services.Android bool FlipX = BufferQueue[Slot].Transform.HasFlag(HalTransform.FlipX); bool FlipY = BufferQueue[Slot].Transform.HasFlag(HalTransform.FlipY); - //Rotation is being ignored + //Note: Rotation is being ignored. int Top = Crop.Top; int Left = Crop.Left; int Right = Crop.Right; int Bottom = Crop.Bottom; - Renderer.QueueAction(() => Renderer.RenderTarget.SetTransform(FlipX, FlipY, Top, Left, Right, Bottom)); + NvGpuVmm Vmm = NvGpuASIoctl.GetASCtx(Context).Vmm; - //TODO: Support double buffering here aswell, it is broken for GPU - //frame buffers because it seems to be completely out of sync. - if (Context.Device.Gpu.Engine3d.IsFrameBufferPosition(FbAddr)) + Renderer.QueueAction(() => { - //Frame buffer is rendered to by the GPU, we can just - //bind the frame buffer texture, it's not necessary to read anything. - Renderer.QueueAction(() => Renderer.RenderTarget.Set(FbAddr)); - } - else - { - //Frame buffer is not set on the GPU registers, in this case - //assume that the app is manually writing to it. - TextureInfo Texture = new TextureInfo(FbAddr, FbWidth, FbHeight); + if (!Renderer.Texture.TryGetImage(FbAddr, out GalImage Image)) + { + Image = new GalImage( + FbWidth, + FbHeight, 1, 16, + GalMemoryLayout.BlockLinear, + GalImageFormat.A8B8G8R8 | GalImageFormat.Unorm); + } - byte[] Data = TextureReader.Read(Context.Memory, Texture); + Context.Device.Gpu.ResourceManager.ClearPbCache(); + Context.Device.Gpu.ResourceManager.SendTexture(Vmm, FbAddr, Image); - Renderer.QueueAction(() => Renderer.RenderTarget.Set(Data, FbWidth, FbHeight)); - } + Renderer.RenderTarget.SetTransform(FlipX, FlipY, Top, Left, Right, Bottom); + Renderer.RenderTarget.Set(FbAddr); - Context.Device.Gpu.Renderer.QueueAction(() => ReleaseBuffer(Slot)); + ReleaseBuffer(Slot); + }); } private void ReleaseBuffer(int Slot) { BufferQueue[Slot].State = BufferState.Free; - ReleaseEvent.WaitEvent.Set(); + BinderEvent.WaitEvent.Set(); lock (WaitBufferFree) { |
