aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.HLE/Switch.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.HLE/Switch.cs')
-rw-r--r--src/Ryujinx.HLE/Switch.cs156
1 files changed, 156 insertions, 0 deletions
diff --git a/src/Ryujinx.HLE/Switch.cs b/src/Ryujinx.HLE/Switch.cs
new file mode 100644
index 00000000..62d14a54
--- /dev/null
+++ b/src/Ryujinx.HLE/Switch.cs
@@ -0,0 +1,156 @@
+using Ryujinx.Audio.Backends.CompatLayer;
+using Ryujinx.Audio.Integration;
+using Ryujinx.Common.Configuration;
+using Ryujinx.Graphics.Gpu;
+using Ryujinx.HLE.FileSystem;
+using Ryujinx.HLE.HOS;
+using Ryujinx.HLE.HOS.Services.Apm;
+using Ryujinx.HLE.HOS.Services.Hid;
+using Ryujinx.HLE.Loaders.Processes;
+using Ryujinx.HLE.Ui;
+using Ryujinx.Memory;
+using System;
+
+namespace Ryujinx.HLE
+{
+ public class Switch : IDisposable
+ {
+ public HLEConfiguration Configuration { get; }
+ public IHardwareDeviceDriver AudioDeviceDriver { get; }
+ public MemoryBlock Memory { get; }
+ public GpuContext Gpu { get; }
+ public VirtualFileSystem FileSystem { get; }
+ public HOS.Horizon System { get; }
+ public ProcessLoader Processes { get; }
+ public PerformanceStatistics Statistics { get; }
+ public Hid Hid { get; }
+ public TamperMachine TamperMachine { get; }
+ public IHostUiHandler UiHandler { get; }
+
+ public bool EnableDeviceVsync { get; set; } = true;
+
+ public bool IsFrameAvailable => Gpu.Window.IsFrameAvailable;
+
+ public Switch(HLEConfiguration configuration)
+ {
+ ArgumentNullException.ThrowIfNull(configuration.GpuRenderer);
+ ArgumentNullException.ThrowIfNull(configuration.AudioDeviceDriver);
+ ArgumentNullException.ThrowIfNull(configuration.UserChannelPersistence);
+
+ Configuration = configuration;
+ FileSystem = Configuration.VirtualFileSystem;
+ UiHandler = Configuration.HostUiHandler;
+
+ MemoryAllocationFlags memoryAllocationFlags = configuration.MemoryManagerMode == MemoryManagerMode.SoftwarePageTable
+ ? MemoryAllocationFlags.Reserve
+ : MemoryAllocationFlags.Reserve | MemoryAllocationFlags.Mirrorable;
+
+ AudioDeviceDriver = new CompatLayerHardwareDeviceDriver(Configuration.AudioDeviceDriver);
+ Memory = new MemoryBlock(Configuration.MemoryConfiguration.ToDramSize(), memoryAllocationFlags);
+ Gpu = new GpuContext(Configuration.GpuRenderer);
+ System = new HOS.Horizon(this);
+ Statistics = new PerformanceStatistics();
+ Hid = new Hid(this, System.HidStorage);
+ Processes = new ProcessLoader(this);
+ TamperMachine = new TamperMachine();
+
+ System.State.SetLanguage(Configuration.SystemLanguage);
+ System.State.SetRegion(Configuration.Region);
+
+ EnableDeviceVsync = Configuration.EnableVsync;
+ System.State.DockedMode = Configuration.EnableDockedMode;
+ System.PerformanceState.PerformanceMode = System.State.DockedMode ? PerformanceMode.Boost : PerformanceMode.Default;
+ System.EnablePtc = Configuration.EnablePtc;
+ System.FsIntegrityCheckLevel = Configuration.FsIntegrityCheckLevel;
+ System.GlobalAccessLogMode = Configuration.FsGlobalAccessLogMode;
+ }
+
+ public bool LoadCart(string exeFsDir, string romFsFile = null)
+ {
+ return Processes.LoadUnpackedNca(exeFsDir, romFsFile);
+ }
+
+ public bool LoadXci(string xciFile)
+ {
+ return Processes.LoadXci(xciFile);
+ }
+
+ public bool LoadNca(string ncaFile)
+ {
+ return Processes.LoadNca(ncaFile);
+ }
+
+ public bool LoadNsp(string nspFile)
+ {
+ return Processes.LoadNsp(nspFile);
+ }
+
+ public bool LoadProgram(string fileName)
+ {
+ return Processes.LoadNxo(fileName);
+ }
+
+ public bool WaitFifo()
+ {
+ return Gpu.GPFifo.WaitForCommands();
+ }
+
+ public void ProcessFrame()
+ {
+ Gpu.ProcessShaderCacheQueue();
+ Gpu.Renderer.PreFrame();
+ Gpu.GPFifo.DispatchCalls();
+ }
+
+ public bool ConsumeFrameAvailable()
+ {
+ return Gpu.Window.ConsumeFrameAvailable();
+ }
+
+ public void PresentFrame(Action swapBuffersCallback)
+ {
+ Gpu.Window.Present(swapBuffersCallback);
+ }
+
+ public void SetVolume(float volume)
+ {
+ System.SetVolume(Math.Clamp(volume, 0, 1));
+ }
+
+ public float GetVolume()
+ {
+ return System.GetVolume();
+ }
+
+ public void EnableCheats()
+ {
+ FileSystem.ModLoader.EnableCheats(Processes.ActiveApplication.ProgramId, TamperMachine);
+ }
+
+ public bool IsAudioMuted()
+ {
+ return System.GetVolume() == 0;
+ }
+
+ public void DisposeGpu()
+ {
+ Gpu.Dispose();
+ }
+
+ public void Dispose()
+ {
+ Dispose(true);
+ }
+
+ protected virtual void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ System.Dispose();
+ AudioDeviceDriver.Dispose();
+ FileSystem.Dispose();
+ Memory.Dispose();
+ }
+ }
+ }
+}