diff --git a/COMPILING.md b/COMPILING.md index c989a50eb..238c1ade8 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -10,7 +10,7 @@ Make sure your SDK version is higher or equal to the required version specified ### Step 2 -Either use `git clone https://github.com/Ryubing/Ryujinx` on the command line to clone the repository or use Code --> Download zip button to get the files. +Either use `git clone https://git.ryujinx.app/ryubing/ryujinx.git` on the command line to clone the repository or use Code --> Download zip button to get the files. ### Step 3 diff --git a/assets/locales.json b/assets/locales.json index f84898591..639aeaebd 100644 --- a/assets/locales.json +++ b/assets/locales.json @@ -6454,7 +6454,7 @@ "he_IL": "", "it_IT": "Voglio ripristinare le mie impostazioni.", "ja_JP": "", - "ko_KR": "설정을 초기화하고 싶습니다.", + "ko_KR": "설정을 초기화하고자 합니다.", "no_NO": "Jeg vil tilbakestille innstillingene mine.", "pl_PL": "", "pt_BR": "Quero redefinir minhas configurações.", diff --git a/src/Ryujinx.Common/Logging/Targets/AsyncLogTargetWrapper.cs b/src/Ryujinx.Common/Logging/Targets/AsyncLogTargetWrapper.cs index 34f52d6ab..63cc63fec 100644 --- a/src/Ryujinx.Common/Logging/Targets/AsyncLogTargetWrapper.cs +++ b/src/Ryujinx.Common/Logging/Targets/AsyncLogTargetWrapper.cs @@ -94,7 +94,7 @@ namespace Ryujinx.Common.Logging.Targets return; } - using var signal = new ManualResetEventSlim(false); + using ManualResetEventSlim signal = new ManualResetEventSlim(false); try { _messageQueue.Add(new FlushEventArgs(signal)); diff --git a/src/Ryujinx.Cpu/IExecutionContext.cs b/src/Ryujinx.Cpu/IExecutionContext.cs index df0c94278..c3ebe5aa5 100644 --- a/src/Ryujinx.Cpu/IExecutionContext.cs +++ b/src/Ryujinx.Cpu/IExecutionContext.cs @@ -42,6 +42,11 @@ namespace Ryujinx.Cpu /// uint Fpsr { get; set; } + /// + /// Floating-point Status and Control Register. + /// + uint Fpscr => Fpsr | Fpcr; + /// /// Indicates whenever the CPU is running 64-bit (AArch64 mode) or 32-bit (AArch32 mode) code. /// diff --git a/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs index dd0f45651..f4a2fac17 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs @@ -205,7 +205,7 @@ namespace Ryujinx.Graphics.Gpu.Shader GpuChannelComputeState computeState, ulong gpuVa) { - if (_cpPrograms.TryGetValue(gpuVa, out var cpShader) && IsShaderEqual(channel, poolState, computeState, cpShader, gpuVa)) + if (_cpPrograms.TryGetValue(gpuVa, out CachedShaderProgram cpShader) && IsShaderEqual(channel, poolState, computeState, cpShader, gpuVa)) { return cpShader; } @@ -252,8 +252,8 @@ namespace Ryujinx.Graphics.Gpu.Shader { channel.TextureManager.UpdateRenderTargets(); - var rtControl = state.RtControl; - var msaaMode = state.RtMsaaMode; + RtControl rtControl = state.RtControl; + TextureMsaaMode msaaMode = state.RtMsaaMode; pipeline.SamplesCount = msaaMode.SamplesInX() * msaaMode.SamplesInY(); @@ -267,7 +267,7 @@ namespace Ryujinx.Graphics.Gpu.Shader { int rtIndex = rtControl.UnpackPermutationIndex(index); - var colorState = rtColorStateSpan[rtIndex]; + RtColorState colorState = rtColorStateSpan[rtIndex]; if (index >= count || colorState.Format == 0 || colorState.WidthOrStride == 0) { @@ -312,12 +312,12 @@ namespace Ryujinx.Graphics.Gpu.Shader ref GpuChannelGraphicsState graphicsState, ShaderAddresses addresses) { - if (_gpPrograms.TryGetValue(addresses, out var gpShaders) && IsShaderEqual(channel, ref poolState, ref graphicsState, gpShaders, addresses)) + if (_gpPrograms.TryGetValue(addresses, out CachedShaderProgram gpShaders) && IsShaderEqual(channel, ref poolState, ref graphicsState, gpShaders, addresses)) { return gpShaders; } - if (_graphicsShaderCache.TryFind(channel, ref poolState, ref graphicsState, addresses, out gpShaders, out var cachedGuestCode)) + if (_graphicsShaderCache.TryFind(channel, ref poolState, ref graphicsState, addresses, out gpShaders, out CachedGraphicsGuestCode cachedGuestCode)) { _gpPrograms[addresses] = gpShaders; return gpShaders; @@ -590,7 +590,7 @@ namespace Ryujinx.Graphics.Gpu.Shader for (int i = 0; i < Constants.TotalTransformFeedbackBuffers; i++) { - var tf = tfStateSpan[i]; + TfState tf = tfStateSpan[i]; descs[i] = new TransformFeedbackDescriptor( tf.BufferIndex, @@ -696,7 +696,7 @@ namespace Ryujinx.Graphics.Gpu.Shader /// The generated translator context public static TranslatorContext DecodeComputeShader(IGpuAccessor gpuAccessor, TargetApi api, ulong gpuVa) { - var options = CreateTranslationOptions(api, DefaultFlags | TranslationFlags.Compute); + TranslationOptions options = CreateTranslationOptions(api, DefaultFlags | TranslationFlags.Compute); return Translator.CreateContext(gpuVa, gpuAccessor, options); } @@ -713,7 +713,7 @@ namespace Ryujinx.Graphics.Gpu.Shader /// The generated translator context public static TranslatorContext DecodeGraphicsShader(IGpuAccessor gpuAccessor, TargetApi api, TranslationFlags flags, ulong gpuVa) { - var options = CreateTranslationOptions(api, flags); + TranslationOptions options = CreateTranslationOptions(api, flags); return Translator.CreateContext(gpuVa, gpuAccessor, options); } @@ -739,7 +739,7 @@ namespace Ryujinx.Graphics.Gpu.Shader { ulong cb1DataAddress = channel.BufferManager.GetGraphicsUniformBufferAddress(0, 1); - var memoryManager = channel.MemoryManager; + MemoryManager memoryManager = channel.MemoryManager; codeA ??= memoryManager.GetSpan(vertexA.Address, vertexA.Size).ToArray(); codeB ??= memoryManager.GetSpan(currentStage.Address, currentStage.Size).ToArray(); @@ -777,7 +777,7 @@ namespace Ryujinx.Graphics.Gpu.Shader /// Compiled graphics shader code private static TranslatedShader TranslateShader(ShaderDumper dumper, GpuChannel channel, TranslatorContext context, byte[] code, bool asCompute) { - var memoryManager = channel.MemoryManager; + MemoryManager memoryManager = channel.MemoryManager; ulong cb1DataAddress = context.Stage == ShaderStage.Compute ? channel.BufferManager.GetComputeUniformBufferAddress(1) diff --git a/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs b/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs index 94691a5b4..2d366be71 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs @@ -93,7 +93,7 @@ namespace Ryujinx.Graphics.Shader.Translation size = DefaultLocalMemorySize; } - var lmem = new MemoryDefinition("local_memory", AggregateType.Array | AggregateType.U32, BitUtils.DivRoundUp(size, sizeof(uint))); + MemoryDefinition lmem = new MemoryDefinition("local_memory", AggregateType.Array | AggregateType.U32, BitUtils.DivRoundUp(size, sizeof(uint))); LocalMemoryId = Properties.AddLocalMemory(lmem); } @@ -112,7 +112,7 @@ namespace Ryujinx.Graphics.Shader.Translation size = DefaultSharedMemorySize; } - var smem = new MemoryDefinition("shared_memory", AggregateType.Array | AggregateType.U32, BitUtils.DivRoundUp(size, sizeof(uint))); + MemoryDefinition smem = new MemoryDefinition("shared_memory", AggregateType.Array | AggregateType.U32, BitUtils.DivRoundUp(size, sizeof(uint))); SharedMemoryId = Properties.AddSharedMemory(smem); } @@ -273,16 +273,16 @@ namespace Ryujinx.Graphics.Shader.Translation bool coherent, bool separate) { - var dimensions = type == SamplerType.None ? 0 : type.GetDimensions(); - var dict = isImage ? _usedImages : _usedTextures; + int dimensions = type == SamplerType.None ? 0 : type.GetDimensions(); + Dictionary dict = isImage ? _usedImages : _usedTextures; - var usageFlags = TextureUsageFlags.None; + TextureUsageFlags usageFlags = TextureUsageFlags.None; if (intCoords) { usageFlags |= TextureUsageFlags.NeedsScaleValue; - var canScale = _stage.SupportsRenderScale() && arrayLength == 1 && !write && dimensions == 2; + bool canScale = _stage.SupportsRenderScale() && arrayLength == 1 && !write && dimensions == 2; if (!canScale) { @@ -304,9 +304,9 @@ namespace Ryujinx.Graphics.Shader.Translation // For array textures, we also want to use type as key, // since we may have texture handles stores in the same buffer, but for textures with different types. - var keyType = arrayLength > 1 ? type : SamplerType.None; - var info = new TextureInfo(cbufSlot, handle, arrayLength, separate, keyType, format); - var meta = new TextureMeta() + SamplerType keyType = arrayLength > 1 ? type : SamplerType.None; + TextureInfo info = new TextureInfo(cbufSlot, handle, arrayLength, separate, keyType, format); + TextureMeta meta = new TextureMeta() { AccurateType = accurateType, Type = type, @@ -316,7 +316,7 @@ namespace Ryujinx.Graphics.Shader.Translation int setIndex; int binding; - if (dict.TryGetValue(info, out var existingMeta)) + if (dict.TryGetValue(info, out TextureMeta existingMeta)) { dict[info] = MergeTextureMeta(meta, existingMeta); setIndex = existingMeta.Set; @@ -373,7 +373,7 @@ namespace Ryujinx.Graphics.Shader.Translation nameSuffix = cbufSlot < 0 ? $"{prefix}_tcb_{handle:X}" : $"{prefix}_cb{cbufSlot}_{handle:X}"; } - var definition = new TextureDefinition( + TextureDefinition definition = new TextureDefinition( setIndex, binding, arrayLength, @@ -433,8 +433,8 @@ namespace Ryujinx.Graphics.Shader.Translation { selectedMeta.UsageFlags |= TextureUsageFlags.NeedsScaleValue; - var dimensions = type.GetDimensions(); - var canScale = _stage.SupportsRenderScale() && selectedInfo.ArrayLength == 1 && dimensions == 2; + int dimensions = type.GetDimensions(); + bool canScale = _stage.SupportsRenderScale() && selectedInfo.ArrayLength == 1 && dimensions == 2; if (!canScale) { @@ -454,7 +454,7 @@ namespace Ryujinx.Graphics.Shader.Translation public BufferDescriptor[] GetConstantBufferDescriptors() { - var descriptors = new BufferDescriptor[_usedConstantBufferBindings.Count]; + BufferDescriptor[] descriptors = new BufferDescriptor[_usedConstantBufferBindings.Count]; int descriptorIndex = 0; @@ -478,7 +478,7 @@ namespace Ryujinx.Graphics.Shader.Translation public BufferDescriptor[] GetStorageBufferDescriptors() { - var descriptors = new BufferDescriptor[_sbSlots.Count]; + BufferDescriptor[] descriptors = new BufferDescriptor[_sbSlots.Count]; int descriptorIndex = 0; diff --git a/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs b/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs index dd1325f8a..e1ca22610 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs @@ -242,8 +242,8 @@ namespace Ryujinx.Graphics.Shader.Translation usedFeatures |= FeatureFlags.VtgAsCompute; } - var cfgs = new ControlFlowGraph[functions.Length]; - var frus = new RegisterUsage.FunctionRegisterUsage[functions.Length]; + ControlFlowGraph[] cfgs = new ControlFlowGraph[functions.Length]; + RegisterUsage.FunctionRegisterUsage[] frus = new RegisterUsage.FunctionRegisterUsage[functions.Length]; for (int i = 0; i < functions.Length; i++) { @@ -266,14 +266,14 @@ namespace Ryujinx.Graphics.Shader.Translation for (int i = 0; i < functions.Length; i++) { - var cfg = cfgs[i]; + ControlFlowGraph cfg = cfgs[i]; int inArgumentsCount = 0; int outArgumentsCount = 0; if (i != 0) { - var fru = frus[i]; + RegisterUsage.FunctionRegisterUsage fru = frus[i]; inArgumentsCount = fru.InArguments.Length; outArgumentsCount = fru.OutArguments.Length; @@ -325,7 +325,7 @@ namespace Ryujinx.Graphics.Shader.Translation FeatureFlags usedFeatures, byte clipDistancesWritten) { - var sInfo = StructuredProgram.MakeStructuredProgram( + StructuredProgramInfo sInfo = StructuredProgram.MakeStructuredProgram( funcs, attributeUsage, definitions, @@ -340,7 +340,7 @@ namespace Ryujinx.Graphics.Shader.Translation _ => 1 }; - var info = new ShaderProgramInfo( + ShaderProgramInfo info = new ShaderProgramInfo( resourceManager.GetConstantBufferDescriptors(), resourceManager.GetStorageBufferDescriptors(), resourceManager.GetTextureDescriptors(), @@ -356,7 +356,7 @@ namespace Ryujinx.Graphics.Shader.Translation clipDistancesWritten, originalDefinitions.OmapTargets); - var hostCapabilities = new HostCapabilities( + HostCapabilities hostCapabilities = new HostCapabilities( GpuAccessor.QueryHostReducedPrecision(), GpuAccessor.QueryHostSupportsFragmentShaderInterlock(), GpuAccessor.QueryHostSupportsFragmentShaderOrderingIntel(), @@ -367,7 +367,7 @@ namespace Ryujinx.Graphics.Shader.Translation GpuAccessor.QueryHostSupportsTextureShadowLod(), GpuAccessor.QueryHostSupportsViewportMask()); - var parameters = new CodeGenParameters(attributeUsage, definitions, resourceManager.Properties, hostCapabilities, GpuAccessor, Options.TargetApi); + CodeGenParameters parameters = new CodeGenParameters(attributeUsage, definitions, resourceManager.Properties, hostCapabilities, GpuAccessor, Options.TargetApi); return Options.TargetLanguage switch { @@ -486,10 +486,10 @@ namespace Ryujinx.Graphics.Shader.Translation public ShaderProgram GenerateVertexPassthroughForCompute() { - var attributeUsage = new AttributeUsage(GpuAccessor); - var resourceManager = new ResourceManager(ShaderStage.Vertex, GpuAccessor); + AttributeUsage attributeUsage = new AttributeUsage(GpuAccessor); + ResourceManager resourceManager = new ResourceManager(ShaderStage.Vertex, GpuAccessor); - var reservations = GetResourceReservations(); + ResourceReservations reservations = GetResourceReservations(); int vertexInfoCbBinding = reservations.VertexInfoConstantBufferBinding; @@ -508,7 +508,7 @@ namespace Ryujinx.Graphics.Shader.Translation BufferDefinition vertexOutputBuffer = new(BufferLayout.Std430, 1, vertexDataSbBinding, "vb_input", vertexInputStruct); resourceManager.Properties.AddOrUpdateStorageBuffer(vertexOutputBuffer); - var context = new EmitterContext(); + EmitterContext context = new EmitterContext(); Operand vertexIndex = Options.TargetApi == TargetApi.OpenGL ? context.Load(StorageKind.Input, IoVariable.VertexId) @@ -553,13 +553,13 @@ namespace Ryujinx.Graphics.Shader.Translation } } - var operations = context.GetOperations(); - var cfg = ControlFlowGraph.Create(operations); - var function = new Function(cfg.Blocks, "main", false, 0, 0); + Operation[] operations = context.GetOperations(); + ControlFlowGraph cfg = ControlFlowGraph.Create(operations); + Function function = new Function(cfg.Blocks, "main", false, 0, 0); - var transformFeedbackOutputs = GetTransformFeedbackOutputs(GpuAccessor, out ulong transformFeedbackVecMap); + TransformFeedbackOutput[] transformFeedbackOutputs = GetTransformFeedbackOutputs(GpuAccessor, out ulong transformFeedbackVecMap); - var definitions = new ShaderDefinitions(ShaderStage.Vertex, transformFeedbackVecMap, transformFeedbackOutputs) + ShaderDefinitions definitions = new ShaderDefinitions(ShaderStage.Vertex, transformFeedbackVecMap, transformFeedbackOutputs) { LastInVertexPipeline = true }; @@ -604,10 +604,10 @@ namespace Ryujinx.Graphics.Shader.Translation break; } - var attributeUsage = new AttributeUsage(GpuAccessor); - var resourceManager = new ResourceManager(ShaderStage.Geometry, GpuAccessor); + AttributeUsage attributeUsage = new AttributeUsage(GpuAccessor); + ResourceManager resourceManager = new ResourceManager(ShaderStage.Geometry, GpuAccessor); - var context = new EmitterContext(); + EmitterContext context = new EmitterContext(); for (int v = 0; v < maxOutputVertices; v++) { @@ -648,11 +648,11 @@ namespace Ryujinx.Graphics.Shader.Translation context.EndPrimitive(); - var operations = context.GetOperations(); - var cfg = ControlFlowGraph.Create(operations); - var function = new Function(cfg.Blocks, "main", false, 0, 0); + Operation[] operations = context.GetOperations(); + ControlFlowGraph cfg = ControlFlowGraph.Create(operations); + Function function = new Function(cfg.Blocks, "main", false, 0, 0); - var definitions = new ShaderDefinitions( + ShaderDefinitions definitions = new ShaderDefinitions( ShaderStage.Geometry, GpuAccessor.QueryGraphicsState(), false, diff --git a/src/Ryujinx.Graphics.Vulkan/HelperShader.cs b/src/Ryujinx.Graphics.Vulkan/HelperShader.cs index 695046198..c75561690 100644 --- a/src/Ryujinx.Graphics.Vulkan/HelperShader.cs +++ b/src/Ryujinx.Graphics.Vulkan/HelperShader.cs @@ -904,8 +904,8 @@ namespace Ryujinx.Graphics.Vulkan pattern.OffsetIndex.CopyTo(shaderParams[..pattern.OffsetIndex.Length]); - using var patternScoped = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize); - var patternBuffer = patternScoped.Holder; + using ScopedTemporaryBuffer patternScoped = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize); + BufferHolder patternBuffer = patternScoped.Holder; patternBuffer.SetDataUnchecked(patternScoped.Offset, shaderParams); diff --git a/src/Ryujinx.HLE/Debugger/BreakpointManager.cs b/src/Ryujinx.HLE/Debugger/BreakpointManager.cs index 7f45fbf8b..616f959d2 100644 --- a/src/Ryujinx.HLE/Debugger/BreakpointManager.cs +++ b/src/Ryujinx.HLE/Debugger/BreakpointManager.cs @@ -1,9 +1,7 @@ -using Ryujinx.Common; using Ryujinx.Common.Logging; -using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.Memory; using System.Collections.Concurrent; -using System.Linq; +using System.Collections.Generic; namespace Ryujinx.HLE.Debugger { @@ -55,7 +53,7 @@ namespace Ryujinx.HLE.Debugger return false; } - var originalInstruction = new byte[length]; + byte[] originalInstruction = new byte[length]; if (!ReadMemory(address, originalInstruction)) { Logger.Error?.Print(LogClass.GdbStub, $"Failed to read memory at 0x{address:X16} to set breakpoint."); @@ -68,7 +66,7 @@ namespace Ryujinx.HLE.Debugger return false; } - var breakpoint = new Breakpoint(originalInstruction); + Breakpoint breakpoint = new(originalInstruction); if (_breakpoints.TryAdd(address, breakpoint)) { Logger.Debug?.Print(LogClass.GdbStub, $"Breakpoint set at 0x{address:X16}"); @@ -109,7 +107,7 @@ namespace Ryujinx.HLE.Debugger /// public void ClearAll() { - foreach (var bp in _breakpoints) + foreach (KeyValuePair bp in _breakpoints) { if (!WriteMemory(bp.Key, bp.Value.OriginalData)) { diff --git a/src/Ryujinx.HLE/Debugger/Debugger.MainThread.cs b/src/Ryujinx.HLE/Debugger/Debugger.MainThread.cs index 2e1f40120..c4ec001bf 100644 --- a/src/Ryujinx.HLE/Debugger/Debugger.MainThread.cs +++ b/src/Ryujinx.HLE/Debugger/Debugger.MainThread.cs @@ -64,10 +64,10 @@ namespace Ryujinx.HLE.Debugger Logger.Notice.Print(LogClass.GdbStub, "NACK received!"); continue; case '\x03': - _messages.Add(new BreakInMessage()); + _messages.Add(StatelessMessage.BreakIn); break; case '$': - string cmd = ""; + string cmd = string.Empty; while (true) { int x = _readStream.ReadByte(); @@ -85,7 +85,7 @@ namespace Ryujinx.HLE.Debugger } else { - _messages.Add(new SendNackMessage()); + _messages.Add(StatelessMessage.SendNack); } break; diff --git a/src/Ryujinx.HLE/Debugger/Debugger.MessageHandler.cs b/src/Ryujinx.HLE/Debugger/Debugger.MessageHandler.cs new file mode 100644 index 000000000..4e2cdc237 --- /dev/null +++ b/src/Ryujinx.HLE/Debugger/Debugger.MessageHandler.cs @@ -0,0 +1,58 @@ +using Ryujinx.Common.Logging; +using System; +using System.IO; + +namespace Ryujinx.HLE.Debugger +{ + public partial class Debugger + { + private void MessageHandlerMain() + { + while (!_shuttingDown) + { + try + { + switch (_messages.Take()) + { + case StatelessMessage { Type: MessageType.BreakIn }: + Logger.Notice.Print(LogClass.GdbStub, "Break-in requested"); + _commands.Interrupt(); + break; + + case StatelessMessage { Type: MessageType.SendNack }: + _writeStream.WriteByte((byte)'-'); + break; + + case StatelessMessage { Type: MessageType.Kill }: + return; + + case CommandMessage { Command: { } cmd }: + Logger.Debug?.Print(LogClass.GdbStub, $"Received Command: {cmd}"); + _writeStream.WriteByte((byte)'+'); + _commandProcessor.Process(cmd); + break; + + case ThreadBreakMessage { Context: { } ctx }: + DebugProcess.DebugStop(); + GThread = CThread = ctx.ThreadUid; + _breakHandlerEvent.Set(); + _commandProcessor.Reply($"T05thread:{ctx.ThreadUid:x};"); + break; + } + } + catch (IOException e) + { + Logger.Error?.Print(LogClass.GdbStub, "Error while processing GDB messages", e); + } + catch (NullReferenceException e) + { + Logger.Error?.Print(LogClass.GdbStub, "Error while processing GDB messages", e); + } + catch (ObjectDisposedException e) + { + Logger.Error?.Print(LogClass.GdbStub, "Error while processing GDB messages", e); + } + } + } + } +} diff --git a/src/Ryujinx.HLE/Debugger/Debugger.Rcmd.cs b/src/Ryujinx.HLE/Debugger/Debugger.Rcmd.cs new file mode 100644 index 000000000..ef1d7f394 --- /dev/null +++ b/src/Ryujinx.HLE/Debugger/Debugger.Rcmd.cs @@ -0,0 +1,104 @@ +using Ryujinx.Common.Logging; +using Ryujinx.HLE.HOS.Kernel.Process; +using Ryujinx.HLE.HOS.Kernel.Threading; +using System; +using System.Text; + +namespace Ryujinx.HLE.Debugger +{ + public partial class Debugger + { + public string GetStackTrace() + { + if (GThread == null) + return "No thread selected\n"; + + return Process?.Debugger?.GetGuestStackTrace(DebugProcess.GetThread(GThread.Value)) ?? "No application process found\n"; + } + + public string GetRegisters() + { + if (GThread == null) + return "No thread selected\n"; + + return Process?.Debugger?.GetCpuRegisterPrintout(DebugProcess.GetThread(GThread.Value)) ?? "No application process found\n"; + } + + public string GetMinidump() + { + StringBuilder response = new(); + response.AppendLine("=== Begin Minidump ===\n"); + response.AppendLine(GetProcessInfo()); + + foreach (KThread thread in GetThreads()) + { + response.AppendLine($"=== Thread {thread.ThreadUid} ==="); + try + { + string stackTrace = Process.Debugger.GetGuestStackTrace(thread); + response.AppendLine(stackTrace); + } + catch (Exception e) + { + response.AppendLine($"[Error getting stack trace: {e.Message}]"); + } + + try + { + string registers = Process.Debugger.GetCpuRegisterPrintout(thread); + response.AppendLine(registers); + } + catch (Exception e) + { + response.AppendLine($"[Error getting registers: {e.Message}]"); + } + } + + response.AppendLine("=== End Minidump ==="); + + Logger.Info?.Print(LogClass.GdbStub, response.ToString()); + return response.ToString(); + } + + public string GetProcessInfo() + { + try + { + if (Process is not { } kProcess) + return "No application process found\n"; + + StringBuilder sb = new(); + + sb.AppendLine($"Program Id: 0x{kProcess.TitleId:x16}"); + sb.AppendLine($"Application: {(kProcess.IsApplication ? 1 : 0)}"); + sb.AppendLine("Layout:"); + sb.AppendLine( + $" Alias: 0x{kProcess.MemoryManager.AliasRegionStart:x10} - 0x{kProcess.MemoryManager.AliasRegionEnd - 1:x10}"); + sb.AppendLine( + $" Heap: 0x{kProcess.MemoryManager.HeapRegionStart:x10} - 0x{kProcess.MemoryManager.HeapRegionEnd - 1:x10}"); + sb.AppendLine( + $" Aslr: 0x{kProcess.MemoryManager.AslrRegionStart:x10} - 0x{kProcess.MemoryManager.AslrRegionEnd - 1:x10}"); + sb.AppendLine( + $" Stack: 0x{kProcess.MemoryManager.StackRegionStart:x10} - 0x{kProcess.MemoryManager.StackRegionEnd - 1:x10}"); + + sb.AppendLine("Modules:"); + HleProcessDebugger debugger = kProcess.Debugger; + if (debugger != null) + { + foreach (HleProcessDebugger.Image image in debugger.GetLoadedImages()) + { + ulong endAddress = image.BaseAddress + image.Size - 1; + sb.AppendLine($" 0x{image.BaseAddress:x10} - 0x{endAddress:x10} {image.Name}"); + } + } + + return sb.ToString(); + } + catch (Exception e) + { + Logger.Error?.Print(LogClass.GdbStub, $"Error getting process info: {e.Message}"); + return $"Error getting process info: {e.Message}\n"; + } + } + } +} diff --git a/src/Ryujinx.HLE/Debugger/Debugger.cs b/src/Ryujinx.HLE/Debugger/Debugger.cs index e8eef26a3..6a5da60ee 100644 --- a/src/Ryujinx.HLE/Debugger/Debugger.cs +++ b/src/Ryujinx.HLE/Debugger/Debugger.cs @@ -57,172 +57,24 @@ namespace Ryujinx.HLE.Debugger internal KProcess Process => Device.System?.DebugGetApplicationProcess(); internal IDebuggableProcess DebugProcess => Device.System?.DebugGetApplicationProcessDebugInterface(); - internal KThread[] GetThreads() => - DebugProcess.GetThreadUids().Select(x => DebugProcess.GetThread(x)).ToArray(); + internal KThread[] GetThreads() => DebugProcess.ThreadUids.Select(DebugProcess.GetThread).ToArray(); internal bool IsProcess32Bit => DebugProcess.GetThread(GThread.Value).Context.IsAarch32; - - private void MessageHandlerMain() - { - while (!_shuttingDown) - { - IMessage msg = _messages.Take(); - try - { - switch (msg) - { - case BreakInMessage: - Logger.Notice.Print(LogClass.GdbStub, "Break-in requested"); - _commandProcessor.Commands.Interrupt(); - break; - - case SendNackMessage: - _writeStream.WriteByte((byte)'-'); - break; - - case CommandMessage { Command: var cmd }: - Logger.Debug?.Print(LogClass.GdbStub, $"Received Command: {cmd}"); - _writeStream.WriteByte((byte)'+'); - _commandProcessor.Process(cmd); - break; - - case ThreadBreakMessage { Context: var ctx }: - DebugProcess.DebugStop(); - GThread = CThread = ctx.ThreadUid; - _breakHandlerEvent.Set(); - _commandProcessor.Reply($"T05thread:{ctx.ThreadUid:x};"); - break; - - case KillMessage: - return; - } - } - catch (IOException e) - { - Logger.Error?.Print(LogClass.GdbStub, "Error while processing GDB messages", e); - } - catch (NullReferenceException e) - { - Logger.Error?.Print(LogClass.GdbStub, "Error while processing GDB messages", e); - } - catch (ObjectDisposedException e) - { - Logger.Error?.Print(LogClass.GdbStub, "Error while processing GDB messages", e); - } - } - } - - internal bool WriteRegister(IExecutionContext ctx, int gdbRegId, StringStream ss) => + + internal bool WriteRegister(IExecutionContext ctx, int registerId, StringStream ss) => IsProcess32Bit - ? ctx.WriteRegister32(gdbRegId, ss) - : ctx.WriteRegister64(gdbRegId, ss); + ? ctx.WriteRegister32(registerId, ss) + : ctx.WriteRegister64(registerId, ss); - internal string ReadRegister(IExecutionContext ctx, int gdbRegId) => + internal string ReadRegister(IExecutionContext ctx, int registerId) => IsProcess32Bit - ? ctx.ReadRegister32(gdbRegId) - : ctx.ReadRegister64(gdbRegId); - - public string GetStackTrace() - { - if (GThread == null) - return "No thread selected\n"; - - return Process?.Debugger?.GetGuestStackTrace(DebugProcess.GetThread(GThread.Value)) ?? "No application process found\n"; - } - - public string GetRegisters() - { - if (GThread == null) - return "No thread selected\n"; - - return Process?.Debugger?.GetCpuRegisterPrintout(DebugProcess.GetThread(GThread.Value)) ?? "No application process found\n"; - } - - public string GetMinidump() - { - var response = new StringBuilder(); - response.AppendLine("=== Begin Minidump ===\n"); - response.AppendLine(GetProcessInfo()); - - foreach (var thread in GetThreads()) - { - response.AppendLine($"=== Thread {thread.ThreadUid} ==="); - try - { - string stackTrace = Process.Debugger.GetGuestStackTrace(thread); - response.AppendLine(stackTrace); - } - catch (Exception e) - { - response.AppendLine($"[Error getting stack trace: {e.Message}]"); - } - - try - { - string registers = Process.Debugger.GetCpuRegisterPrintout(thread); - response.AppendLine(registers); - } - catch (Exception e) - { - response.AppendLine($"[Error getting registers: {e.Message}]"); - } - } - - response.AppendLine("=== End Minidump ==="); - - Logger.Info?.Print(LogClass.GdbStub, response.ToString()); - return response.ToString(); - } - - public string GetProcessInfo() - { - try - { - if (Process == null) - return "No application process found\n"; - - KProcess kProcess = Process; - - var sb = new StringBuilder(); - - sb.AppendLine($"Program Id: 0x{kProcess.TitleId:x16}"); - sb.AppendLine($"Application: {(kProcess.IsApplication ? 1 : 0)}"); - sb.AppendLine("Layout:"); - sb.AppendLine( - $" Alias: 0x{kProcess.MemoryManager.AliasRegionStart:x10} - 0x{kProcess.MemoryManager.AliasRegionEnd - 1:x10}"); - sb.AppendLine( - $" Heap: 0x{kProcess.MemoryManager.HeapRegionStart:x10} - 0x{kProcess.MemoryManager.HeapRegionEnd - 1:x10}"); - sb.AppendLine( - $" Aslr: 0x{kProcess.MemoryManager.AslrRegionStart:x10} - 0x{kProcess.MemoryManager.AslrRegionEnd - 1:x10}"); - sb.AppendLine( - $" Stack: 0x{kProcess.MemoryManager.StackRegionStart:x10} - 0x{kProcess.MemoryManager.StackRegionEnd - 1:x10}"); - - sb.AppendLine("Modules:"); - var debugger = kProcess.Debugger; - if (debugger != null) - { - var images = debugger.GetLoadedImages(); - for (int i = 0; i < images.Count; i++) - { - var image = images[i]; - ulong endAddress = image.BaseAddress + image.Size - 1; - string name = image.Name; - sb.AppendLine($" 0x{image.BaseAddress:x10} - 0x{endAddress:x10} {name}"); - } - } - - return sb.ToString(); - } - catch (Exception e) - { - Logger.Error?.Print(LogClass.GdbStub, $"Error getting process info: {e.Message}"); - return $"Error getting process info: {e.Message}\n"; - } - } + ? ctx.ReadRegister32(registerId) + : ctx.ReadRegister64(registerId); public void Dispose() { Dispose(true); + GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) @@ -237,7 +89,7 @@ namespace Ryujinx.HLE.Debugger _readStream?.Close(); _writeStream?.Close(); _debuggerThread.Join(); - _messages.Add(new KillMessage()); + _messages.Add(StatelessMessage.Kill); _messageHandlerThread.Join(); _messages.Dispose(); _breakHandlerEvent.Dispose(); diff --git a/src/Ryujinx.HLE/Debugger/Gdb/CommandProcessor.cs b/src/Ryujinx.HLE/Debugger/Gdb/CommandProcessor.cs index 997b635e4..a07dafd1c 100644 --- a/src/Ryujinx.HLE/Debugger/Gdb/CommandProcessor.cs +++ b/src/Ryujinx.HLE/Debugger/Gdb/CommandProcessor.cs @@ -53,7 +53,7 @@ namespace Ryujinx.HLE.Debugger.Gdb switch (ss.ReadChar()) { case '!': - if (!ss.IsEmpty()) + if (!ss.IsEmpty) { goto unknownCommand; } @@ -62,7 +62,7 @@ namespace Ryujinx.HLE.Debugger.Gdb ReplyOK(); break; case '?': - if (!ss.IsEmpty()) + if (!ss.IsEmpty) { goto unknownCommand; } @@ -70,10 +70,10 @@ namespace Ryujinx.HLE.Debugger.Gdb Commands.Query(); break; case 'c': - Commands.Continue(ss.IsEmpty() ? null : ss.ReadRemainingAsHex()); + Commands.Continue(ss.IsEmpty ? null : ss.ReadRemainingAsHex()); break; case 'D': - if (!ss.IsEmpty()) + if (!ss.IsEmpty) { goto unknownCommand; } @@ -81,7 +81,7 @@ namespace Ryujinx.HLE.Debugger.Gdb Commands.Detach(); break; case 'g': - if (!ss.IsEmpty()) + if (!ss.IsEmpty) { goto unknownCommand; } @@ -172,7 +172,7 @@ namespace Ryujinx.HLE.Debugger.Gdb if (ss.ConsumeRemaining("fThreadInfo")) { Reply( - $"m{Debugger.DebugProcess.GetThreadUids().Select(x => $"{x:x}").JoinToString(",")}"); + $"m{Debugger.DebugProcess.ThreadUids.Select(x => $"{x:x}").JoinToString(",")}"); break; } @@ -225,7 +225,7 @@ namespace Ryujinx.HLE.Debugger.Gdb if (len >= (ulong)data.Length - offset) { - Reply("l" + Helpers.ToBinaryFormat(data.Substring((int)offset))); + Reply("l" + Helpers.ToBinaryFormat(data[(int)offset..])); } else { @@ -274,7 +274,7 @@ namespace Ryujinx.HLE.Debugger.Gdb case 'Q': goto unknownCommand; case 's': - Commands.Step(ss.IsEmpty() ? null : ss.ReadRemainingAsHex()); + Commands.Step(ss.IsEmpty ? null : ss.ReadRemainingAsHex()); break; case 'T': { diff --git a/src/Ryujinx.HLE/Debugger/Gdb/Commands.cs b/src/Ryujinx.HLE/Debugger/Gdb/Commands.cs index 6468e1452..0220e259f 100644 --- a/src/Ryujinx.HLE/Debugger/Gdb/Commands.cs +++ b/src/Ryujinx.HLE/Debugger/Gdb/Commands.cs @@ -53,7 +53,7 @@ namespace Ryujinx.HLE.Debugger.Gdb { // GDB is performing initial contact. Stop everything. Debugger.DebugProcess.DebugStop(); - Debugger.GThread = Debugger.CThread = Debugger.DebugProcess.GetThreadUids().First(); + Debugger.GThread = Debugger.CThread = Debugger.DebugProcess.ThreadUids.First(); Processor.Reply($"T05thread:{Debugger.CThread:x};"); } @@ -63,7 +63,7 @@ namespace Ryujinx.HLE.Debugger.Gdb Debugger.DebugProcess.DebugStop(); if (Debugger.GThread == null || Debugger.GetThreads().All(x => x.ThreadUid != Debugger.GThread.Value)) { - Debugger.GThread = Debugger.CThread = Debugger.DebugProcess.GetThreadUids().First(); + Debugger.GThread = Debugger.CThread = Debugger.DebugProcess.ThreadUids.First(); } Processor.Reply($"T02thread:{Debugger.GThread:x};"); @@ -151,7 +151,7 @@ namespace Ryujinx.HLE.Debugger.Gdb } } - Processor.Reply(ss.IsEmpty()); + Processor.Reply(ss.IsEmpty); } internal void SetThread(char op, ulong? threadId) @@ -194,7 +194,7 @@ namespace Ryujinx.HLE.Debugger.Gdb { try { - var data = new byte[len]; + byte[] data = new byte[len]; Debugger.DebugProcess.CpuMemory.Read(addr, data); Processor.Reply(Helpers.ToHex(data)); } @@ -211,7 +211,7 @@ namespace Ryujinx.HLE.Debugger.Gdb { try { - var data = new byte[len]; + byte[] data = new byte[len]; for (ulong i = 0; i < len; i++) { data[i] = (byte)ss.ReadLengthAsHex(2); @@ -251,7 +251,7 @@ namespace Ryujinx.HLE.Debugger.Gdb IExecutionContext ctx = Debugger.DebugProcess.GetThread(Debugger.GThread.Value).Context; - Processor.Reply(Debugger.WriteRegister(ctx, gdbRegId, ss) && ss.IsEmpty()); + Processor.Reply(Debugger.WriteRegister(ctx, gdbRegId, ss) && ss.IsEmpty); } internal void Step(ulong? newPc) diff --git a/src/Ryujinx.HLE/Debugger/Gdb/Registers.cs b/src/Ryujinx.HLE/Debugger/Gdb/Registers.cs index ebd89459f..31203b62b 100644 --- a/src/Ryujinx.HLE/Debugger/Gdb/Registers.cs +++ b/src/Ryujinx.HLE/Debugger/Gdb/Registers.cs @@ -13,65 +13,56 @@ namespace Ryujinx.HLE.Debugger.Gdb */ private const uint FpcrMask = 0xfc1fffff; - public static string ReadRegister64(this IExecutionContext state, int gdbRegId) - { - switch (gdbRegId) + public static string ReadRegister64(this IExecutionContext state, int registerId) => + registerId switch { - case >= 0 and <= 31: - return Helpers.ToHex(BitConverter.GetBytes(state.GetX(gdbRegId))); - case 32: - return Helpers.ToHex(BitConverter.GetBytes(state.DebugPc)); - case 33: - return Helpers.ToHex(BitConverter.GetBytes(state.Pstate)); - case >= 34 and <= 65: - return Helpers.ToHex(state.GetV(gdbRegId - 34).ToArray()); - case 66: - return Helpers.ToHex(BitConverter.GetBytes((uint)state.Fpsr)); - case 67: - return Helpers.ToHex(BitConverter.GetBytes((uint)state.Fpcr)); - default: - return null; - } - } + >= 0 and <= 31 => Helpers.ToHex(BitConverter.GetBytes(state.GetX(registerId))), + 32 => Helpers.ToHex(BitConverter.GetBytes(state.DebugPc)), + 33 => Helpers.ToHex(BitConverter.GetBytes(state.Pstate)), + >= 34 and <= 65 => Helpers.ToHex(state.GetV(registerId - 34).ToArray()), + 66 => Helpers.ToHex(BitConverter.GetBytes((uint)state.Fpsr)), + 67 => Helpers.ToHex(BitConverter.GetBytes((uint)state.Fpcr)), + _ => null + }; - public static bool WriteRegister64(this IExecutionContext state, int gdbRegId, StringStream ss) + public static bool WriteRegister64(this IExecutionContext state, int registerId, StringStream ss) { - switch (gdbRegId) + switch (registerId) { case >= 0 and <= 31: { - ulong value = ss.ReadLengthAsLEHex(16); - state.SetX(gdbRegId, value); + ulong value = ss.ReadLengthAsLittleEndianHex(16); + state.SetX(registerId, value); return true; } case 32: { - ulong value = ss.ReadLengthAsLEHex(16); + ulong value = ss.ReadLengthAsLittleEndianHex(16); state.DebugPc = value; return true; } case 33: { - ulong value = ss.ReadLengthAsLEHex(8); + ulong value = ss.ReadLengthAsLittleEndianHex(8); state.Pstate = (uint)value; return true; } case >= 34 and <= 65: { - ulong value0 = ss.ReadLengthAsLEHex(16); - ulong value1 = ss.ReadLengthAsLEHex(16); - state.SetV(gdbRegId - 34, new V128(value0, value1)); + ulong value0 = ss.ReadLengthAsLittleEndianHex(16); + ulong value1 = ss.ReadLengthAsLittleEndianHex(16); + state.SetV(registerId - 34, new V128(value0, value1)); return true; } case 66: { - ulong value = ss.ReadLengthAsLEHex(8); + ulong value = ss.ReadLengthAsLittleEndianHex(8); state.Fpsr = (uint)value; return true; } case 67: { - ulong value = ss.ReadLengthAsLEHex(8); + ulong value = ss.ReadLengthAsLittleEndianHex(8); state.Fpcr = (uint)value; return true; } @@ -80,65 +71,64 @@ namespace Ryujinx.HLE.Debugger.Gdb } } - public static string ReadRegister32(this IExecutionContext state, int gdbRegId) + public static string ReadRegister32(this IExecutionContext state, int registerId) { - switch (gdbRegId) + switch (registerId) { case >= 0 and <= 14: - return Helpers.ToHex(BitConverter.GetBytes((uint)state.GetX(gdbRegId))); + return Helpers.ToHex(BitConverter.GetBytes((uint)state.GetX(registerId))); case 15: return Helpers.ToHex(BitConverter.GetBytes((uint)state.DebugPc)); case 16: - return Helpers.ToHex(BitConverter.GetBytes((uint)state.Pstate)); + return Helpers.ToHex(BitConverter.GetBytes(state.Pstate)); case >= 17 and <= 32: - return Helpers.ToHex(state.GetV(gdbRegId - 17).ToArray()); + return Helpers.ToHex(state.GetV(registerId - 17).ToArray()); case >= 33 and <= 64: - int reg = (gdbRegId - 33); + int reg = (registerId - 33); int n = reg / 2; int shift = reg % 2; ulong value = state.GetV(n).Extract(shift); return Helpers.ToHex(BitConverter.GetBytes(value)); case 65: - uint fpscr = (uint)state.Fpsr | (uint)state.Fpcr; - return Helpers.ToHex(BitConverter.GetBytes(fpscr)); + return Helpers.ToHex(BitConverter.GetBytes(state.Fpscr)); default: return null; } } - public static bool WriteRegister32(this IExecutionContext state, int gdbRegId, StringStream ss) + public static bool WriteRegister32(this IExecutionContext state, int registerId, StringStream ss) { - switch (gdbRegId) + switch (registerId) { case >= 0 and <= 14: { - ulong value = ss.ReadLengthAsLEHex(8); - state.SetX(gdbRegId, value); + ulong value = ss.ReadLengthAsLittleEndianHex(8); + state.SetX(registerId, value); return true; } case 15: { - ulong value = ss.ReadLengthAsLEHex(8); + ulong value = ss.ReadLengthAsLittleEndianHex(8); state.DebugPc = value; return true; } case 16: { - ulong value = ss.ReadLengthAsLEHex(8); + ulong value = ss.ReadLengthAsLittleEndianHex(8); state.Pstate = (uint)value; return true; } case >= 17 and <= 32: { - ulong value0 = ss.ReadLengthAsLEHex(16); - ulong value1 = ss.ReadLengthAsLEHex(16); - state.SetV(gdbRegId - 17, new V128(value0, value1)); + ulong value0 = ss.ReadLengthAsLittleEndianHex(16); + ulong value1 = ss.ReadLengthAsLittleEndianHex(16); + state.SetV(registerId - 17, new V128(value0, value1)); return true; } case >= 33 and <= 64: { - ulong value = ss.ReadLengthAsLEHex(16); - int regId = (gdbRegId - 33); + ulong value = ss.ReadLengthAsLittleEndianHex(16); + int regId = (registerId - 33); int regNum = regId / 2; int shift = regId % 2; V128 reg = state.GetV(regNum); @@ -147,7 +137,7 @@ namespace Ryujinx.HLE.Debugger.Gdb } case 65: { - ulong value = ss.ReadLengthAsLEHex(8); + ulong value = ss.ReadLengthAsLittleEndianHex(8); state.Fpsr = (uint)value & FpcrMask; state.Fpcr = (uint)value & ~FpcrMask; return true; diff --git a/src/Ryujinx.HLE/Debugger/IDebuggableProcess.cs b/src/Ryujinx.HLE/Debugger/IDebuggableProcess.cs index 0896f25d2..a632cea33 100644 --- a/src/Ryujinx.HLE/Debugger/IDebuggableProcess.cs +++ b/src/Ryujinx.HLE/Debugger/IDebuggableProcess.cs @@ -11,11 +11,11 @@ namespace Ryujinx.HLE.Debugger void DebugContinue(KThread thread); bool DebugStep(KThread thread); KThread GetThread(ulong threadUid); - DebugState GetDebugState(); bool IsThreadPaused(KThread thread); - ulong[] GetThreadUids(); public void DebugInterruptHandler(IExecutionContext ctx); IVirtualMemoryManager CpuMemory { get; } + ulong[] ThreadUids { get; } + DebugState DebugState { get; } void InvalidateCacheRegion(ulong address, ulong size); } } diff --git a/src/Ryujinx.HLE/Debugger/IMessage.cs b/src/Ryujinx.HLE/Debugger/IMessage.cs new file mode 100644 index 000000000..9877bcd5e --- /dev/null +++ b/src/Ryujinx.HLE/Debugger/IMessage.cs @@ -0,0 +1,47 @@ +using Ryujinx.Cpu; + +namespace Ryujinx.HLE.Debugger +{ + /// + /// Marker interface for debugger messages. + /// + interface IMessage; + + public enum MessageType + { + Kill, + BreakIn, + SendNack + } + + record struct StatelessMessage(MessageType Type) : IMessage + { + public static StatelessMessage Kill => new(MessageType.Kill); + public static StatelessMessage BreakIn => new(MessageType.BreakIn); + public static StatelessMessage SendNack => new(MessageType.SendNack); + } + + struct CommandMessage : IMessage + { + public readonly string Command; + + public CommandMessage(string cmd) + { + Command = cmd; + } + } + + public class ThreadBreakMessage : IMessage + { + public IExecutionContext Context { get; } + public ulong Address { get; } + public int Opcode { get; } + + public ThreadBreakMessage(IExecutionContext context, ulong address, int opcode) + { + Context = context; + Address = address; + Opcode = opcode; + } + } +} diff --git a/src/Ryujinx.HLE/Debugger/Message/BreakInMessage.cs b/src/Ryujinx.HLE/Debugger/Message/BreakInMessage.cs deleted file mode 100644 index 81d8784ae..000000000 --- a/src/Ryujinx.HLE/Debugger/Message/BreakInMessage.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Ryujinx.HLE.Debugger -{ - struct BreakInMessage : IMessage - { - } -} diff --git a/src/Ryujinx.HLE/Debugger/Message/CommandMessage.cs b/src/Ryujinx.HLE/Debugger/Message/CommandMessage.cs deleted file mode 100644 index ad265d432..000000000 --- a/src/Ryujinx.HLE/Debugger/Message/CommandMessage.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Ryujinx.HLE.Debugger -{ - struct CommandMessage : IMessage - { - public string Command; - - public CommandMessage(string cmd) - { - Command = cmd; - } - } -} diff --git a/src/Ryujinx.HLE/Debugger/Message/IMessage.cs b/src/Ryujinx.HLE/Debugger/Message/IMessage.cs deleted file mode 100644 index 4b03183c5..000000000 --- a/src/Ryujinx.HLE/Debugger/Message/IMessage.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Ryujinx.HLE.Debugger -{ - interface IMessage - { - } -} diff --git a/src/Ryujinx.HLE/Debugger/Message/KillMessage.cs b/src/Ryujinx.HLE/Debugger/Message/KillMessage.cs deleted file mode 100644 index 43ae0f21e..000000000 --- a/src/Ryujinx.HLE/Debugger/Message/KillMessage.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Ryujinx.HLE.Debugger -{ - struct KillMessage : IMessage - { - } -} diff --git a/src/Ryujinx.HLE/Debugger/Message/SendNackMessage.cs b/src/Ryujinx.HLE/Debugger/Message/SendNackMessage.cs deleted file mode 100644 index ce804c46e..000000000 --- a/src/Ryujinx.HLE/Debugger/Message/SendNackMessage.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Ryujinx.HLE.Debugger -{ - struct SendNackMessage : IMessage - { - } -} diff --git a/src/Ryujinx.HLE/Debugger/Message/ThreadBreakMessage.cs b/src/Ryujinx.HLE/Debugger/Message/ThreadBreakMessage.cs deleted file mode 100644 index 027096eeb..000000000 --- a/src/Ryujinx.HLE/Debugger/Message/ThreadBreakMessage.cs +++ /dev/null @@ -1,18 +0,0 @@ -using IExecutionContext = Ryujinx.Cpu.IExecutionContext; - -namespace Ryujinx.HLE.Debugger -{ - public class ThreadBreakMessage : IMessage - { - public IExecutionContext Context { get; } - public ulong Address { get; } - public int Opcode { get; } - - public ThreadBreakMessage(IExecutionContext context, ulong address, int opcode) - { - Context = context; - Address = address; - Opcode = opcode; - } - } -} diff --git a/src/Ryujinx.HLE/Debugger/StringStream.cs b/src/Ryujinx.HLE/Debugger/StringStream.cs index bc422f51f..9e5a48704 100644 --- a/src/Ryujinx.HLE/Debugger/StringStream.cs +++ b/src/Ryujinx.HLE/Debugger/StringStream.cs @@ -5,63 +5,56 @@ namespace Ryujinx.HLE.Debugger { internal class StringStream { - private readonly string Data; - private int Position; + private readonly string _data; + private int _position; public StringStream(string s) { - Data = s; + _data = s; } + + public bool IsEmpty => _position >= _data.Length; - public char ReadChar() - { - return Data[Position++]; - } + public char ReadChar() => _data[_position++]; public string ReadUntil(char needle) { - int needlePos = Data.IndexOf(needle, Position); + int needlePos = _data.IndexOf(needle, _position); if (needlePos == -1) { - needlePos = Data.Length; + needlePos = _data.Length; } - string result = Data.Substring(Position, needlePos - Position); - Position = needlePos + 1; + string result = _data.Substring(_position, needlePos - _position); + _position = needlePos + 1; return result; } public string ReadLength(int len) { - string result = Data.Substring(Position, len); - Position += len; + string result = _data.Substring(_position, len); + _position += len; return result; } public string ReadRemaining() { - string result = Data.Substring(Position); - Position = Data.Length; + string result = _data[_position..]; + _position = _data.Length; return result; } - public ulong ReadRemainingAsHex() - { - return ulong.Parse(ReadRemaining(), NumberStyles.HexNumber); - } + public ulong ReadRemainingAsHex() + => ulong.Parse(ReadRemaining(), NumberStyles.HexNumber); - public ulong ReadUntilAsHex(char needle) - { - return ulong.Parse(ReadUntil(needle), NumberStyles.HexNumber); - } + public ulong ReadUntilAsHex(char needle) + => ulong.Parse(ReadUntil(needle), NumberStyles.HexNumber); - public ulong ReadLengthAsHex(int len) - { - return ulong.Parse(ReadLength(len), NumberStyles.HexNumber); - } + public ulong ReadLengthAsHex(int len) + => ulong.Parse(ReadLength(len), NumberStyles.HexNumber); - public ulong ReadLengthAsLEHex(int len) + public ulong ReadLengthAsLittleEndianHex(int len) { Debug.Assert(len % 2 == 0); @@ -83,9 +76,9 @@ namespace Ryujinx.HLE.Debugger public bool ConsumePrefix(string prefix) { - if (Data.Substring(Position).StartsWith(prefix)) + if (_data[_position..].StartsWith(prefix)) { - Position += prefix.Length; + _position += prefix.Length; return true; } return false; @@ -93,17 +86,12 @@ namespace Ryujinx.HLE.Debugger public bool ConsumeRemaining(string match) { - if (Data.Substring(Position) == match) + if (_data[_position..] == match) { - Position += match.Length; + _position += match.Length; return true; } return false; } - - public bool IsEmpty() - { - return Position >= Data.Length; - } } } diff --git a/src/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs b/src/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs index 31360167f..2e14f2a40 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs @@ -267,7 +267,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process { moduleName = string.Empty; - var rodataStart = image.BaseAddress + image.Size; + ulong rodataStart = image.BaseAddress + image.Size; KMemoryInfo roInfo = _owner.MemoryManager.QueryMemory(rodataStart); if (roInfo.Permission != KMemoryPermission.Read) @@ -275,7 +275,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process return false; } - var rwdataStart = roInfo.Address + roInfo.Size; + ulong rwdataStart = roInfo.Address + roInfo.Size; try { @@ -305,7 +305,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process } pathLength = Math.Min(pathLength, rodataBuf.Length - 8); - var pathBuf = rodataBuf.Slice(8, pathLength); + Span pathBuf = rodataBuf.Slice(8, pathLength); int lastSlash = pathBuf.LastIndexOfAny(new byte[] { (byte)'\\', (byte)'/' }); moduleName = Encoding.ASCII.GetString(pathBuf.Slice(lastSlash + 1).TrimEnd((byte)0)); @@ -483,12 +483,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Process lock (_images) { - var image = new Image(textOffset, textSize, symbols.OrderBy(x => x.Value).ToArray()); + Image image = new(textOffset, textSize, symbols.OrderBy(x => x.Value).ToArray()); - string moduleName; - if (!GetModuleName(out moduleName, image)) + if (!GetModuleName(out string moduleName, image)) { - var newIndex = _images.Count; + int newIndex = _images.Count; moduleName = $"(unknown{newIndex})"; } image.Name = moduleName; diff --git a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs index eb75fb9a1..20c8b116c 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs @@ -1338,22 +1338,24 @@ namespace Ryujinx.HLE.HOS.Kernel.Process return true; } - public DebugState GetDebugState() - { - return (DebugState)_parent.debugState; - } + public DebugState DebugState => (DebugState)_parent.debugState; public bool IsThreadPaused(KThread target) { return (target.SchedFlags & ThreadSchedState.ThreadPauseFlag) != 0; } - public ulong[] GetThreadUids() + public ulong[] ThreadUids { - lock (_parent._threadingLock) + get { - var threads = _parent._threads.Where(x => !x.TerminationRequested).ToArray(); - return threads.Select(x => x.ThreadUid).ToArray(); + lock (_parent._threadingLock) + { + return _parent._threads + .Where(x => !x.TerminationRequested) + .Select(x => x.ThreadUid) + .ToArray(); + } } } @@ -1361,8 +1363,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Process { lock (_parent._threadingLock) { - var threads = _parent._threads.Where(x => !x.TerminationRequested).ToArray(); - return threads.FirstOrDefault(x => x.ThreadUid == threadUid); + return _parent._threads.Where(x => !x.TerminationRequested) + .FirstOrDefault(x => x.ThreadUid == threadUid); } } @@ -1379,7 +1381,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process _parent.InterruptHandler(ctx); } - public IVirtualMemoryManager CpuMemory { get { return _parent.CpuMemory; } } + public IVirtualMemoryManager CpuMemory => _parent.CpuMemory; public void InvalidateCacheRegion(ulong address, ulong size) { diff --git a/src/Ryujinx.HLE/HOS/Kernel/Process/ProcessCreationFlags.cs b/src/Ryujinx.HLE/HOS/Kernel/Process/ProcessCreationFlags.cs index 6ca54355e..e748378ed 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Process/ProcessCreationFlags.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Process/ProcessCreationFlags.cs @@ -1,5 +1,4 @@ using System; -using System.Diagnostics.CodeAnalysis; namespace Ryujinx.HLE.HOS.Kernel.Process { diff --git a/src/Ryujinx.HLE/HOS/Kernel/Process/ProcessExecutionContext.cs b/src/Ryujinx.HLE/HOS/Kernel/Process/ProcessExecutionContext.cs index f0e44c4b7..fecac33ae 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Process/ProcessExecutionContext.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Process/ProcessExecutionContext.cs @@ -1,6 +1,5 @@ using ARMeilleure.State; using Ryujinx.Cpu; -using System.Threading; namespace Ryujinx.HLE.HOS.Kernel.Process { diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs index 54440ab5f..fa81ef983 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs @@ -293,7 +293,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading KThread currentThread = KernelStatic.GetCurrentThread(); KThread selectedThread = _state.SelectedThread; - if (!currentThread.IsThreadNamed && currentThread.GetThreadName() != "") + if (!currentThread.IsThreadNamed && string.IsNullOrEmpty(currentThread.GetThreadName())) { currentThread.HostThread.Name = $"<{currentThread.GetThreadName()}>"; currentThread.IsThreadNamed = true; diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs index 058cc3202..2ebcd80d7 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs @@ -1,7 +1,6 @@ using ARMeilleure.State; using Ryujinx.Common.Logging; using Ryujinx.Cpu; -using Ryujinx.HLE.Debugger; using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Process; using Ryujinx.HLE.HOS.Kernel.SupervisorCall; diff --git a/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/ManagerServer.cs b/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/ManagerServer.cs index 8c86788b1..911296ff5 100644 --- a/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/ManagerServer.cs +++ b/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/ManagerServer.cs @@ -7,7 +7,6 @@ using System; using System.Collections.Generic; using System.Security.Claims; using System.Security.Cryptography; -using System.Security.Principal; using System.Text; using System.Threading; using System.Threading.Tasks; diff --git a/src/Ryujinx.HLE/HOS/Services/Loader/ResultCode.cs b/src/Ryujinx.HLE/HOS/Services/Loader/ResultCode.cs index 18b267e91..203cf5537 100644 --- a/src/Ryujinx.HLE/HOS/Services/Loader/ResultCode.cs +++ b/src/Ryujinx.HLE/HOS/Services/Loader/ResultCode.cs @@ -1,5 +1,3 @@ -using System.Diagnostics.CodeAnalysis; - namespace Ryujinx.HLE.HOS.Services.Loader { enum ResultCode diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocket.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocket.cs index 684e06598..d99488d85 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocket.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocket.cs @@ -2,7 +2,6 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Services.Sockets.Bsd.Proxy; using Ryujinx.HLE.HOS.Services.Sockets.Bsd.Types; using System; -using System.Collections.Generic; using System.Diagnostics; using System.Net; using System.Net.Sockets; diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/WSAError.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/WSAError.cs index 92a013d19..6a250498d 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/WSAError.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/WSAError.cs @@ -1,5 +1,3 @@ -using System.Diagnostics.CodeAnalysis; - namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl { enum WsaError diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/BsdSocketOption.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/BsdSocketOption.cs index c275f3ba5..2796d95ca 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/BsdSocketOption.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/BsdSocketOption.cs @@ -1,5 +1,3 @@ -using System.Diagnostics.CodeAnalysis; - namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Types { enum BsdSocketOption diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/LinuxError.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/LinuxError.cs index 1219d1476..72dcd0166 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/LinuxError.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/LinuxError.cs @@ -1,5 +1,3 @@ -using System.Diagnostics.CodeAnalysis; - namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Types { enum LinuxError diff --git a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/Status.cs b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/Status.cs index 0c69bf573..aa3b25ca5 100644 --- a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/Status.cs +++ b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/Status.cs @@ -1,5 +1,3 @@ -using System.Diagnostics.CodeAnalysis; - namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger { enum Status diff --git a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs index 8acc4d756..971778175 100644 --- a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs +++ b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs @@ -2,7 +2,6 @@ using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Common.PreciseSleep; -using Ryujinx.Cpu; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Gpu; using Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvMap; diff --git a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/Types/Color/ColorFormat.cs b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/Types/Color/ColorFormat.cs index b26fb15d1..438c58b72 100644 --- a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/Types/Color/ColorFormat.cs +++ b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/Types/Color/ColorFormat.cs @@ -1,5 +1,3 @@ -using System.Diagnostics.CodeAnalysis; - namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger { enum ColorFormat : ulong diff --git a/src/Ryujinx.HLE/HOS/Services/Time/ResultCode.cs b/src/Ryujinx.HLE/HOS/Services/Time/ResultCode.cs index ded2c3175..fcb434fae 100644 --- a/src/Ryujinx.HLE/HOS/Services/Time/ResultCode.cs +++ b/src/Ryujinx.HLE/HOS/Services/Time/ResultCode.cs @@ -1,5 +1,3 @@ -using System.Diagnostics.CodeAnalysis; - namespace Ryujinx.HLE.HOS.Services.Time { public enum ResultCode diff --git a/src/Ryujinx.HLE/Loaders/Elf/ElfDynamicTag.cs b/src/Ryujinx.HLE/Loaders/Elf/ElfDynamicTag.cs index 9b6eb014e..8887c5ec7 100644 --- a/src/Ryujinx.HLE/Loaders/Elf/ElfDynamicTag.cs +++ b/src/Ryujinx.HLE/Loaders/Elf/ElfDynamicTag.cs @@ -1,5 +1,3 @@ -using System.Diagnostics.CodeAnalysis; - namespace Ryujinx.HLE.Loaders.Elf { enum ElfDynamicTag diff --git a/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs b/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs index 23faca9d1..b043f29ef 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs @@ -9,7 +9,6 @@ using Ryujinx.Common.Logging; using Ryujinx.Graphics.Gpu; using Ryujinx.HLE.Loaders.Executables; using Ryujinx.Memory; -using System; using System.Linq; using static Ryujinx.HLE.HOS.ModLoader; diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs index 53ccddc68..18b2b78d1 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs @@ -6,7 +6,6 @@ using Ryujinx.Cpu; using Ryujinx.HLE.HOS.SystemState; using Ryujinx.HLE.Loaders.Processes.Extensions; using Ryujinx.Horizon.Common; -using System; namespace Ryujinx.HLE.Loaders.Processes { diff --git a/src/Ryujinx.HLE/Switch.cs b/src/Ryujinx.HLE/Switch.cs index 03fba1514..2ce9d9959 100644 --- a/src/Ryujinx.HLE/Switch.cs +++ b/src/Ryujinx.HLE/Switch.cs @@ -14,7 +14,6 @@ using Ryujinx.HLE.Loaders.Processes; using Ryujinx.HLE.UI; using Ryujinx.Memory; using System; -using System.Threading; namespace Ryujinx.HLE { diff --git a/src/Ryujinx.HLE/UI/Input/NpadReader.cs b/src/Ryujinx.HLE/UI/Input/NpadReader.cs index 586e924b0..bb6d309ea 100644 --- a/src/Ryujinx.HLE/UI/Input/NpadReader.cs +++ b/src/Ryujinx.HLE/UI/Input/NpadReader.cs @@ -1,4 +1,3 @@ -using Ryujinx.Common.Memory; using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad; using System; diff --git a/src/Ryujinx.Horizon/Audio/HwopusIpcServer.cs b/src/Ryujinx.Horizon/Audio/HwopusIpcServer.cs index e60e033cc..89ef9da45 100644 --- a/src/Ryujinx.Horizon/Audio/HwopusIpcServer.cs +++ b/src/Ryujinx.Horizon/Audio/HwopusIpcServer.cs @@ -6,7 +6,7 @@ namespace Ryujinx.Horizon.Audio { class HwopusIpcServer { - private const int MaxSessionsCount = 24; + private const int MaxSessionsCount = 25; private const int PointerBufferSize = 0x1000; private const int MaxDomains = 8; diff --git a/src/Ryujinx.Input.SDL2/SDL2JoyCon.cs b/src/Ryujinx.Input.SDL2/SDL2JoyCon.cs index 0c00c1899..ee80881c2 100644 --- a/src/Ryujinx.Input.SDL2/SDL2JoyCon.cs +++ b/src/Ryujinx.Input.SDL2/SDL2JoyCon.cs @@ -362,7 +362,7 @@ namespace Ryujinx.Input.SDL2 if (HasConfiguration) { - var joyconStickConfig = GetLogicalJoyStickConfig(inputId); + JoyconConfigControllerStick joyconStickConfig = GetLogicalJoyStickConfig(inputId); if (joyconStickConfig != null) { @@ -398,7 +398,7 @@ namespace Ryujinx.Input.SDL2 public bool IsPressed(GamepadButtonInputId inputId) { - if (!_buttonsDriverMapping.TryGetValue(inputId, out var button)) + if (!_buttonsDriverMapping.TryGetValue(inputId, out SDL_GameControllerButton button)) { return false; } diff --git a/src/Ryujinx.Input.SDL2/SDL2JoyConPair.cs b/src/Ryujinx.Input.SDL2/SDL2JoyConPair.cs index a1e13aa45..be70cc4f9 100644 --- a/src/Ryujinx.Input.SDL2/SDL2JoyConPair.cs +++ b/src/Ryujinx.Input.SDL2/SDL2JoyConPair.cs @@ -105,7 +105,7 @@ namespace Ryujinx.Input.SDL2 private static (int leftIndex, int rightIndex) DetectJoyConPair(List gamepadsIds) { - var gamepadNames = gamepadsIds.Where(gamepadId => gamepadId != Id) + List gamepadNames = gamepadsIds.Where(gamepadId => gamepadId != Id) .Select((_, index) => SDL_GameControllerNameForIndex(index)).ToList(); int leftIndex = gamepadNames.IndexOf(SDL2JoyCon.LeftName); int rightIndex = gamepadNames.IndexOf(SDL2JoyCon.RightName); diff --git a/src/Ryujinx/Input/AvaloniaMouseDriver.cs b/src/Ryujinx/Input/AvaloniaMouseDriver.cs index 63c35eda4..21d29744a 100644 --- a/src/Ryujinx/Input/AvaloniaMouseDriver.cs +++ b/src/Ryujinx/Input/AvaloniaMouseDriver.cs @@ -71,8 +71,8 @@ namespace Ryujinx.Ava.Input { _size = new Size((int)rect.Width, (int)rect.Height); } - - private void HandleScrollStopped() + + private void HandleScrollStopped() { Scroll = new Vector2(0, 0); } @@ -104,12 +104,18 @@ namespace Ryujinx.Ava.Input } private void Parent_PointerPressedEvent(object o, PointerPressedEventArgs args) { - uint button = (uint)args.GetCurrentPoint(_widget).Properties.PointerUpdateKind; + PointerPoint currentPoint = args.GetCurrentPoint(_widget); + uint button = (uint)currentPoint.Properties.PointerUpdateKind; if ((uint)PressedButtons.Length > button) { PressedButtons[button] = true; } + + if (args.Pointer.Type == PointerType.Touch) // mouse position is unchanged for touch events, set touch position + { + CurrentPosition = new Vector2((float)currentPoint.Position.X, (float)currentPoint.Position.Y); + } } private void Parent_PointerMovedEvent(object o, PointerEventArgs args) diff --git a/src/Ryujinx/Systems/AppHost.cs b/src/Ryujinx/Systems/AppHost.cs index 89f9412ba..da2b5c80c 100644 --- a/src/Ryujinx/Systems/AppHost.cs +++ b/src/Ryujinx/Systems/AppHost.cs @@ -201,8 +201,6 @@ namespace Ryujinx.Ava.Systems ConfigurationState.Instance.Graphics.AspectRatio.Event += UpdateAspectRatioState; ConfigurationState.Instance.System.EnableDockedMode.Event += UpdateDockedModeState; ConfigurationState.Instance.System.AudioVolume.Event += UpdateAudioVolumeState; - ConfigurationState.Instance.System.EnableDockedMode.Event += UpdateDockedModeState; - ConfigurationState.Instance.System.AudioVolume.Event += UpdateAudioVolumeState; ConfigurationState.Instance.Graphics.AntiAliasing.Event += UpdateAntiAliasing; ConfigurationState.Instance.Graphics.ScalingFilter.Event += UpdateScalingFilter; ConfigurationState.Instance.Graphics.ScalingFilterLevel.Event += UpdateScalingFilterLevel; diff --git a/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs index 48bc1571a..216ffc33c 100644 --- a/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs +++ b/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs @@ -848,7 +848,7 @@ namespace Ryujinx.Ava.Systems.AppLibrary TimeSpan temporary = TimeSpan.Zero; - foreach (var installedApplication in Applications.Items) + foreach (ApplicationData installedApplication in Applications.Items) { temporary += LoadAndSaveMetaData(installedApplication.IdString).TimePlayed; } diff --git a/src/Ryujinx/Systems/Rebooter.cs b/src/Ryujinx/Systems/Rebooter.cs index 5360edee9..bb91f608f 100644 --- a/src/Ryujinx/Systems/Rebooter.cs +++ b/src/Ryujinx/Systems/Rebooter.cs @@ -54,7 +54,7 @@ namespace Ryujinx.Ava.Systems WorkingDirectory = executableDirectory, }; - foreach (var arg in args) + foreach (string arg in args) { processStart.ArgumentList.Add(arg); } diff --git a/src/Ryujinx/UI/Applet/AvaloniaHostUITheme.cs b/src/Ryujinx/UI/Applet/AvaloniaHostUITheme.cs index 3ab2fdc70..2d1468a6b 100644 --- a/src/Ryujinx/UI/Applet/AvaloniaHostUITheme.cs +++ b/src/Ryujinx/UI/Applet/AvaloniaHostUITheme.cs @@ -50,7 +50,7 @@ namespace Ryujinx.Ava.UI.Applet private string GetWindowsFontByLanguage() { - var culture = CultureInfo.CurrentUICulture; + CultureInfo culture = CultureInfo.CurrentUICulture; string langCode = culture.Name; return culture.TwoLetterISOLanguageName switch diff --git a/src/Ryujinx/UI/Models/LdnGameModel.cs b/src/Ryujinx/UI/Models/LdnGameModel.cs index d677c55ee..cd874be6c 100644 --- a/src/Ryujinx/UI/Models/LdnGameModel.cs +++ b/src/Ryujinx/UI/Models/LdnGameModel.cs @@ -107,7 +107,7 @@ namespace Ryujinx.Ava.UI.Models private static async Task GetAllAsyncRequestImpl(HttpClient client = null) { - var ldnWebHost = ConfigurationState.Instance.Multiplayer.GetLdnWebServer(); + string ldnWebHost = ConfigurationState.Instance.Multiplayer.GetLdnWebServer(); LocaleManager.Associate(LocaleKeys.LdnGameListRefreshToolTip, ldnWebHost); diff --git a/src/Ryujinx/UI/ViewModels/LdnGamesListViewModel.cs b/src/Ryujinx/UI/ViewModels/LdnGamesListViewModel.cs index 4bd9aa92d..f15c27df7 100644 --- a/src/Ryujinx/UI/ViewModels/LdnGamesListViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/LdnGamesListViewModel.cs @@ -35,7 +35,7 @@ namespace Ryujinx.Ava.UI.ViewModels SortApply(); } - var filtered = _visibleEntries; + IEnumerable filtered = _visibleEntries; if (OnlyShowForOwnedGames) filtered = filtered.Where(x => _ownedGameTitleIds.ContainsIgnoreCase(x.Title.Id)); diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index c11051348..53734ef19 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -348,7 +348,7 @@ namespace Ryujinx.Ava.UI.ViewModels { if (ts.HasValue) { - var formattedPlayTime = ValueFormatUtils.FormatTimeSpan(ts.Value); + string formattedPlayTime = ValueFormatUtils.FormatTimeSpan(ts.Value); LocaleManager.Associate(LocaleKeys.GameListLabelTotalTimePlayed, formattedPlayTime); ShowTotalTimePlayed = formattedPlayTime != string.Empty; return; @@ -827,10 +827,10 @@ namespace Ryujinx.Ava.UI.ViewModels private void RefreshGrid() { - var appsList = Applications.ToObservableChangeSet() + IObservableList appsList = Applications.ToObservableChangeSet() .Filter(Filter) .Sort(GetComparer()) - .Bind(out var apps) + .Bind(out ReadOnlyObservableCollection apps) .AsObservableList(); AppsObservableList = apps; diff --git a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs index 54fd951fb..acf7517d8 100644 --- a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs @@ -447,9 +447,9 @@ namespace Ryujinx.Ava.UI.ViewModels _virtualFileSystem = virtualFileSystem; _contentManager = contentManager; - if (gameIconData != null && gameIconData.Length > 0) + if (gameIconData is { Length: > 0 }) { - using var ms = new MemoryStream(gameIconData); + using MemoryStream ms = new(gameIconData); _gameIcon = new Bitmap(ms); }