Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
3c3bcd82fe | ||
|
a00c59a46c | ||
|
1825bd87b4 | ||
|
62f8ceb60b |
@@ -41,7 +41,7 @@ namespace Ryujinx.Audio.Renderer.Common
|
|||||||
return Memory<byte>.Empty;
|
return Memory<byte>.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Memory<T> Allocate<T>(ulong count, int align) where T: unmanaged
|
public Memory<T> Allocate<T>(ulong count, int align) where T : unmanaged
|
||||||
{
|
{
|
||||||
Memory<byte> allocatedMemory = Allocate((ulong)Unsafe.SizeOf<T>() * count, align);
|
Memory<byte> allocatedMemory = Allocate((ulong)Unsafe.SizeOf<T>() * count, align);
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ namespace Ryujinx.Audio.Renderer.Common
|
|||||||
return SpanMemoryManager<T>.Cast(allocatedMemory);
|
return SpanMemoryManager<T>.Cast(allocatedMemory);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ulong GetTargetSize<T>(ulong currentSize, ulong count, int align) where T: unmanaged
|
public static ulong GetTargetSize<T>(ulong currentSize, ulong count, int align) where T : unmanaged
|
||||||
{
|
{
|
||||||
return BitUtils.AlignUp(currentSize, align) + (ulong)Unsafe.SizeOf<T>() * count;
|
return BitUtils.AlignUp(currentSize, align) + (ulong)Unsafe.SizeOf<T>() * count;
|
||||||
}
|
}
|
||||||
|
@@ -87,7 +87,7 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command
|
|||||||
float dryGain = FixedPointHelper.ToFloat(Parameter.DryGain, FixedPointPrecision);
|
float dryGain = FixedPointHelper.ToFloat(Parameter.DryGain, FixedPointPrecision);
|
||||||
float outGain = FixedPointHelper.ToFloat(Parameter.OutGain, FixedPointPrecision);
|
float outGain = FixedPointHelper.ToFloat(Parameter.OutGain, FixedPointPrecision);
|
||||||
|
|
||||||
Matrix2x2 delayFeedback = new Matrix2x2(delayFeedbackBaseGain , delayFeedbackCrossGain,
|
Matrix2x2 delayFeedback = new Matrix2x2(delayFeedbackBaseGain, delayFeedbackCrossGain,
|
||||||
delayFeedbackCrossGain, delayFeedbackBaseGain);
|
delayFeedbackCrossGain, delayFeedbackBaseGain);
|
||||||
|
|
||||||
for (int i = 0; i < sampleCount; i++)
|
for (int i = 0; i < sampleCount; i++)
|
||||||
@@ -124,10 +124,10 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command
|
|||||||
float dryGain = FixedPointHelper.ToFloat(Parameter.DryGain, FixedPointPrecision);
|
float dryGain = FixedPointHelper.ToFloat(Parameter.DryGain, FixedPointPrecision);
|
||||||
float outGain = FixedPointHelper.ToFloat(Parameter.OutGain, FixedPointPrecision);
|
float outGain = FixedPointHelper.ToFloat(Parameter.OutGain, FixedPointPrecision);
|
||||||
|
|
||||||
Matrix4x4 delayFeedback = new Matrix4x4(delayFeedbackBaseGain , delayFeedbackCrossGain, delayFeedbackCrossGain, 0.0f,
|
Matrix4x4 delayFeedback = new Matrix4x4(delayFeedbackBaseGain, delayFeedbackCrossGain, delayFeedbackCrossGain, 0.0f,
|
||||||
delayFeedbackCrossGain, delayFeedbackBaseGain , 0.0f , delayFeedbackCrossGain,
|
delayFeedbackCrossGain, delayFeedbackBaseGain, 0.0f, delayFeedbackCrossGain,
|
||||||
delayFeedbackCrossGain, 0.0f , delayFeedbackBaseGain , delayFeedbackCrossGain,
|
delayFeedbackCrossGain, 0.0f, delayFeedbackBaseGain, delayFeedbackCrossGain,
|
||||||
0.0f , delayFeedbackCrossGain, delayFeedbackCrossGain, delayFeedbackBaseGain);
|
0.0f, delayFeedbackCrossGain, delayFeedbackCrossGain, delayFeedbackBaseGain);
|
||||||
|
|
||||||
|
|
||||||
for (int i = 0; i < sampleCount; i++)
|
for (int i = 0; i < sampleCount; i++)
|
||||||
@@ -171,12 +171,12 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command
|
|||||||
float dryGain = FixedPointHelper.ToFloat(Parameter.DryGain, FixedPointPrecision);
|
float dryGain = FixedPointHelper.ToFloat(Parameter.DryGain, FixedPointPrecision);
|
||||||
float outGain = FixedPointHelper.ToFloat(Parameter.OutGain, FixedPointPrecision);
|
float outGain = FixedPointHelper.ToFloat(Parameter.OutGain, FixedPointPrecision);
|
||||||
|
|
||||||
Matrix6x6 delayFeedback = new Matrix6x6(delayFeedbackBaseGain , 0.0f , 0.0f , 0.0f , delayFeedbackCrossGain, delayFeedbackCrossGain,
|
Matrix6x6 delayFeedback = new Matrix6x6(delayFeedbackBaseGain, 0.0f, 0.0f, 0.0f, delayFeedbackCrossGain, delayFeedbackCrossGain,
|
||||||
0.0f , delayFeedbackBaseGain , 0.0f , delayFeedbackCrossGain, delayFeedbackCrossGain, 0.0f ,
|
0.0f, delayFeedbackBaseGain, 0.0f, delayFeedbackCrossGain, delayFeedbackCrossGain, 0.0f,
|
||||||
delayFeedbackCrossGain, 0.0f , delayFeedbackBaseGain , delayFeedbackCrossGain, 0.0f , 0.0f ,
|
delayFeedbackCrossGain, 0.0f, delayFeedbackBaseGain, delayFeedbackCrossGain, 0.0f, 0.0f,
|
||||||
0.0f , delayFeedbackCrossGain, delayFeedbackCrossGain, delayFeedbackBaseGain , 0.0f , 0.0f ,
|
0.0f, delayFeedbackCrossGain, delayFeedbackCrossGain, delayFeedbackBaseGain, 0.0f, 0.0f,
|
||||||
delayFeedbackCrossGain, delayFeedbackCrossGain, 0.0f , 0.0f , delayFeedbackBaseGain , 0.0f ,
|
delayFeedbackCrossGain, delayFeedbackCrossGain, 0.0f, 0.0f, delayFeedbackBaseGain, 0.0f,
|
||||||
0.0f , 0.0f , 0.0f , 0.0f , 0.0f , feedbackGain);
|
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, feedbackGain);
|
||||||
|
|
||||||
for (int i = 0; i < sampleCount; i++)
|
for (int i = 0; i < sampleCount; i++)
|
||||||
{
|
{
|
||||||
|
@@ -25,6 +25,6 @@ namespace Ryujinx.Audio.Renderer.Dsp.State
|
|||||||
UpdateParameter(ref parameter);
|
UpdateParameter(ref parameter);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateParameter(ref LimiterParameter parameter) {}
|
public void UpdateParameter(ref LimiterParameter parameter) { }
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -81,7 +81,7 @@ namespace Ryujinx.Audio.Renderer.Server.Effect
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="parameter">The user parameter.</param>
|
/// <param name="parameter">The user parameter.</param>
|
||||||
/// <returns>Returns true if the <see cref="EffectType"/> sent by the user matches the internal <see cref="EffectType"/>.</returns>
|
/// <returns>Returns true if the <see cref="EffectType"/> sent by the user matches the internal <see cref="EffectType"/>.</returns>
|
||||||
public bool IsTypeValid<T>(ref T parameter) where T: unmanaged, IEffectInParameter
|
public bool IsTypeValid<T>(ref T parameter) where T : unmanaged, IEffectInParameter
|
||||||
{
|
{
|
||||||
return parameter.Type == TargetEffectType;
|
return parameter.Type == TargetEffectType;
|
||||||
}
|
}
|
||||||
@@ -140,14 +140,14 @@ namespace Ryujinx.Audio.Renderer.Server.Effect
|
|||||||
/// Initialize the given <paramref name="state"/> result state.
|
/// Initialize the given <paramref name="state"/> result state.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="state">The state to initalize</param>
|
/// <param name="state">The state to initalize</param>
|
||||||
public virtual void InitializeResultState(ref EffectResultState state) {}
|
public virtual void InitializeResultState(ref EffectResultState state) { }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Update the <paramref name="destState"/> result state with <paramref name="srcState"/>.
|
/// Update the <paramref name="destState"/> result state with <paramref name="srcState"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="destState">The destination result state</param>
|
/// <param name="destState">The destination result state</param>
|
||||||
/// <param name="srcState">The source result state</param>
|
/// <param name="srcState">The source result state</param>
|
||||||
public virtual void UpdateResultState(ref EffectResultState destState, ref EffectResultState srcState) {}
|
public virtual void UpdateResultState(ref EffectResultState destState, ref EffectResultState srcState) { }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Update the internal state from a user version 1 parameter.
|
/// Update the internal state from a user version 1 parameter.
|
||||||
@@ -215,7 +215,7 @@ namespace Ryujinx.Audio.Renderer.Server.Effect
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="outStatus">The given user output.</param>
|
/// <param name="outStatus">The given user output.</param>
|
||||||
/// <param name="isAudioRendererActive">If set to true, the <see cref="AudioRenderSystem"/> is active.</param>
|
/// <param name="isAudioRendererActive">If set to true, the <see cref="AudioRenderSystem"/> is active.</param>
|
||||||
public void StoreStatus<T>(ref T outStatus, bool isAudioRendererActive) where T: unmanaged, IEffectOutStatus
|
public void StoreStatus<T>(ref T outStatus, bool isAudioRendererActive) where T : unmanaged, IEffectOutStatus
|
||||||
{
|
{
|
||||||
if (isAudioRendererActive)
|
if (isAudioRendererActive)
|
||||||
{
|
{
|
||||||
|
@@ -46,7 +46,7 @@ namespace Ryujinx.Audio.Renderer.Server.Effect
|
|||||||
Update(out updateErrorInfo, ref parameter, mapper);
|
Update(out updateErrorInfo, ref parameter, mapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Update<T>(out BehaviourParameter.ErrorInfo updateErrorInfo, ref T parameter, PoolMapper mapper) where T: unmanaged, IEffectInParameter
|
public void Update<T>(out BehaviourParameter.ErrorInfo updateErrorInfo, ref T parameter, PoolMapper mapper) where T : unmanaged, IEffectInParameter
|
||||||
{
|
{
|
||||||
Debug.Assert(IsTypeValid(ref parameter));
|
Debug.Assert(IsTypeValid(ref parameter));
|
||||||
|
|
||||||
|
@@ -1,8 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
using DspAddress = System.UInt64;
|
|
||||||
using CpuAddress = System.UInt64;
|
using CpuAddress = System.UInt64;
|
||||||
|
using DspAddress = System.UInt64;
|
||||||
|
|
||||||
namespace Ryujinx.Audio.Renderer.Server.MemoryPool
|
namespace Ryujinx.Audio.Renderer.Server.MemoryPool
|
||||||
{
|
{
|
||||||
|
@@ -1,8 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
using DspAddress = System.UInt64;
|
|
||||||
using CpuAddress = System.UInt64;
|
using CpuAddress = System.UInt64;
|
||||||
|
using DspAddress = System.UInt64;
|
||||||
|
|
||||||
namespace Ryujinx.Audio.Renderer.Server.MemoryPool
|
namespace Ryujinx.Audio.Renderer.Server.MemoryPool
|
||||||
{
|
{
|
||||||
|
@@ -13,7 +13,7 @@ namespace Ryujinx.Audio.Renderer.Server.Performance
|
|||||||
/// <typeparam name="THeader">The header implementation of the performance frame.</typeparam>
|
/// <typeparam name="THeader">The header implementation of the performance frame.</typeparam>
|
||||||
/// <typeparam name="TEntry">The entry implementation of the performance frame.</typeparam>
|
/// <typeparam name="TEntry">The entry implementation of the performance frame.</typeparam>
|
||||||
/// <typeparam name="TEntryDetail">A detailed implementation of the performance frame.</typeparam>
|
/// <typeparam name="TEntryDetail">A detailed implementation of the performance frame.</typeparam>
|
||||||
public class PerformanceManagerGeneric<THeader, TEntry, TEntryDetail> : PerformanceManager where THeader: unmanaged, IPerformanceHeader where TEntry : unmanaged, IPerformanceEntry where TEntryDetail: unmanaged, IPerformanceDetailEntry
|
public class PerformanceManagerGeneric<THeader, TEntry, TEntryDetail> : PerformanceManager where THeader : unmanaged, IPerformanceHeader where TEntry : unmanaged, IPerformanceEntry where TEntryDetail : unmanaged, IPerformanceDetailEntry
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The magic used for the <see cref="THeader"/>.
|
/// The magic used for the <see cref="THeader"/>.
|
||||||
|
@@ -172,7 +172,7 @@ namespace Ryujinx.Audio.Renderer.Server.Splitter
|
|||||||
{
|
{
|
||||||
unsafe
|
unsafe
|
||||||
{
|
{
|
||||||
fixed (SplitterDestination *nextPtr = &next)
|
fixed (SplitterDestination* nextPtr = &next)
|
||||||
{
|
{
|
||||||
_next = nextPtr;
|
_next = nextPtr;
|
||||||
}
|
}
|
||||||
|
@@ -21,7 +21,7 @@ namespace Ryujinx.Audio.Renderer.Server
|
|||||||
public class StateUpdater
|
public class StateUpdater
|
||||||
{
|
{
|
||||||
private readonly ReadOnlyMemory<byte> _inputOrigin;
|
private readonly ReadOnlyMemory<byte> _inputOrigin;
|
||||||
private ReadOnlyMemory <byte> _outputOrigin;
|
private ReadOnlyMemory<byte> _outputOrigin;
|
||||||
private ReadOnlyMemory<byte> _input;
|
private ReadOnlyMemory<byte> _input;
|
||||||
|
|
||||||
private Memory<byte> _output;
|
private Memory<byte> _output;
|
||||||
@@ -207,7 +207,7 @@ namespace Ryujinx.Audio.Renderer.Server
|
|||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ResetEffect<T>(ref BaseEffect effect, ref T parameter, PoolMapper mapper) where T: unmanaged, IEffectInParameter
|
private static void ResetEffect<T>(ref BaseEffect effect, ref T parameter, PoolMapper mapper) where T : unmanaged, IEffectInParameter
|
||||||
{
|
{
|
||||||
effect.ForceUnmapBuffers(mapper);
|
effect.ForceUnmapBuffers(mapper);
|
||||||
|
|
||||||
|
@@ -200,7 +200,7 @@ namespace Ryujinx.Audio.Renderer.Server.Voice
|
|||||||
SampleFormat = SampleFormat.Invalid;
|
SampleFormat = SampleFormat.Invalid;
|
||||||
ChannelsCount = 0;
|
ChannelsCount = 0;
|
||||||
Pitch = 0.0f;
|
Pitch = 0.0f;
|
||||||
Volume= 0.0f;
|
Volume = 0.0f;
|
||||||
PreviousVolume = 0.0f;
|
PreviousVolume = 0.0f;
|
||||||
BiquadFilters.ToSpan().Fill(new BiquadFilterParameter());
|
BiquadFilters.ToSpan().Fill(new BiquadFilterParameter());
|
||||||
WaveBuffersCount = 0;
|
WaveBuffersCount = 0;
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
using DspAddress = System.UInt64;
|
|
||||||
using CpuAddress = System.UInt64;
|
using CpuAddress = System.UInt64;
|
||||||
|
using DspAddress = System.UInt64;
|
||||||
|
|
||||||
namespace Ryujinx.Audio.Renderer.Utils
|
namespace Ryujinx.Audio.Renderer.Utils
|
||||||
{
|
{
|
||||||
|
@@ -53,6 +53,7 @@ namespace Ryujinx.Ava
|
|||||||
internal class AppHost
|
internal class AppHost
|
||||||
{
|
{
|
||||||
private const int CursorHideIdleTime = 8; // Hide Cursor seconds
|
private const int CursorHideIdleTime = 8; // Hide Cursor seconds
|
||||||
|
private const float MaxResolutionScale = 4.0f; // Max resolution hotkeys can scale to before wrapping.
|
||||||
|
|
||||||
private static readonly Cursor InvisibleCursor = new Cursor(StandardCursorType.None);
|
private static readonly Cursor InvisibleCursor = new Cursor(StandardCursorType.None);
|
||||||
|
|
||||||
@@ -976,6 +977,13 @@ namespace Ryujinx.Ava
|
|||||||
|
|
||||||
_parent.ViewModel.Volume = Device.GetVolume();
|
_parent.ViewModel.Volume = Device.GetVolume();
|
||||||
break;
|
break;
|
||||||
|
case KeyboardHotkeyState.ResScaleUp:
|
||||||
|
GraphicsConfig.ResScale = GraphicsConfig.ResScale % MaxResolutionScale + 1;
|
||||||
|
break;
|
||||||
|
case KeyboardHotkeyState.ResScaleDown:
|
||||||
|
GraphicsConfig.ResScale =
|
||||||
|
(MaxResolutionScale + GraphicsConfig.ResScale - 2) % MaxResolutionScale + 1;
|
||||||
|
break;
|
||||||
case KeyboardHotkeyState.None:
|
case KeyboardHotkeyState.None:
|
||||||
(_keyboardInterface as AvaloniaKeyboard).Clear();
|
(_keyboardInterface as AvaloniaKeyboard).Clear();
|
||||||
break;
|
break;
|
||||||
@@ -1033,6 +1041,14 @@ namespace Ryujinx.Ava
|
|||||||
{
|
{
|
||||||
state = KeyboardHotkeyState.ToggleMute;
|
state = KeyboardHotkeyState.ToggleMute;
|
||||||
}
|
}
|
||||||
|
else if (_keyboardInterface.IsPressed((Key)ConfigurationState.Instance.Hid.Hotkeys.Value.ResScaleUp))
|
||||||
|
{
|
||||||
|
state = KeyboardHotkeyState.ResScaleUp;
|
||||||
|
}
|
||||||
|
else if (_keyboardInterface.IsPressed((Key)ConfigurationState.Instance.Hid.Hotkeys.Value.ResScaleDown))
|
||||||
|
{
|
||||||
|
state = KeyboardHotkeyState.ResScaleDown;
|
||||||
|
}
|
||||||
|
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
@@ -556,5 +556,7 @@
|
|||||||
"SettingsSelectThemeFileDialogTitle" : "Wähle ein benutzerdefiniertes Thema",
|
"SettingsSelectThemeFileDialogTitle" : "Wähle ein benutzerdefiniertes Thema",
|
||||||
"SettingsXamlThemeFile" : "Xaml Thema-Datei",
|
"SettingsXamlThemeFile" : "Xaml Thema-Datei",
|
||||||
"SettingsTabGraphicsBackend" : "Grafik-Backend",
|
"SettingsTabGraphicsBackend" : "Grafik-Backend",
|
||||||
"GraphicsBackendTooltip" : "Ändert das Grafik-Backend"
|
"GraphicsBackendTooltip" : "Ändert das Grafik-Backend",
|
||||||
|
"SettingsTabHotkeysResScaleUpHotkey": "Auflösung erhöhen:",
|
||||||
|
"SettingsTabHotkeysResScaleDownHotkey": "Auflösung vermindern:"
|
||||||
}
|
}
|
||||||
|
@@ -575,5 +575,7 @@
|
|||||||
"UserProfilesSetProfileImage": "Set Profile Image",
|
"UserProfilesSetProfileImage": "Set Profile Image",
|
||||||
"UserProfileEmptyNameError": "Name is required",
|
"UserProfileEmptyNameError": "Name is required",
|
||||||
"UserProfileNoImageError": "Profile image must be set",
|
"UserProfileNoImageError": "Profile image must be set",
|
||||||
"GameUpdateWindowHeading": "Updates Available for {0} [{1}]"
|
"GameUpdateWindowHeading": "Updates Available for {0} [{1}]",
|
||||||
|
"SettingsTabHotkeysResScaleUpHotkey": "Increase resolution:",
|
||||||
|
"SettingsTabHotkeysResScaleDownHotkey": "Decrease resolution:"
|
||||||
}
|
}
|
||||||
|
@@ -568,5 +568,7 @@
|
|||||||
"UpdateWindowTitle": "Administrar actualizaciones",
|
"UpdateWindowTitle": "Administrar actualizaciones",
|
||||||
"CheatWindowHeading": "Cheats disponibles para {0} [{1}]",
|
"CheatWindowHeading": "Cheats disponibles para {0} [{1}]",
|
||||||
"DlcWindowHeading": "Contenido descargable disponible para {0} [{1}]",
|
"DlcWindowHeading": "Contenido descargable disponible para {0} [{1}]",
|
||||||
"GameUpdateWindowHeading": "Actualizaciones disponibles para {0} [{1}]"
|
"GameUpdateWindowHeading": "Actualizaciones disponibles para {0} [{1}]",
|
||||||
|
"SettingsTabHotkeysResScaleUpHotkey": "Aumentar la resolución:",
|
||||||
|
"SettingsTabHotkeysResScaleDownHotkey": "Disminuir la resolución:"
|
||||||
}
|
}
|
||||||
|
@@ -554,5 +554,7 @@
|
|||||||
"ControllerMotionTitle": "Impostazioni dei sensori di movimento",
|
"ControllerMotionTitle": "Impostazioni dei sensori di movimento",
|
||||||
"ControllerRumbleTitle": "Impostazioni di vibrazione",
|
"ControllerRumbleTitle": "Impostazioni di vibrazione",
|
||||||
"SettingsSelectThemeFileDialogTitle" : "Seleziona file del tema",
|
"SettingsSelectThemeFileDialogTitle" : "Seleziona file del tema",
|
||||||
"SettingsXamlThemeFile" : "File del tema xaml"
|
"SettingsXamlThemeFile" : "File del tema xaml",
|
||||||
|
"SettingsTabHotkeysResScaleUpHotkey": "Aumentare la risoluzione:",
|
||||||
|
"SettingsTabHotkeysResScaleDownHotkey": "Diminuire la risoluzione:"
|
||||||
}
|
}
|
||||||
|
@@ -554,5 +554,7 @@
|
|||||||
"ControllerMotionTitle": "Configurações do controle de movimento",
|
"ControllerMotionTitle": "Configurações do controle de movimento",
|
||||||
"ControllerRumbleTitle": "Configurações de vibração",
|
"ControllerRumbleTitle": "Configurações de vibração",
|
||||||
"SettingsSelectThemeFileDialogTitle" : "Selecionar arquivo do tema",
|
"SettingsSelectThemeFileDialogTitle" : "Selecionar arquivo do tema",
|
||||||
"SettingsXamlThemeFile" : "Arquivo de tema Xaml"
|
"SettingsXamlThemeFile" : "Arquivo de tema Xaml",
|
||||||
|
"SettingsTabHotkeysResScaleUpHotkey": "Aumentar a resolução:",
|
||||||
|
"SettingsTabHotkeysResScaleDownHotkey": "Diminuir a resolução:"
|
||||||
}
|
}
|
||||||
|
@@ -554,5 +554,7 @@
|
|||||||
"ControllerMotionTitle": "Hareket Kontrol Seçenekleri",
|
"ControllerMotionTitle": "Hareket Kontrol Seçenekleri",
|
||||||
"ControllerRumbleTitle": "Titreşim Seçenekleri",
|
"ControllerRumbleTitle": "Titreşim Seçenekleri",
|
||||||
"SettingsSelectThemeFileDialogTitle" : "Tema Dosyası Seçin",
|
"SettingsSelectThemeFileDialogTitle" : "Tema Dosyası Seçin",
|
||||||
"SettingsXamlThemeFile" : "Xaml Tema Dosyası"
|
"SettingsXamlThemeFile" : "Xaml Tema Dosyası",
|
||||||
|
"SettingsTabHotkeysResScaleUpHotkey": "Çözünürlüğü artırın:",
|
||||||
|
"SettingsTabHotkeysResScaleDownHotkey": "Çözünürlüğü azaltın:"
|
||||||
}
|
}
|
||||||
|
@@ -568,5 +568,7 @@
|
|||||||
"UpdateWindowTitle": "管理游戏更新",
|
"UpdateWindowTitle": "管理游戏更新",
|
||||||
"CheatWindowHeading": "适用于 {0} [{1}] 的金手指",
|
"CheatWindowHeading": "适用于 {0} [{1}] 的金手指",
|
||||||
"DlcWindowHeading": "适用于 {0} [{1}] 的 DLC",
|
"DlcWindowHeading": "适用于 {0} [{1}] 的 DLC",
|
||||||
"GameUpdateWindowHeading": "适用于 {0} [{1}] 的更新"
|
"GameUpdateWindowHeading": "适用于 {0} [{1}] 的更新",
|
||||||
|
"SettingsTabHotkeysResScaleUpHotkey": "分辨率提高",
|
||||||
|
"SettingsTabHotkeysResScaleDownHotkey": "降低分辨率"
|
||||||
}
|
}
|
||||||
|
@@ -7,6 +7,8 @@
|
|||||||
Screenshot,
|
Screenshot,
|
||||||
ShowUi,
|
ShowUi,
|
||||||
Pause,
|
Pause,
|
||||||
ToggleMute
|
ToggleMute,
|
||||||
|
ResScaleUp,
|
||||||
|
ResScaleDown
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -241,6 +241,22 @@
|
|||||||
TextAlignment="Center" />
|
TextAlignment="Center" />
|
||||||
</ToggleButton>
|
</ToggleButton>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
<StackPanel Margin="10,0,0,0" Orientation="Horizontal">
|
||||||
|
<TextBlock VerticalAlignment="Center" Text="{locale:Locale SettingsTabHotkeysResScaleUpHotkey}" Width="230" />
|
||||||
|
<ToggleButton Width="90" Height="27" Checked="Button_Checked" Unchecked="Button_Unchecked">
|
||||||
|
<TextBlock
|
||||||
|
Text="{Binding KeyboardHotkeys.ResScaleUp, Mode=TwoWay, Converter={StaticResource Key}}"
|
||||||
|
TextAlignment="Center" />
|
||||||
|
</ToggleButton>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Margin="10,0,0,0" Orientation="Horizontal">
|
||||||
|
<TextBlock VerticalAlignment="Center" Text="{locale:Locale SettingsTabHotkeysResScaleDownHotkey}" Width="230" />
|
||||||
|
<ToggleButton Width="90" Height="27" Checked="Button_Checked" Unchecked="Button_Unchecked">
|
||||||
|
<TextBlock
|
||||||
|
Text="{Binding KeyboardHotkeys.ResScaleDown, Mode=TwoWay, Converter={StaticResource Key}}"
|
||||||
|
TextAlignment="Center" />
|
||||||
|
</ToggleButton>
|
||||||
|
</StackPanel>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
|
@@ -7,5 +7,7 @@
|
|||||||
public Key ShowUi { get; set; }
|
public Key ShowUi { get; set; }
|
||||||
public Key Pause { get; set; }
|
public Key Pause { get; set; }
|
||||||
public Key ToggleMute { get; set; }
|
public Key ToggleMute { get; set; }
|
||||||
|
public Key ResScaleUp { get; set; }
|
||||||
|
public Key ResScaleDown { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -59,9 +59,24 @@ namespace Ryujinx.Graphics.Gpu
|
|||||||
{
|
{
|
||||||
oldMemoryManager.Physical.BufferCache.NotifyBuffersModified -= BufferManager.Rebind;
|
oldMemoryManager.Physical.BufferCache.NotifyBuffersModified -= BufferManager.Rebind;
|
||||||
oldMemoryManager.Physical.DecrementReferenceCount();
|
oldMemoryManager.Physical.DecrementReferenceCount();
|
||||||
|
oldMemoryManager.MemoryUnmapped -= MemoryUnmappedHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
memoryManager.Physical.BufferCache.NotifyBuffersModified += BufferManager.Rebind;
|
memoryManager.Physical.BufferCache.NotifyBuffersModified += BufferManager.Rebind;
|
||||||
|
memoryManager.MemoryUnmapped += MemoryUnmappedHandler;
|
||||||
|
|
||||||
|
// Since the memory manager changed, make sure we will get pools from addresses of the new memory manager.
|
||||||
|
TextureManager.ReloadPools();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Memory mappings change event handler.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender">Memory manager where the mappings changed</param>
|
||||||
|
/// <param name="e">Information about the region that is being changed</param>
|
||||||
|
private void MemoryUnmappedHandler(object sender, UnmapEventArgs e)
|
||||||
|
{
|
||||||
|
TextureManager.ReloadPools();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
129
Ryujinx.Graphics.Gpu/Image/PoolCache.cs
Normal file
129
Ryujinx.Graphics.Gpu/Image/PoolCache.cs
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Ryujinx.Graphics.Gpu.Image
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Resource pool interface.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Resource pool type</typeparam>
|
||||||
|
interface IPool<T>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Start address of the pool in memory.
|
||||||
|
/// </summary>
|
||||||
|
ulong Address { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Linked list node used on the texture pool cache.
|
||||||
|
/// </summary>
|
||||||
|
LinkedListNode<T> CacheNode { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Timestamp set on the last use of the pool by the cache.
|
||||||
|
/// </summary>
|
||||||
|
ulong CacheTimestamp { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Pool cache.
|
||||||
|
/// This can keep multiple pools, and return the current one as needed.
|
||||||
|
/// </summary>
|
||||||
|
abstract class PoolCache<T> : IDisposable where T : IPool<T>, IDisposable
|
||||||
|
{
|
||||||
|
private const int MaxCapacity = 2;
|
||||||
|
private const ulong MinDeltaForRemoval = 20000;
|
||||||
|
|
||||||
|
private readonly GpuContext _context;
|
||||||
|
private readonly LinkedList<T> _pools;
|
||||||
|
private ulong _currentTimestamp;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructs a new instance of the pool.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context">GPU context that the texture pool belongs to</param>
|
||||||
|
public PoolCache(GpuContext context)
|
||||||
|
{
|
||||||
|
_context = context;
|
||||||
|
_pools = new LinkedList<T>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Increments the internal timestamp of the cache that is used to decide when old resources will be deleted.
|
||||||
|
/// </summary>
|
||||||
|
public void Tick()
|
||||||
|
{
|
||||||
|
_currentTimestamp++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Finds a cache texture pool, or creates a new one if not found.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="channel">GPU channel that the texture pool cache belongs to</param>
|
||||||
|
/// <param name="address">Start address of the texture pool</param>
|
||||||
|
/// <param name="maximumId">Maximum ID of the texture pool</param>
|
||||||
|
/// <returns>The found or newly created texture pool</returns>
|
||||||
|
public T FindOrCreate(GpuChannel channel, ulong address, int maximumId)
|
||||||
|
{
|
||||||
|
// Remove old entries from the cache, if possible.
|
||||||
|
while (_pools.Count > MaxCapacity && (_currentTimestamp - _pools.First.Value.CacheTimestamp) >= MinDeltaForRemoval)
|
||||||
|
{
|
||||||
|
T oldestPool = _pools.First.Value;
|
||||||
|
|
||||||
|
_pools.RemoveFirst();
|
||||||
|
oldestPool.Dispose();
|
||||||
|
oldestPool.CacheNode = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
T pool;
|
||||||
|
|
||||||
|
// Try to find the pool on the cache.
|
||||||
|
for (LinkedListNode<T> node = _pools.First; node != null; node = node.Next)
|
||||||
|
{
|
||||||
|
pool = node.Value;
|
||||||
|
|
||||||
|
if (pool.Address == address)
|
||||||
|
{
|
||||||
|
if (pool.CacheNode != _pools.Last)
|
||||||
|
{
|
||||||
|
_pools.Remove(pool.CacheNode);
|
||||||
|
|
||||||
|
pool.CacheNode = _pools.AddLast(pool);
|
||||||
|
}
|
||||||
|
|
||||||
|
pool.CacheTimestamp = _currentTimestamp;
|
||||||
|
|
||||||
|
return pool;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If not found, create a new one.
|
||||||
|
pool = CreatePool(_context, channel, address, maximumId);
|
||||||
|
|
||||||
|
pool.CacheNode = _pools.AddLast(pool);
|
||||||
|
pool.CacheTimestamp = _currentTimestamp;
|
||||||
|
|
||||||
|
return pool;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new instance of the pool.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context">GPU context that the pool belongs to</param>
|
||||||
|
/// <param name="channel">GPU channel that the pool belongs to</param>
|
||||||
|
/// <param name="address">Address of the pool in guest memory</param>
|
||||||
|
/// <param name="maximumId">Maximum ID of the pool (equal to maximum minus one)</param>
|
||||||
|
protected abstract T CreatePool(GpuContext context, GpuChannel channel, ulong address, int maximumId);
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
foreach (T pool in _pools)
|
||||||
|
{
|
||||||
|
pool.Dispose();
|
||||||
|
pool.CacheNode = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
_pools.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,16 +1,27 @@
|
|||||||
using Ryujinx.Graphics.Gpu.Memory;
|
using Ryujinx.Graphics.Gpu.Memory;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace Ryujinx.Graphics.Gpu.Image
|
namespace Ryujinx.Graphics.Gpu.Image
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sampler pool.
|
/// Sampler pool.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
class SamplerPool : Pool<Sampler, SamplerDescriptor>
|
class SamplerPool : Pool<Sampler, SamplerDescriptor>, IPool<SamplerPool>
|
||||||
{
|
{
|
||||||
private float _forcedAnisotropy;
|
private float _forcedAnisotropy;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Constructs a new instance of the sampler pool.
|
/// Linked list node used on the sampler pool cache.
|
||||||
|
/// </summary>
|
||||||
|
public LinkedListNode<SamplerPool> CacheNode { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Timestamp used by the sampler pool cache, updated on every use of this sampler pool.
|
||||||
|
/// </summary>
|
||||||
|
public ulong CacheTimestamp { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new instance of the sampler pool.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context">GPU context that the sampler pool belongs to</param>
|
/// <param name="context">GPU context that the sampler pool belongs to</param>
|
||||||
/// <param name="physicalMemory">Physical memory where the sampler descriptors are mapped</param>
|
/// <param name="physicalMemory">Physical memory where the sampler descriptors are mapped</param>
|
||||||
|
30
Ryujinx.Graphics.Gpu/Image/SamplerPoolCache.cs
Normal file
30
Ryujinx.Graphics.Gpu/Image/SamplerPoolCache.cs
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
namespace Ryujinx.Graphics.Gpu.Image
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Sampler pool cache.
|
||||||
|
/// This can keep multiple sampler pools, and return the current one as needed.
|
||||||
|
/// It is useful for applications that uses multiple sampler pools.
|
||||||
|
/// </summary>
|
||||||
|
class SamplerPoolCache : PoolCache<SamplerPool>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Constructs a new instance of the texture pool.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context">GPU context that the texture pool belongs to</param>
|
||||||
|
public SamplerPoolCache(GpuContext context) : base(context)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new instance of the sampler pool.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context">GPU context that the sampler pool belongs to</param>
|
||||||
|
/// <param name="channel">GPU channel that the texture pool belongs to</param>
|
||||||
|
/// <param name="address">Address of the sampler pool in guest memory</param>
|
||||||
|
/// <param name="maximumId">Maximum sampler ID of the sampler pool (equal to maximum samplers minus one)</param>
|
||||||
|
protected override SamplerPool CreatePool(GpuContext context, GpuChannel channel, ulong address, int maximumId)
|
||||||
|
{
|
||||||
|
return new SamplerPool(context, channel.MemoryManager.Physical, address, maximumId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -13,7 +13,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Texture bindings manager.
|
/// Texture bindings manager.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
class TextureBindingsManager : IDisposable
|
class TextureBindingsManager
|
||||||
{
|
{
|
||||||
private const int InitialTextureStateSize = 32;
|
private const int InitialTextureStateSize = 32;
|
||||||
private const int InitialImageStateSize = 8;
|
private const int InitialImageStateSize = 8;
|
||||||
@@ -22,15 +22,17 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
|
|
||||||
private readonly bool _isCompute;
|
private readonly bool _isCompute;
|
||||||
|
|
||||||
private SamplerPool _samplerPool;
|
private ulong _texturePoolGpuVa;
|
||||||
|
|
||||||
private SamplerIndex _samplerIndex;
|
|
||||||
|
|
||||||
private ulong _texturePoolAddress;
|
|
||||||
private int _texturePoolMaximumId;
|
private int _texturePoolMaximumId;
|
||||||
|
private TexturePool _texturePool;
|
||||||
|
private ulong _samplerPoolGpuVa;
|
||||||
|
private int _samplerPoolMaximumId;
|
||||||
|
private SamplerIndex _samplerIndex;
|
||||||
|
private SamplerPool _samplerPool;
|
||||||
|
|
||||||
private readonly GpuChannel _channel;
|
private readonly GpuChannel _channel;
|
||||||
private readonly TexturePoolCache _texturePoolCache;
|
private readonly TexturePoolCache _texturePoolCache;
|
||||||
|
private readonly SamplerPoolCache _samplerPoolCache;
|
||||||
|
|
||||||
private TexturePool _cachedTexturePool;
|
private TexturePool _cachedTexturePool;
|
||||||
private SamplerPool _cachedSamplerPool;
|
private SamplerPool _cachedSamplerPool;
|
||||||
@@ -72,14 +74,23 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context">The GPU context that the texture bindings manager belongs to</param>
|
/// <param name="context">The GPU context that the texture bindings manager belongs to</param>
|
||||||
/// <param name="channel">The GPU channel that the texture bindings manager belongs to</param>
|
/// <param name="channel">The GPU channel that the texture bindings manager belongs to</param>
|
||||||
/// <param name="poolCache">Texture pools cache used to get texture pools from</param>
|
/// <param name="texturePoolCache">Texture pools cache used to get texture pools from</param>
|
||||||
|
/// <param name="samplerPoolCache">Sampler pools cache used to get sampler pools from</param>
|
||||||
/// <param name="scales">Array where the scales for the currently bound textures are stored</param>
|
/// <param name="scales">Array where the scales for the currently bound textures are stored</param>
|
||||||
/// <param name="isCompute">True if the bindings manager is used for the compute engine</param>
|
/// <param name="isCompute">True if the bindings manager is used for the compute engine</param>
|
||||||
public TextureBindingsManager(GpuContext context, GpuChannel channel, TexturePoolCache poolCache, float[] scales, bool isCompute)
|
public TextureBindingsManager(
|
||||||
|
GpuContext context,
|
||||||
|
GpuChannel channel,
|
||||||
|
TexturePoolCache texturePoolCache,
|
||||||
|
SamplerPoolCache samplerPoolCache,
|
||||||
|
float[] scales,
|
||||||
|
bool isCompute)
|
||||||
{
|
{
|
||||||
_context = context;
|
_context = context;
|
||||||
_channel = channel;
|
_channel = channel;
|
||||||
_texturePoolCache = poolCache;
|
_texturePoolCache = texturePoolCache;
|
||||||
|
_samplerPoolCache = samplerPoolCache;
|
||||||
|
|
||||||
_scales = scales;
|
_scales = scales;
|
||||||
_isCompute = isCompute;
|
_isCompute = isCompute;
|
||||||
|
|
||||||
@@ -173,25 +184,10 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
/// <param name="samplerIndex">Type of the sampler pool indexing used for bound samplers</param>
|
/// <param name="samplerIndex">Type of the sampler pool indexing used for bound samplers</param>
|
||||||
public void SetSamplerPool(ulong gpuVa, int maximumId, SamplerIndex samplerIndex)
|
public void SetSamplerPool(ulong gpuVa, int maximumId, SamplerIndex samplerIndex)
|
||||||
{
|
{
|
||||||
if (gpuVa != 0)
|
_samplerPoolGpuVa = gpuVa;
|
||||||
{
|
_samplerPoolMaximumId = maximumId;
|
||||||
ulong address = _channel.MemoryManager.Translate(gpuVa);
|
|
||||||
|
|
||||||
if (_samplerPool != null && _samplerPool.Address == address && _samplerPool.MaximumId >= maximumId)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_samplerPool?.Dispose();
|
|
||||||
_samplerPool = new SamplerPool(_context, _channel.MemoryManager.Physical, address, maximumId);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_samplerPool?.Dispose();
|
|
||||||
_samplerPool = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
_samplerIndex = samplerIndex;
|
_samplerIndex = samplerIndex;
|
||||||
|
_samplerPool = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -201,18 +197,9 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
/// <param name="maximumId">Maximum ID of the pool (total count minus one)</param>
|
/// <param name="maximumId">Maximum ID of the pool (total count minus one)</param>
|
||||||
public void SetTexturePool(ulong gpuVa, int maximumId)
|
public void SetTexturePool(ulong gpuVa, int maximumId)
|
||||||
{
|
{
|
||||||
if (gpuVa != 0)
|
_texturePoolGpuVa = gpuVa;
|
||||||
{
|
|
||||||
ulong address = _channel.MemoryManager.Translate(gpuVa);
|
|
||||||
|
|
||||||
_texturePoolAddress = address;
|
|
||||||
_texturePoolMaximumId = maximumId;
|
_texturePoolMaximumId = maximumId;
|
||||||
}
|
_texturePool = null;
|
||||||
else
|
|
||||||
{
|
|
||||||
_texturePoolAddress = 0;
|
|
||||||
_texturePoolMaximumId = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -222,13 +209,9 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
/// <param name="samplerId">ID of the sampler</param>
|
/// <param name="samplerId">ID of the sampler</param>
|
||||||
public (Texture, Sampler) GetTextureAndSampler(int textureId, int samplerId)
|
public (Texture, Sampler) GetTextureAndSampler(int textureId, int samplerId)
|
||||||
{
|
{
|
||||||
ulong texturePoolAddress = _texturePoolAddress;
|
(TexturePool texturePool, SamplerPool samplerPool) = GetPools();
|
||||||
|
|
||||||
TexturePool texturePool = texturePoolAddress != 0
|
return (texturePool.Get(textureId), samplerPool.Get(samplerId));
|
||||||
? _texturePoolCache.FindOrCreate(_channel, texturePoolAddress, _texturePoolMaximumId)
|
|
||||||
: null;
|
|
||||||
|
|
||||||
return (texturePool.Get(textureId), _samplerPool.Get(samplerId));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -340,13 +323,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
/// <returns>True if all bound textures match the current shader specialiation state, false otherwise</returns>
|
/// <returns>True if all bound textures match the current shader specialiation state, false otherwise</returns>
|
||||||
public bool CommitBindings(ShaderSpecializationState specState)
|
public bool CommitBindings(ShaderSpecializationState specState)
|
||||||
{
|
{
|
||||||
ulong texturePoolAddress = _texturePoolAddress;
|
(TexturePool texturePool, SamplerPool samplerPool) = GetPools();
|
||||||
|
|
||||||
TexturePool texturePool = texturePoolAddress != 0
|
|
||||||
? _texturePoolCache.FindOrCreate(_channel, texturePoolAddress, _texturePoolMaximumId)
|
|
||||||
: null;
|
|
||||||
|
|
||||||
SamplerPool samplerPool = _samplerPool;
|
|
||||||
|
|
||||||
// Check if the texture pool has been modified since bindings were last committed.
|
// Check if the texture pool has been modified since bindings were last committed.
|
||||||
// If it wasn't, then it's possible to avoid looking up textures again when the handle remains the same.
|
// If it wasn't, then it's possible to avoid looking up textures again when the handle remains the same.
|
||||||
@@ -381,7 +358,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
|
|
||||||
if (_isCompute)
|
if (_isCompute)
|
||||||
{
|
{
|
||||||
specStateMatches &= CommitTextureBindings(texturePool, ShaderStage.Compute, 0, poolModified, specState);
|
specStateMatches &= CommitTextureBindings(texturePool, samplerPool, ShaderStage.Compute, 0, poolModified, specState);
|
||||||
specStateMatches &= CommitImageBindings(texturePool, ShaderStage.Compute, 0, poolModified, specState);
|
specStateMatches &= CommitImageBindings(texturePool, ShaderStage.Compute, 0, poolModified, specState);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -390,7 +367,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
{
|
{
|
||||||
int stageIndex = (int)stage - 1;
|
int stageIndex = (int)stage - 1;
|
||||||
|
|
||||||
specStateMatches &= CommitTextureBindings(texturePool, stage, stageIndex, poolModified, specState);
|
specStateMatches &= CommitTextureBindings(texturePool, samplerPool, stage, stageIndex, poolModified, specState);
|
||||||
specStateMatches &= CommitImageBindings(texturePool, stage, stageIndex, poolModified, specState);
|
specStateMatches &= CommitImageBindings(texturePool, stage, stageIndex, poolModified, specState);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -447,13 +424,20 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
/// Ensures that the texture bindings are visible to the host GPU.
|
/// Ensures that the texture bindings are visible to the host GPU.
|
||||||
/// Note: this actually performs the binding using the host graphics API.
|
/// Note: this actually performs the binding using the host graphics API.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="pool">The current texture pool</param>
|
/// <param name="texturePool">The current texture pool</param>
|
||||||
|
/// <param name="samplerPool">The current sampler pool</param>
|
||||||
/// <param name="stage">The shader stage using the textures to be bound</param>
|
/// <param name="stage">The shader stage using the textures to be bound</param>
|
||||||
/// <param name="stageIndex">The stage number of the specified shader stage</param
|
/// <param name="stageIndex">The stage number of the specified shader stage</param
|
||||||
/// <param name="poolModified">True if either the texture or sampler pool was modified, false otherwise</param>
|
/// <param name="poolModified">True if either the texture or sampler pool was modified, false otherwise</param>
|
||||||
/// <param name="specState">Specialization state for the bound shader</param>
|
/// <param name="specState">Specialization state for the bound shader</param>
|
||||||
/// <returns>True if all bound textures match the current shader specialiation state, false otherwise</returns>
|
/// <returns>True if all bound textures match the current shader specialiation state, false otherwise</returns>
|
||||||
private bool CommitTextureBindings(TexturePool pool, ShaderStage stage, int stageIndex, bool poolModified, ShaderSpecializationState specState)
|
private bool CommitTextureBindings(
|
||||||
|
TexturePool texturePool,
|
||||||
|
SamplerPool samplerPool,
|
||||||
|
ShaderStage stage,
|
||||||
|
int stageIndex,
|
||||||
|
bool poolModified,
|
||||||
|
ShaderSpecializationState specState)
|
||||||
{
|
{
|
||||||
int textureCount = _textureBindingsCount[stageIndex];
|
int textureCount = _textureBindingsCount[stageIndex];
|
||||||
if (textureCount == 0)
|
if (textureCount == 0)
|
||||||
@@ -461,9 +445,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var samplerPool = _samplerPool;
|
if (texturePool == null)
|
||||||
|
|
||||||
if (pool == null)
|
|
||||||
{
|
{
|
||||||
Logger.Error?.Print(LogClass.Gpu, $"Shader stage \"{stage}\" uses textures, but texture pool was not set.");
|
Logger.Error?.Print(LogClass.Gpu, $"Shader stage \"{stage}\" uses textures, but texture pool was not set.");
|
||||||
return true;
|
return true;
|
||||||
@@ -528,7 +510,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
state.TextureHandle = textureId;
|
state.TextureHandle = textureId;
|
||||||
state.SamplerHandle = samplerId;
|
state.SamplerHandle = samplerId;
|
||||||
|
|
||||||
ref readonly TextureDescriptor descriptor = ref pool.GetForBinding(textureId, out Texture texture);
|
ref readonly TextureDescriptor descriptor = ref texturePool.GetForBinding(textureId, out Texture texture);
|
||||||
|
|
||||||
specStateMatches &= specState.MatchesTexture(stage, index, descriptor);
|
specStateMatches &= specState.MatchesTexture(stage, index, descriptor);
|
||||||
|
|
||||||
@@ -819,6 +801,54 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the texture and sampler pool for the GPU virtual address that are currently set.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The texture and sampler pools</returns>
|
||||||
|
private (TexturePool, SamplerPool) GetPools()
|
||||||
|
{
|
||||||
|
MemoryManager memoryManager = _channel.MemoryManager;
|
||||||
|
|
||||||
|
TexturePool texturePool = _texturePool;
|
||||||
|
SamplerPool samplerPool = _samplerPool;
|
||||||
|
|
||||||
|
if (texturePool == null)
|
||||||
|
{
|
||||||
|
ulong poolAddress = memoryManager.Translate(_texturePoolGpuVa);
|
||||||
|
|
||||||
|
if (poolAddress != MemoryManager.PteUnmapped)
|
||||||
|
{
|
||||||
|
texturePool = _texturePoolCache.FindOrCreate(_channel, poolAddress, _texturePoolMaximumId);
|
||||||
|
_texturePool = texturePool;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (samplerPool == null)
|
||||||
|
{
|
||||||
|
ulong poolAddress = memoryManager.Translate(_samplerPoolGpuVa);
|
||||||
|
|
||||||
|
if (poolAddress != MemoryManager.PteUnmapped)
|
||||||
|
{
|
||||||
|
samplerPool = _samplerPoolCache.FindOrCreate(_channel, poolAddress, _samplerPoolMaximumId);
|
||||||
|
_samplerPool = samplerPool;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (texturePool, samplerPool);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Forces the texture and sampler pools to be re-loaded from the cache on next use.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// This should be called if the memory mappings change, to ensure the correct pools are being used.
|
||||||
|
/// </remarks>
|
||||||
|
public void ReloadPools()
|
||||||
|
{
|
||||||
|
_samplerPool = null;
|
||||||
|
_texturePool = null;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Force all bound textures and images to be rebound the next time CommitBindings is called.
|
/// Force all bound textures and images to be rebound the next time CommitBindings is called.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -827,13 +857,5 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
Array.Clear(_textureState);
|
Array.Clear(_textureState);
|
||||||
Array.Clear(_imageState);
|
Array.Clear(_imageState);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Disposes all textures and samplers in the cache.
|
|
||||||
/// </summary>
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
_samplerPool?.Dispose();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -16,6 +16,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
private readonly TextureBindingsManager _cpBindingsManager;
|
private readonly TextureBindingsManager _cpBindingsManager;
|
||||||
private readonly TextureBindingsManager _gpBindingsManager;
|
private readonly TextureBindingsManager _gpBindingsManager;
|
||||||
private readonly TexturePoolCache _texturePoolCache;
|
private readonly TexturePoolCache _texturePoolCache;
|
||||||
|
private readonly SamplerPoolCache _samplerPoolCache;
|
||||||
|
|
||||||
private readonly Texture[] _rtColors;
|
private readonly Texture[] _rtColors;
|
||||||
private readonly ITexture[] _rtHostColors;
|
private readonly ITexture[] _rtHostColors;
|
||||||
@@ -41,13 +42,15 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
_channel = channel;
|
_channel = channel;
|
||||||
|
|
||||||
TexturePoolCache texturePoolCache = new TexturePoolCache(context);
|
TexturePoolCache texturePoolCache = new TexturePoolCache(context);
|
||||||
|
SamplerPoolCache samplerPoolCache = new SamplerPoolCache(context);
|
||||||
|
|
||||||
float[] scales = new float[64];
|
float[] scales = new float[64];
|
||||||
new Span<float>(scales).Fill(1f);
|
new Span<float>(scales).Fill(1f);
|
||||||
|
|
||||||
_cpBindingsManager = new TextureBindingsManager(context, channel, texturePoolCache, scales, isCompute: true);
|
_cpBindingsManager = new TextureBindingsManager(context, channel, texturePoolCache, samplerPoolCache, scales, isCompute: true);
|
||||||
_gpBindingsManager = new TextureBindingsManager(context, channel, texturePoolCache, scales, isCompute: false);
|
_gpBindingsManager = new TextureBindingsManager(context, channel, texturePoolCache, samplerPoolCache, scales, isCompute: false);
|
||||||
_texturePoolCache = texturePoolCache;
|
_texturePoolCache = texturePoolCache;
|
||||||
|
_samplerPoolCache = samplerPoolCache;
|
||||||
|
|
||||||
_rtColors = new Texture[Constants.TotalRenderTargets];
|
_rtColors = new Texture[Constants.TotalRenderTargets];
|
||||||
_rtHostColors = new ITexture[Constants.TotalRenderTargets];
|
_rtHostColors = new ITexture[Constants.TotalRenderTargets];
|
||||||
@@ -368,6 +371,10 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
// we must rebind everything.
|
// we must rebind everything.
|
||||||
// Since compute work happens less often, we always do that
|
// Since compute work happens less often, we always do that
|
||||||
// before and after the compute dispatch.
|
// before and after the compute dispatch.
|
||||||
|
|
||||||
|
_texturePoolCache.Tick();
|
||||||
|
_samplerPoolCache.Tick();
|
||||||
|
|
||||||
_cpBindingsManager.Rebind();
|
_cpBindingsManager.Rebind();
|
||||||
bool result = _cpBindingsManager.CommitBindings(specState);
|
bool result = _cpBindingsManager.CommitBindings(specState);
|
||||||
_gpBindingsManager.Rebind();
|
_gpBindingsManager.Rebind();
|
||||||
@@ -382,6 +389,9 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
/// <returns>True if all bound textures match the current shader specialization state, false otherwise</returns>
|
/// <returns>True if all bound textures match the current shader specialization state, false otherwise</returns>
|
||||||
public bool CommitGraphicsBindings(ShaderSpecializationState specState)
|
public bool CommitGraphicsBindings(ShaderSpecializationState specState)
|
||||||
{
|
{
|
||||||
|
_texturePoolCache.Tick();
|
||||||
|
_samplerPoolCache.Tick();
|
||||||
|
|
||||||
bool result = _gpBindingsManager.CommitBindings(specState);
|
bool result = _gpBindingsManager.CommitBindings(specState);
|
||||||
|
|
||||||
UpdateRenderTargets();
|
UpdateRenderTargets();
|
||||||
@@ -501,6 +511,15 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
_context.Renderer.Pipeline.SetRenderTargets(_rtHostColors, _rtHostDs);
|
_context.Renderer.Pipeline.SetRenderTargets(_rtHostColors, _rtHostDs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Forces the texture and sampler pools to be re-loaded from the cache on next use.
|
||||||
|
/// </summary>
|
||||||
|
public void ReloadPools()
|
||||||
|
{
|
||||||
|
_cpBindingsManager.ReloadPools();
|
||||||
|
_gpBindingsManager.ReloadPools();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Forces all textures, samplers, images and render targets to be rebound the next time
|
/// Forces all textures, samplers, images and render targets to be rebound the next time
|
||||||
/// CommitGraphicsBindings is called.
|
/// CommitGraphicsBindings is called.
|
||||||
@@ -523,8 +542,8 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
_cpBindingsManager.Dispose();
|
// Textures are owned by the texture cache, so we shouldn't dispose the texture pool cache.
|
||||||
_gpBindingsManager.Dispose();
|
_samplerPoolCache.Dispose();
|
||||||
|
|
||||||
for (int i = 0; i < _rtColors.Length; i++)
|
for (int i = 0; i < _rtColors.Length; i++)
|
||||||
{
|
{
|
||||||
|
@@ -10,19 +10,24 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Texture pool.
|
/// Texture pool.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
class TexturePool : Pool<Texture, TextureDescriptor>
|
class TexturePool : Pool<Texture, TextureDescriptor>, IPool<TexturePool>
|
||||||
{
|
{
|
||||||
private readonly GpuChannel _channel;
|
private readonly GpuChannel _channel;
|
||||||
private readonly ConcurrentQueue<Texture> _dereferenceQueue = new ConcurrentQueue<Texture>();
|
private readonly ConcurrentQueue<Texture> _dereferenceQueue = new ConcurrentQueue<Texture>();
|
||||||
private TextureDescriptor _defaultDescriptor;
|
private TextureDescriptor _defaultDescriptor;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Intrusive linked list node used on the texture pool cache.
|
/// Linked list node used on the texture pool cache.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public LinkedListNode<TexturePool> CacheNode { get; set; }
|
public LinkedListNode<TexturePool> CacheNode { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Constructs a new instance of the texture pool.
|
/// Timestamp used by the texture pool cache, updated on every use of this texture pool.
|
||||||
|
/// </summary>
|
||||||
|
public ulong CacheTimestamp { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new instance of the texture pool.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context">GPU context that the texture pool belongs to</param>
|
/// <param name="context">GPU context that the texture pool belongs to</param>
|
||||||
/// <param name="channel">GPU channel that the texture pool belongs to</param>
|
/// <param name="channel">GPU channel that the texture pool belongs to</param>
|
||||||
|
@@ -1,6 +1,3 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace Ryujinx.Graphics.Gpu.Image
|
namespace Ryujinx.Graphics.Gpu.Image
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -8,69 +5,26 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
/// This can keep multiple texture pools, and return the current one as needed.
|
/// This can keep multiple texture pools, and return the current one as needed.
|
||||||
/// It is useful for applications that uses multiple texture pools.
|
/// It is useful for applications that uses multiple texture pools.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
class TexturePoolCache
|
class TexturePoolCache : PoolCache<TexturePool>
|
||||||
{
|
{
|
||||||
private const int MaxCapacity = 4;
|
|
||||||
|
|
||||||
private readonly GpuContext _context;
|
|
||||||
private readonly LinkedList<TexturePool> _pools;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Constructs a new instance of the texture pool.
|
/// Constructs a new instance of the texture pool.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context">GPU context that the texture pool belongs to</param>
|
/// <param name="context">GPU context that the texture pool belongs to</param>
|
||||||
public TexturePoolCache(GpuContext context)
|
public TexturePoolCache(GpuContext context) : base(context)
|
||||||
{
|
{
|
||||||
_context = context;
|
|
||||||
_pools = new LinkedList<TexturePool>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Finds a cache texture pool, or creates a new one if not found.
|
/// Creates a new instance of the texture pool.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="channel">GPU channel that the texture pool cache belongs to</param>
|
/// <param name="context">GPU context that the texture pool belongs to</param>
|
||||||
/// <param name="address">Start address of the texture pool</param>
|
/// <param name="channel">GPU channel that the texture pool belongs to</param>
|
||||||
/// <param name="maximumId">Maximum ID of the texture pool</param>
|
/// <param name="address">Address of the texture pool in guest memory</param>
|
||||||
/// <returns>The found or newly created texture pool</returns>
|
/// <param name="maximumId">Maximum texture ID of the texture pool (equal to maximum textures minus one)</param>
|
||||||
public TexturePool FindOrCreate(GpuChannel channel, ulong address, int maximumId)
|
protected override TexturePool CreatePool(GpuContext context, GpuChannel channel, ulong address, int maximumId)
|
||||||
{
|
{
|
||||||
TexturePool pool;
|
return new TexturePool(context, channel, address, maximumId);
|
||||||
|
|
||||||
// First we try to find the pool.
|
|
||||||
for (LinkedListNode<TexturePool> node = _pools.First; node != null; node = node.Next)
|
|
||||||
{
|
|
||||||
pool = node.Value;
|
|
||||||
|
|
||||||
if (pool.Address == address)
|
|
||||||
{
|
|
||||||
if (pool.CacheNode != _pools.Last)
|
|
||||||
{
|
|
||||||
_pools.Remove(pool.CacheNode);
|
|
||||||
|
|
||||||
pool.CacheNode = _pools.AddLast(pool);
|
|
||||||
}
|
|
||||||
|
|
||||||
return pool;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If not found, create a new one.
|
|
||||||
pool = new TexturePool(_context, channel, address, maximumId);
|
|
||||||
|
|
||||||
pool.CacheNode = _pools.AddLast(pool);
|
|
||||||
|
|
||||||
if (_pools.Count > MaxCapacity)
|
|
||||||
{
|
|
||||||
TexturePool oldestPool = _pools.First.Value;
|
|
||||||
|
|
||||||
_pools.RemoveFirst();
|
|
||||||
|
|
||||||
oldestPool.Dispose();
|
|
||||||
|
|
||||||
oldestPool.CacheNode = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return pool;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -14,7 +14,7 @@ namespace Ryujinx.Ui.Common.Configuration
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The current version of the file format
|
/// The current version of the file format
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const int CurrentVersion = 38;
|
public const int CurrentVersion = 39;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Version of the configuration file format
|
/// Version of the configuration file format
|
||||||
|
@@ -648,7 +648,9 @@ namespace Ryujinx.Ui.Common.Configuration
|
|||||||
ToggleMute = Key.F2,
|
ToggleMute = Key.F2,
|
||||||
Screenshot = Key.F8,
|
Screenshot = Key.F8,
|
||||||
ShowUi = Key.F4,
|
ShowUi = Key.F4,
|
||||||
Pause = Key.F5
|
Pause = Key.F5,
|
||||||
|
ResScaleUp = Key.Unbound,
|
||||||
|
ResScaleDown = Key.Unbound
|
||||||
};
|
};
|
||||||
Hid.InputConfig.Value = new List<InputConfig>
|
Hid.InputConfig.Value = new List<InputConfig>
|
||||||
{
|
{
|
||||||
@@ -1096,6 +1098,22 @@ namespace Ryujinx.Ui.Common.Configuration
|
|||||||
configurationFileUpdated = true;
|
configurationFileUpdated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (configurationFileFormat.Version < 39)
|
||||||
|
{
|
||||||
|
Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 39.");
|
||||||
|
|
||||||
|
configurationFileFormat.Hotkeys = new KeyboardHotkeys
|
||||||
|
{
|
||||||
|
ToggleVsync = configurationFileFormat.Hotkeys.ToggleVsync,
|
||||||
|
Screenshot = configurationFileFormat.Hotkeys.Screenshot,
|
||||||
|
ShowUi = configurationFileFormat.Hotkeys.ShowUi,
|
||||||
|
Pause = configurationFileFormat.Hotkeys.Pause,
|
||||||
|
ToggleMute = configurationFileFormat.Hotkeys.ToggleMute,
|
||||||
|
ResScaleUp = Key.Unbound,
|
||||||
|
ResScaleDown = Key.Unbound
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog;
|
Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog;
|
||||||
Graphics.ResScale.Value = configurationFileFormat.ResScale;
|
Graphics.ResScale.Value = configurationFileFormat.ResScale;
|
||||||
Graphics.ResScaleCustom.Value = configurationFileFormat.ResScaleCustom;
|
Graphics.ResScaleCustom.Value = configurationFileFormat.ResScaleCustom;
|
||||||
|
@@ -29,7 +29,7 @@
|
|||||||
<object class="GtkMenuItem" id="_loadApplicationFile">
|
<object class="GtkMenuItem" id="_loadApplicationFile">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="tooltip_text" translatable="yes">Open a file chooser to chose a switch compatible file to load</property>
|
<property name="tooltip_text" translatable="yes">Open a file explorer to choose a Switch compatible file to load</property>
|
||||||
<property name="label" translatable="yes">Load Application from File</property>
|
<property name="label" translatable="yes">Load Application from File</property>
|
||||||
<property name="use_underline">True</property>
|
<property name="use_underline">True</property>
|
||||||
<signal name="activate" handler="Load_Application_File" swapped="no"/>
|
<signal name="activate" handler="Load_Application_File" swapped="no"/>
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
<object class="GtkMenuItem" id="_loadApplicationFolder">
|
<object class="GtkMenuItem" id="_loadApplicationFolder">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="tooltip_text" translatable="yes">Open a file chooser to chose a switch compatible, unpacked application to load</property>
|
<property name="tooltip_text" translatable="yes">Open a file explorer to choose a Switch compatible, unpacked application to load</property>
|
||||||
<property name="label" translatable="yes">Load Unpacked Game</property>
|
<property name="label" translatable="yes">Load Unpacked Game</property>
|
||||||
<property name="use_underline">True</property>
|
<property name="use_underline">True</property>
|
||||||
<signal name="activate" handler="Load_Application_Folder" swapped="no"/>
|
<signal name="activate" handler="Load_Application_Folder" swapped="no"/>
|
||||||
|
@@ -6,6 +6,7 @@ using Ryujinx.Common;
|
|||||||
using Ryujinx.Common.Configuration;
|
using Ryujinx.Common.Configuration;
|
||||||
using Ryujinx.Common.Logging;
|
using Ryujinx.Common.Logging;
|
||||||
using Ryujinx.Ui.Common.Configuration;
|
using Ryujinx.Ui.Common.Configuration;
|
||||||
|
using Ryujinx.Graphics.Gpu;
|
||||||
using Ryujinx.Graphics.GAL;
|
using Ryujinx.Graphics.GAL;
|
||||||
using Ryujinx.Graphics.GAL.Multithreading;
|
using Ryujinx.Graphics.GAL.Multithreading;
|
||||||
using Ryujinx.Input;
|
using Ryujinx.Input;
|
||||||
@@ -33,6 +34,7 @@ namespace Ryujinx.Ui
|
|||||||
private const int SwitchPanelWidth = 1280;
|
private const int SwitchPanelWidth = 1280;
|
||||||
private const int SwitchPanelHeight = 720;
|
private const int SwitchPanelHeight = 720;
|
||||||
private const int TargetFps = 60;
|
private const int TargetFps = 60;
|
||||||
|
private const float MaxResolutionScale = 4.0f; // Max resolution hotkeys can scale to before wrapping.
|
||||||
|
|
||||||
public ManualResetEvent WaitEvent { get; set; }
|
public ManualResetEvent WaitEvent { get; set; }
|
||||||
public NpadManager NpadManager { get; }
|
public NpadManager NpadManager { get; }
|
||||||
@@ -618,6 +620,19 @@ namespace Ryujinx.Ui
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (currentHotkeyState.HasFlag(KeyboardHotkeyState.ResScaleUp) &&
|
||||||
|
!_prevHotkeyState.HasFlag(KeyboardHotkeyState.ResScaleUp))
|
||||||
|
{
|
||||||
|
GraphicsConfig.ResScale = GraphicsConfig.ResScale % MaxResolutionScale + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentHotkeyState.HasFlag(KeyboardHotkeyState.ResScaleDown) &&
|
||||||
|
!_prevHotkeyState.HasFlag(KeyboardHotkeyState.ResScaleDown))
|
||||||
|
{
|
||||||
|
GraphicsConfig.ResScale =
|
||||||
|
(MaxResolutionScale + GraphicsConfig.ResScale - 2) % MaxResolutionScale + 1;
|
||||||
|
}
|
||||||
|
|
||||||
_prevHotkeyState = currentHotkeyState;
|
_prevHotkeyState = currentHotkeyState;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -648,7 +663,9 @@ namespace Ryujinx.Ui
|
|||||||
Screenshot = 1 << 1,
|
Screenshot = 1 << 1,
|
||||||
ShowUi = 1 << 2,
|
ShowUi = 1 << 2,
|
||||||
Pause = 1 << 3,
|
Pause = 1 << 3,
|
||||||
ToggleMute = 1 << 4
|
ToggleMute = 1 << 4,
|
||||||
|
ResScaleUp = 1 << 5,
|
||||||
|
ResScaleDown = 1 << 6
|
||||||
}
|
}
|
||||||
|
|
||||||
private KeyboardHotkeyState GetHotkeyState()
|
private KeyboardHotkeyState GetHotkeyState()
|
||||||
@@ -680,6 +697,16 @@ namespace Ryujinx.Ui
|
|||||||
state |= KeyboardHotkeyState.ToggleMute;
|
state |= KeyboardHotkeyState.ToggleMute;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_keyboardInterface.IsPressed((Key)ConfigurationState.Instance.Hid.Hotkeys.Value.ResScaleUp))
|
||||||
|
{
|
||||||
|
state |= KeyboardHotkeyState.ResScaleUp;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_keyboardInterface.IsPressed((Key)ConfigurationState.Instance.Hid.Hotkeys.Value.ResScaleDown))
|
||||||
|
{
|
||||||
|
state |= KeyboardHotkeyState.ResScaleDown;
|
||||||
|
}
|
||||||
|
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -110,7 +110,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="receives-default">False</property>
|
<property name="receives-default">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enables or disables Discord Rich Presence</property>
|
<property name="tooltip-text" translatable="yes">Choose whether or not to display Ryujinx on your "currently playing" Discord activity</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="draw-indicator">True</property>
|
<property name="draw-indicator">True</property>
|
||||||
</object>
|
</object>
|
||||||
@@ -264,7 +264,7 @@
|
|||||||
<object class="GtkEntry" id="_addGameDirBox">
|
<object class="GtkEntry" id="_addGameDirBox">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enter a game directroy to add to the list</property>
|
<property name="tooltip-text" translatable="yes">Enter a game directory to add to the list</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">True</property>
|
<property name="expand">True</property>
|
||||||
@@ -494,7 +494,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="receives-default">False</property>
|
<property name="receives-default">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enable or disable Docked Mode</property>
|
<property name="tooltip-text" translatable="yes">Docked mode makes the emulated system behave as a docked Nintendo Switch. This improves graphical fidelity in most games. Conversely, disabling this will make the emulated system behave as a handheld Nintendo Switch, reducing graphics quality. Configure player 1 controls if planning to use docked mode; configure handheld controls if planning to use handheld mode. Leave ON if unsure.</property>
|
||||||
<property name="draw-indicator">True</property>
|
<property name="draw-indicator">True</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
@@ -510,7 +510,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="receives-default">False</property>
|
<property name="receives-default">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enable or disable "direct keyboard access (HID) support" (Provides games access to your keyboard as a text entry device)</property>
|
<property name="tooltip-text" translatable="yes">Direct keyboard access (HID) support. Provides games access to your keyboard as a text entry device.</property>
|
||||||
<property name="draw-indicator">True</property>
|
<property name="draw-indicator">True</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
@@ -526,7 +526,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="receives-default">False</property>
|
<property name="receives-default">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enable or disable "direct mouse access (HID) support" (Provides games access to your mouse as a pointing device)</property>
|
<property name="tooltip-text" translatable="yes">Direct mouse access (HID) support. Provides games access to your mouse as a pointing device.</property>
|
||||||
<property name="draw-indicator">True</property>
|
<property name="draw-indicator">True</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
@@ -1477,7 +1477,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="receives-default">False</property>
|
<property name="receives-default">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enables or disables Vertical Sync</property>
|
<property name="tooltip-text" translatable="yes">Emulated console's Vertical Sync. Essentially a frame-limiter for the majority of games; disabling it may cause games to run at higher speed or make loading screens take longer or get stuck. Can be toggled in-game with a hotkey of your preference. We recommend doing this if you plan on disabling it. Leave ON if unsure.</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="margin-top">5</property>
|
<property name="margin-top">5</property>
|
||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
@@ -1495,7 +1495,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="receives-default">False</property>
|
<property name="receives-default">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enables or disables profiled translation cache persistency</property>
|
<property name="tooltip-text" translatable="yes">Saves translated JIT functions so that they do not need to be translated every time the game loads. Reduces stuttering and significantly speeds up boot times after the first boot of a game. Leave ON if unsure.</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="margin-top">5</property>
|
<property name="margin-top">5</property>
|
||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
@@ -1513,7 +1513,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="receives-default">False</property>
|
<property name="receives-default">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enables guest Internet access. If enabled, the application will behave as if the emulated Switch console was connected to the Internet. Note that in some cases, applications may still access the Internet even with this option disabled</property>
|
<property name="tooltip-text" translatable="yes">Allows the emulated application to connect to the Internet. Games with a LAN mode can connect to each other when this is enabled and the systems are connected to the same access point. This includes real consoles as well. Does NOT allow connecting to Nintendo servers. May cause crashing in certain games that try to connect to the Internet. Leave OFF if unsure.</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="margin-top">5</property>
|
<property name="margin-top">5</property>
|
||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
@@ -1531,7 +1531,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="receives-default">False</property>
|
<property name="receives-default">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enables integrity checks on Game content files</property>
|
<property name="tooltip-text" translatable="yes">Checks for corrupt files when booting a game, and if corrupt files are detected, displays a hash error in the log. Has no impact on performance and is meant to help troubleshooting. Leave ON if unsure.</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="margin-top">5</property>
|
<property name="margin-top">5</property>
|
||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
@@ -1561,7 +1561,7 @@
|
|||||||
<object class="GtkLabel">
|
<object class="GtkLabel">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Change Audio Backend</property>
|
<property name="tooltip-text" translatable="yes">Changes the backend used to render audio. SDL2 is the preferred one, while OpenAL and SoundIO are used as fallbacks. Dummy will have no sound. Set to SDL2 if unsure.</property>
|
||||||
<property name="halign">end</property>
|
<property name="halign">end</property>
|
||||||
<property name="margin-right">5</property>
|
<property name="margin-right">5</property>
|
||||||
<property name="label" translatable="yes">Audio Backend: </property>
|
<property name="label" translatable="yes">Audio Backend: </property>
|
||||||
@@ -1592,7 +1592,7 @@
|
|||||||
<object class="GtkLabel">
|
<object class="GtkLabel">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Change how guest memory is mapped and accessed. Greatly affects emulated CPU performance.</property>
|
<property name="tooltip-text" translatable="yes">Change how guest memory is mapped and accessed. Greatly affects emulated CPU performance. Set to HOST UNCHECKED if unsure.</property>
|
||||||
<property name="halign">end</property>
|
<property name="halign">end</property>
|
||||||
<property name="margin-right">5</property>
|
<property name="margin-right">5</property>
|
||||||
<property name="label" translatable="yes">Memory Manager Mode: </property>
|
<property name="label" translatable="yes">Memory Manager Mode: </property>
|
||||||
@@ -1753,7 +1753,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="receives-default">False</property>
|
<property name="receives-default">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Expands the amount of memory on the emulated system from 4GB to 6GB</property>
|
<property name="tooltip-text" translatable="yes">Increases the amount of memory on the emulated system from 4GB to 6GB. This is only useful for higher-resolution texture packs or 4k resolution mods. Does NOT improve performance. Leave OFF if unsure.</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="margin-top">5</property>
|
<property name="margin-top">5</property>
|
||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
@@ -1771,7 +1771,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="receives-default">False</property>
|
<property name="receives-default">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enable or disable ignoring missing services</property>
|
<property name="tooltip-text" translatable="yes">Ignores unimplemented Horizon OS services. This may help in bypassing crashes when booting certain games. Leave OFF if unsure.</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="margin-top">5</property>
|
<property name="margin-top">5</property>
|
||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
@@ -1864,7 +1864,7 @@
|
|||||||
<object class="GtkLabel">
|
<object class="GtkLabel">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enable Graphics Backend Multithreading</property>
|
<property name="tooltip-text" translatable="yes">Executes graphics backend commands on a second thread. Speeds up shader compilation, reduces stuttering, and improves performance on GPU drivers without multithreading support of their own. Slightly better performance on drivers with multithreading. Set to AUTO if unsure.</property>
|
||||||
<property name="label" translatable="yes">Graphics Backend Multithreading:</property>
|
<property name="label" translatable="yes">Graphics Backend Multithreading:</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
@@ -1878,7 +1878,7 @@
|
|||||||
<object class="GtkComboBoxText" id="_galThreading">
|
<object class="GtkComboBoxText" id="_galThreading">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Executes graphics backend commands on a second thread. Allows runtime multithreading of shader compilation, reduces stuttering, and improves performance on drivers without multithreading support of their own. Slightly varying peak performance on drivers with multithreading. Ryujinx may need to be restarted to correctly disable driver built-in multithreading, or you may need to do it manually to get the best performance.</property>
|
<property name="tooltip-text" translatable="yes">Executes graphics backend commands on a second thread. Speeds up shader compilation, reduces stuttering, and improves performance on GPU drivers without multithreading support of their own. Slightly better performance on drivers with multithreading. Set to AUTO if unsure.</property>
|
||||||
<property name="active-id">-1</property>
|
<property name="active-id">-1</property>
|
||||||
<items>
|
<items>
|
||||||
<item id="Auto" translatable="yes">Auto</item>
|
<item id="Auto" translatable="yes">Auto</item>
|
||||||
@@ -1954,7 +1954,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="receives-default">False</property>
|
<property name="receives-default">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enables or disables Shader Cache</property>
|
<property name="tooltip-text" translatable="yes">Saves a disk shader cache which reduces stuttering in subsequent runs. Leave ON if unsure.</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="margin-top">5</property>
|
<property name="margin-top">5</property>
|
||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
@@ -2306,7 +2306,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="receives-default">False</property>
|
<property name="receives-default">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enables or disables logging to a file on disk</property>
|
<property name="tooltip-text" translatable="yes">Saves console logging to a log file on disk. Does not affect performance.</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="margin-top">5</property>
|
<property name="margin-top">5</property>
|
||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
@@ -2324,7 +2324,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="receives-default">False</property>
|
<property name="receives-default">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enables printing stub log messages</property>
|
<property name="tooltip-text" translatable="yes">Prints stub log messages in the console. Does not affect performance.</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="margin-top">5</property>
|
<property name="margin-top">5</property>
|
||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
@@ -2342,7 +2342,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="receives-default">False</property>
|
<property name="receives-default">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enables printing info log messages</property>
|
<property name="tooltip-text" translatable="yes">Prints info log messages in the console. Does not affect performance.</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="margin-top">5</property>
|
<property name="margin-top">5</property>
|
||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
@@ -2360,7 +2360,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="receives-default">False</property>
|
<property name="receives-default">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enables printing warning log messages</property>
|
<property name="tooltip-text" translatable="yes">Prints warning log messages in the console. Does not affect performance.</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="margin-top">5</property>
|
<property name="margin-top">5</property>
|
||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
@@ -2378,7 +2378,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="receives-default">False</property>
|
<property name="receives-default">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enables printing error log messages</property>
|
<property name="tooltip-text" translatable="yes">Prints error log messages in the console. Does not affect performance.</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="margin-top">5</property>
|
<property name="margin-top">5</property>
|
||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
@@ -2396,7 +2396,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="receives-default">False</property>
|
<property name="receives-default">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enables printing guest log messages</property>
|
<property name="tooltip-text" translatable="yes">Prints guest log messages in the console. Does not affect performance.</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="margin-top">5</property>
|
<property name="margin-top">5</property>
|
||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
@@ -2414,7 +2414,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="receives-default">False</property>
|
<property name="receives-default">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enables printing fs access log messages</property>
|
<property name="tooltip-text" translatable="yes">Enables FS access log output to the console. Possible modes are 0-3</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="margin-top">5</property>
|
<property name="margin-top">5</property>
|
||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
@@ -2560,7 +2560,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="receives-default">False</property>
|
<property name="receives-default">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enables printing debug log messages</property>
|
<property name="tooltip-text" translatable="yes">Prints debug log messages in the console. Only use this if specifically instructed by a staff member, as it will make logs difficult to read and worsen emulator performance.</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="margin-top">5</property>
|
<property name="margin-top">5</property>
|
||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
@@ -2578,7 +2578,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="receives-default">False</property>
|
<property name="receives-default">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">Enables printing trace log messages</property>
|
<property name="tooltip-text" translatable="yes">Prints trace log messages in the console. Does not affect performance.</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="margin-top">5</property>
|
<property name="margin-top">5</property>
|
||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
|
Reference in New Issue
Block a user