Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
0e06aace45 | ||
|
adf4ebcd60 | ||
|
470a8031a4 | ||
|
5440d4ad5c |
@@ -238,8 +238,9 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public DateTimeOffset DateOffset { get; set; }
|
public DateTimeOffset CurrentDate { get; set; }
|
||||||
public TimeSpan TimeOffset { get; set; }
|
public TimeSpan CurrentTime { get; set; }
|
||||||
|
|
||||||
internal AvaloniaList<TimeZone> TimeZones { get; set; }
|
internal AvaloniaList<TimeZone> TimeZones { get; set; }
|
||||||
public AvaloniaList<string> GameDirectories { get; set; }
|
public AvaloniaList<string> GameDirectories { get; set; }
|
||||||
public ObservableCollection<ComboBoxItem> AvailableGpus { get; set; }
|
public ObservableCollection<ComboBoxItem> AvailableGpus { get; set; }
|
||||||
@@ -397,10 +398,11 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
Language = (int)config.System.Language.Value;
|
Language = (int)config.System.Language.Value;
|
||||||
TimeZone = config.System.TimeZone;
|
TimeZone = config.System.TimeZone;
|
||||||
|
|
||||||
DateTime dateTimeOffset = DateTime.Now.AddSeconds(config.System.SystemTimeOffset);
|
DateTime currentDateTime = DateTime.Now;
|
||||||
|
|
||||||
|
CurrentDate = currentDateTime.Date;
|
||||||
|
CurrentTime = currentDateTime.TimeOfDay.Add(TimeSpan.FromSeconds(config.System.SystemTimeOffset));
|
||||||
|
|
||||||
DateOffset = dateTimeOffset.Date;
|
|
||||||
TimeOffset = dateTimeOffset.TimeOfDay;
|
|
||||||
EnableVsync = config.Graphics.EnableVsync;
|
EnableVsync = config.Graphics.EnableVsync;
|
||||||
EnableFsIntegrityChecks = config.System.EnableFsIntegrityChecks;
|
EnableFsIntegrityChecks = config.System.EnableFsIntegrityChecks;
|
||||||
ExpandDramSize = config.System.ExpandRam;
|
ExpandDramSize = config.System.ExpandRam;
|
||||||
@@ -487,9 +489,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
config.System.TimeZone.Value = TimeZone;
|
config.System.TimeZone.Value = TimeZone;
|
||||||
}
|
}
|
||||||
|
|
||||||
TimeSpan systemTimeOffset = DateOffset - DateTime.Now;
|
config.System.SystemTimeOffset.Value = Convert.ToInt64((CurrentDate.ToUnixTimeSeconds() + CurrentTime.TotalSeconds) - DateTimeOffset.Now.ToUnixTimeSeconds());
|
||||||
|
|
||||||
config.System.SystemTimeOffset.Value = systemTimeOffset.Seconds;
|
|
||||||
config.Graphics.EnableVsync.Value = EnableVsync;
|
config.Graphics.EnableVsync.Value = EnableVsync;
|
||||||
config.System.EnableFsIntegrityChecks.Value = EnableFsIntegrityChecks;
|
config.System.EnableFsIntegrityChecks.Value = EnableFsIntegrityChecks;
|
||||||
config.System.ExpandRam.Value = ExpandDramSize;
|
config.System.ExpandRam.Value = ExpandDramSize;
|
||||||
|
@@ -3,12 +3,12 @@
|
|||||||
xmlns="https://github.com/avaloniaui"
|
xmlns="https://github.com/avaloniaui"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
||||||
xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
|
xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
|
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
|
||||||
mc:Ignorable="d"
|
|
||||||
x:CompileBindings="True"
|
x:CompileBindings="True"
|
||||||
x:DataType="viewModels:SettingsViewModel">
|
x:DataType="viewModels:SettingsViewModel"
|
||||||
|
mc:Ignorable="d">
|
||||||
<Design.DataContext>
|
<Design.DataContext>
|
||||||
<viewModels:SettingsViewModel />
|
<viewModels:SettingsViewModel />
|
||||||
</Design.DataContext>
|
</Design.DataContext>
|
||||||
@@ -27,13 +27,15 @@
|
|||||||
<TextBlock Classes="h1" Text="{locale:Locale SettingsTabSystemCore}" />
|
<TextBlock Classes="h1" Text="{locale:Locale SettingsTabSystemCore}" />
|
||||||
<StackPanel Margin="10,0,0,0" Orientation="Vertical">
|
<StackPanel Margin="10,0,0,0" Orientation="Vertical">
|
||||||
<StackPanel Margin="0,0,0,10" Orientation="Horizontal">
|
<StackPanel Margin="0,0,0,10" Orientation="Horizontal">
|
||||||
<TextBlock VerticalAlignment="Center"
|
<TextBlock
|
||||||
Text="{locale:Locale SettingsTabSystemSystemRegion}"
|
Width="250"
|
||||||
Width="250" />
|
VerticalAlignment="Center"
|
||||||
<ComboBox SelectedIndex="{Binding Region}"
|
Text="{locale:Locale SettingsTabSystemSystemRegion}" />
|
||||||
ToolTip.Tip="{locale:Locale RegionTooltip}"
|
<ComboBox
|
||||||
HorizontalContentAlignment="Left"
|
Width="350"
|
||||||
Width="350">
|
HorizontalContentAlignment="Left"
|
||||||
|
SelectedIndex="{Binding Region}"
|
||||||
|
ToolTip.Tip="{locale:Locale RegionTooltip}">
|
||||||
<ComboBoxItem>
|
<ComboBoxItem>
|
||||||
<TextBlock Text="{locale:Locale SettingsTabSystemSystemRegionJapan}" />
|
<TextBlock Text="{locale:Locale SettingsTabSystemSystemRegionJapan}" />
|
||||||
</ComboBoxItem>
|
</ComboBoxItem>
|
||||||
@@ -58,20 +60,21 @@
|
|||||||
</ComboBox>
|
</ComboBox>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<StackPanel Margin="0,0,0,10" Orientation="Horizontal">
|
<StackPanel Margin="0,0,0,10" Orientation="Horizontal">
|
||||||
<TextBlock VerticalAlignment="Center"
|
<TextBlock
|
||||||
Text="{locale:Locale SettingsTabSystemSystemLanguage}"
|
Width="250"
|
||||||
ToolTip.Tip="{locale:Locale LanguageTooltip}"
|
VerticalAlignment="Center"
|
||||||
Width="250" />
|
Text="{locale:Locale SettingsTabSystemSystemLanguage}"
|
||||||
<ComboBox SelectedIndex="{Binding Language}"
|
ToolTip.Tip="{locale:Locale LanguageTooltip}" />
|
||||||
ToolTip.Tip="{locale:Locale LanguageTooltip}"
|
<ComboBox
|
||||||
HorizontalContentAlignment="Left"
|
Width="350"
|
||||||
Width="350">
|
HorizontalContentAlignment="Left"
|
||||||
|
SelectedIndex="{Binding Language}"
|
||||||
|
ToolTip.Tip="{locale:Locale LanguageTooltip}">
|
||||||
<ComboBoxItem>
|
<ComboBoxItem>
|
||||||
<TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageJapanese}" />
|
<TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageJapanese}" />
|
||||||
</ComboBoxItem>
|
</ComboBoxItem>
|
||||||
<ComboBoxItem>
|
<ComboBoxItem>
|
||||||
<TextBlock
|
<TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageAmericanEnglish}" />
|
||||||
Text="{locale:Locale SettingsTabSystemSystemLanguageAmericanEnglish}" />
|
|
||||||
</ComboBoxItem>
|
</ComboBoxItem>
|
||||||
<ComboBoxItem>
|
<ComboBoxItem>
|
||||||
<TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageFrench}" />
|
<TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageFrench}" />
|
||||||
@@ -104,71 +107,67 @@
|
|||||||
<TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageTaiwanese}" />
|
<TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageTaiwanese}" />
|
||||||
</ComboBoxItem>
|
</ComboBoxItem>
|
||||||
<ComboBoxItem>
|
<ComboBoxItem>
|
||||||
<TextBlock
|
<TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageBritishEnglish}" />
|
||||||
Text="{locale:Locale SettingsTabSystemSystemLanguageBritishEnglish}" />
|
|
||||||
</ComboBoxItem>
|
</ComboBoxItem>
|
||||||
<ComboBoxItem>
|
<ComboBoxItem>
|
||||||
<TextBlock
|
<TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageCanadianFrench}" />
|
||||||
Text="{locale:Locale SettingsTabSystemSystemLanguageCanadianFrench}" />
|
|
||||||
</ComboBoxItem>
|
</ComboBoxItem>
|
||||||
<ComboBoxItem>
|
<ComboBoxItem>
|
||||||
<TextBlock
|
<TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageLatinAmericanSpanish}" />
|
||||||
Text="{locale:Locale SettingsTabSystemSystemLanguageLatinAmericanSpanish}" />
|
|
||||||
</ComboBoxItem>
|
</ComboBoxItem>
|
||||||
<ComboBoxItem>
|
<ComboBoxItem>
|
||||||
<TextBlock
|
<TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageSimplifiedChinese}" />
|
||||||
Text="{locale:Locale SettingsTabSystemSystemLanguageSimplifiedChinese}" />
|
|
||||||
</ComboBoxItem>
|
</ComboBoxItem>
|
||||||
<ComboBoxItem>
|
<ComboBoxItem>
|
||||||
<TextBlock
|
<TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageTraditionalChinese}" />
|
||||||
Text="{locale:Locale SettingsTabSystemSystemLanguageTraditionalChinese}" />
|
|
||||||
</ComboBoxItem>
|
</ComboBoxItem>
|
||||||
<ComboBoxItem>
|
<ComboBoxItem>
|
||||||
<TextBlock
|
<TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageBrazilianPortuguese}" />
|
||||||
Text="{locale:Locale SettingsTabSystemSystemLanguageBrazilianPortuguese}" />
|
|
||||||
</ComboBoxItem>
|
</ComboBoxItem>
|
||||||
</ComboBox>
|
</ComboBox>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<StackPanel Margin="0,0,0,10" Orientation="Horizontal">
|
<StackPanel Margin="0,0,0,10" Orientation="Horizontal">
|
||||||
<TextBlock VerticalAlignment="Center"
|
<TextBlock
|
||||||
Text="{locale:Locale SettingsTabSystemSystemTimeZone}"
|
Width="250"
|
||||||
ToolTip.Tip="{locale:Locale TimezoneTooltip}"
|
VerticalAlignment="Center"
|
||||||
Width="250" />
|
Text="{locale:Locale SettingsTabSystemSystemTimeZone}"
|
||||||
|
ToolTip.Tip="{locale:Locale TimezoneTooltip}" />
|
||||||
<AutoCompleteBox
|
<AutoCompleteBox
|
||||||
Name="TimeZoneBox"
|
Name="TimeZoneBox"
|
||||||
Width="350"
|
Width="350"
|
||||||
MaxDropDownHeight="500"
|
|
||||||
FilterMode="Contains"
|
FilterMode="Contains"
|
||||||
Items="{Binding TimeZones}"
|
Items="{Binding TimeZones}"
|
||||||
|
MaxDropDownHeight="500"
|
||||||
SelectionChanged="TimeZoneBox_OnSelectionChanged"
|
SelectionChanged="TimeZoneBox_OnSelectionChanged"
|
||||||
Text="{Binding Path=TimeZone, Mode=OneWay}"
|
Text="{Binding Path=TimeZone, Mode=OneWay}"
|
||||||
TextChanged="TimeZoneBox_OnTextChanged"
|
TextChanged="TimeZoneBox_OnTextChanged"
|
||||||
ToolTip.Tip="{locale:Locale TimezoneTooltip}" />
|
ToolTip.Tip="{locale:Locale TimezoneTooltip}" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<StackPanel Margin="0,0,0,10" Orientation="Horizontal">
|
<StackPanel Margin="0,0,0,10" Orientation="Horizontal">
|
||||||
<TextBlock VerticalAlignment="Center"
|
<TextBlock
|
||||||
Text="{locale:Locale SettingsTabSystemSystemTime}"
|
Width="250"
|
||||||
ToolTip.Tip="{locale:Locale TimeTooltip}"
|
VerticalAlignment="Center"
|
||||||
Width="250"/>
|
Text="{locale:Locale SettingsTabSystemSystemTime}"
|
||||||
<DatePicker VerticalAlignment="Center" SelectedDate="{Binding DateOffset}"
|
ToolTip.Tip="{locale:Locale TimeTooltip}" />
|
||||||
ToolTip.Tip="{locale:Locale TimeTooltip}"
|
<DatePicker
|
||||||
Width="350" />
|
Width="350"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
SelectedDate="{Binding CurrentDate}"
|
||||||
|
ToolTip.Tip="{locale:Locale TimeTooltip}" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<StackPanel Margin="250,0,0,10" Orientation="Horizontal">
|
<StackPanel Margin="250,0,0,10" Orientation="Horizontal">
|
||||||
<TimePicker
|
<TimePicker
|
||||||
|
Width="350"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
ClockIdentifier="24HourClock"
|
ClockIdentifier="24HourClock"
|
||||||
SelectedTime="{Binding TimeOffset}"
|
SelectedTime="{Binding CurrentTime}"
|
||||||
Width="350"
|
|
||||||
ToolTip.Tip="{locale:Locale TimeTooltip}" />
|
ToolTip.Tip="{locale:Locale TimeTooltip}" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<CheckBox IsChecked="{Binding EnableVsync}">
|
<CheckBox IsChecked="{Binding EnableVsync}">
|
||||||
<TextBlock Text="{locale:Locale SettingsTabSystemEnableVsync}"
|
<TextBlock Text="{locale:Locale SettingsTabSystemEnableVsync}" ToolTip.Tip="{locale:Locale VSyncToggleTooltip}" />
|
||||||
ToolTip.Tip="{locale:Locale VSyncToggleTooltip}" />
|
|
||||||
</CheckBox>
|
</CheckBox>
|
||||||
<CheckBox IsChecked="{Binding EnableFsIntegrityChecks}">
|
<CheckBox IsChecked="{Binding EnableFsIntegrityChecks}">
|
||||||
<TextBlock Text="{locale:Locale SettingsTabSystemEnableFsIntegrityChecks}"
|
<TextBlock Text="{locale:Locale SettingsTabSystemEnableFsIntegrityChecks}" ToolTip.Tip="{locale:Locale FsIntegrityToggleTooltip}" />
|
||||||
ToolTip.Tip="{locale:Locale FsIntegrityToggleTooltip}" />
|
|
||||||
</CheckBox>
|
</CheckBox>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<Separator Height="1" />
|
<Separator Height="1" />
|
||||||
@@ -180,12 +179,10 @@
|
|||||||
Margin="10,0,0,0"
|
Margin="10,0,0,0"
|
||||||
HorizontalAlignment="Stretch"
|
HorizontalAlignment="Stretch"
|
||||||
Orientation="Vertical">
|
Orientation="Vertical">
|
||||||
<CheckBox IsChecked="{Binding ExpandDramSize}"
|
<CheckBox IsChecked="{Binding ExpandDramSize}" ToolTip.Tip="{locale:Locale DRamTooltip}">
|
||||||
ToolTip.Tip="{locale:Locale DRamTooltip}">
|
|
||||||
<TextBlock Text="{locale:Locale SettingsTabSystemExpandDramSize}" />
|
<TextBlock Text="{locale:Locale SettingsTabSystemExpandDramSize}" />
|
||||||
</CheckBox>
|
</CheckBox>
|
||||||
<CheckBox IsChecked="{Binding IgnoreMissingServices}"
|
<CheckBox IsChecked="{Binding IgnoreMissingServices}" ToolTip.Tip="{locale:Locale IgnoreMissingServicesTooltip}">
|
||||||
ToolTip.Tip="{locale:Locale IgnoreMissingServicesTooltip}">
|
|
||||||
<TextBlock Text="{locale:Locale SettingsTabSystemIgnoreMissingServices}" />
|
<TextBlock Text="{locale:Locale SettingsTabSystemIgnoreMissingServices}" />
|
||||||
</CheckBox>
|
</CheckBox>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
@@ -200,9 +200,10 @@ namespace Ryujinx.HLE.HOS
|
|||||||
|
|
||||||
LibHacHorizonManager = device.Configuration.LibHacHorizonManager;
|
LibHacHorizonManager = device.Configuration.LibHacHorizonManager;
|
||||||
|
|
||||||
|
// We hardcode a clock source id to avoid it changing between each start.
|
||||||
// TODO: use set:sys (and get external clock source id from settings)
|
// TODO: use set:sys (and get external clock source id from settings)
|
||||||
// TODO: use "time!standard_steady_clock_rtc_update_interval_minutes" and implement a worker thread to be accurate.
|
// TODO: use "time!standard_steady_clock_rtc_update_interval_minutes" and implement a worker thread to be accurate.
|
||||||
UInt128 clockSourceId = UInt128Utils.CreateRandom();
|
UInt128 clockSourceId = new UInt128(0x36a0328702ce8bc1, 0x1608eaba02333284);
|
||||||
IRtcManager.GetExternalRtcValue(out ulong rtcValue);
|
IRtcManager.GetExternalRtcValue(out ulong rtcValue);
|
||||||
|
|
||||||
// We assume the rtc is system time.
|
// We assume the rtc is system time.
|
||||||
@@ -222,22 +223,22 @@ namespace Ryujinx.HLE.HOS
|
|||||||
internalOffset = internalOffset.AddSeconds(-3600L);
|
internalOffset = internalOffset.AddSeconds(-3600L);
|
||||||
}
|
}
|
||||||
|
|
||||||
internalOffset = new TimeSpanType(-internalOffset.NanoSeconds);
|
systemTime = new TimeSpanType(systemTime.NanoSeconds + internalOffset.NanoSeconds);
|
||||||
|
|
||||||
// First init the standard steady clock
|
// First init the standard steady clock
|
||||||
TimeServiceManager.Instance.SetupStandardSteadyClock(TickSource, clockSourceId, systemTime, internalOffset, TimeSpanType.Zero, false);
|
TimeServiceManager.Instance.SetupStandardSteadyClock(TickSource, clockSourceId, TimeSpanType.Zero, TimeSpanType.Zero, TimeSpanType.Zero, false);
|
||||||
TimeServiceManager.Instance.SetupStandardLocalSystemClock(TickSource, new SystemClockContext(), systemTime.ToSeconds());
|
TimeServiceManager.Instance.SetupStandardLocalSystemClock(TickSource, new SystemClockContext(), systemTime.ToSeconds());
|
||||||
|
TimeServiceManager.Instance.StandardLocalSystemClock.GetClockContext(TickSource, out SystemClockContext localSytemClockContext);
|
||||||
|
|
||||||
if (NxSettings.Settings.TryGetValue("time!standard_network_clock_sufficient_accuracy_minutes", out object standardNetworkClockSufficientAccuracyMinutes))
|
if (NxSettings.Settings.TryGetValue("time!standard_network_clock_sufficient_accuracy_minutes", out object standardNetworkClockSufficientAccuracyMinutes))
|
||||||
{
|
{
|
||||||
TimeSpanType standardNetworkClockSufficientAccuracy = new TimeSpanType((int)standardNetworkClockSufficientAccuracyMinutes * 60000000000);
|
TimeSpanType standardNetworkClockSufficientAccuracy = new TimeSpanType((int)standardNetworkClockSufficientAccuracyMinutes * 60000000000);
|
||||||
|
|
||||||
// The network system clock needs a valid system clock, as such we setup this system clock using the local system clock.
|
// The network system clock needs a valid system clock, as such we setup this system clock using the local system clock.
|
||||||
TimeServiceManager.Instance.StandardLocalSystemClock.GetClockContext(TickSource, out SystemClockContext localSytemClockContext);
|
|
||||||
TimeServiceManager.Instance.SetupStandardNetworkSystemClock(localSytemClockContext, standardNetworkClockSufficientAccuracy);
|
TimeServiceManager.Instance.SetupStandardNetworkSystemClock(localSytemClockContext, standardNetworkClockSufficientAccuracy);
|
||||||
}
|
}
|
||||||
|
|
||||||
TimeServiceManager.Instance.SetupStandardUserSystemClock(TickSource, false, SteadyClockTimePoint.GetRandom());
|
TimeServiceManager.Instance.SetupStandardUserSystemClock(TickSource, true, localSytemClockContext.SteadyTimePoint);
|
||||||
|
|
||||||
// FIXME: TimeZone should be init here but it's actually done in ContentManager
|
// FIXME: TimeZone should be init here but it's actually done in ContentManager
|
||||||
|
|
||||||
|
@@ -0,0 +1,13 @@
|
|||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Ryujinx.HLE.HOS.Services.Time.Clock.Types
|
||||||
|
{
|
||||||
|
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||||
|
struct ContinuousAdjustmentTimePoint
|
||||||
|
{
|
||||||
|
public ulong ClockOffset;
|
||||||
|
public long Multiplier;
|
||||||
|
public long DivisorLog2;
|
||||||
|
public SystemClockContext Context;
|
||||||
|
}
|
||||||
|
}
|
@@ -1,8 +1,8 @@
|
|||||||
using Ryujinx.Cpu;
|
using Ryujinx.Cpu;
|
||||||
using Ryujinx.HLE.HOS.Kernel.Memory;
|
using Ryujinx.HLE.HOS.Kernel.Memory;
|
||||||
using Ryujinx.HLE.HOS.Services.Time.Clock;
|
using Ryujinx.HLE.HOS.Services.Time.Clock;
|
||||||
|
using Ryujinx.HLE.HOS.Services.Time.Clock.Types;
|
||||||
using Ryujinx.HLE.HOS.Services.Time.Types;
|
using Ryujinx.HLE.HOS.Services.Time.Types;
|
||||||
using Ryujinx.HLE.Utilities;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
@@ -16,10 +16,11 @@ namespace Ryujinx.HLE.HOS.Services.Time
|
|||||||
private SharedMemoryStorage _timeSharedMemoryStorage;
|
private SharedMemoryStorage _timeSharedMemoryStorage;
|
||||||
private int _timeSharedMemorySize;
|
private int _timeSharedMemorySize;
|
||||||
|
|
||||||
private const uint SteadyClockContextOffset = 0x00;
|
private const uint SteadyClockContextOffset = 0x00;
|
||||||
private const uint LocalSystemClockContextOffset = 0x38;
|
private const uint LocalSystemClockContextOffset = 0x38;
|
||||||
private const uint NetworkSystemClockContextOffset = 0x80;
|
private const uint NetworkSystemClockContextOffset = 0x80;
|
||||||
private const uint AutomaticCorrectionEnabledOffset = 0xC8;
|
private const uint AutomaticCorrectionEnabledOffset = 0xC8;
|
||||||
|
private const uint ContinuousAdjustmentTimePointOffset = 0xD0;
|
||||||
|
|
||||||
public void Initialize(Switch device, KSharedMemory sharedMemory, SharedMemoryStorage timeSharedMemoryStorage, int timeSharedMemorySize)
|
public void Initialize(Switch device, KSharedMemory sharedMemory, SharedMemoryStorage timeSharedMemoryStorage, int timeSharedMemorySize)
|
||||||
{
|
{
|
||||||
@@ -39,15 +40,7 @@ namespace Ryujinx.HLE.HOS.Services.Time
|
|||||||
|
|
||||||
public void SetupStandardSteadyClock(ITickSource tickSource, UInt128 clockSourceId, TimeSpanType currentTimePoint)
|
public void SetupStandardSteadyClock(ITickSource tickSource, UInt128 clockSourceId, TimeSpanType currentTimePoint)
|
||||||
{
|
{
|
||||||
TimeSpanType ticksTimeSpan = TimeSpanType.FromTicks(tickSource.Counter, tickSource.Frequency);
|
UpdateSteadyClock(tickSource, clockSourceId, currentTimePoint);
|
||||||
|
|
||||||
SteadyClockContext context = new SteadyClockContext
|
|
||||||
{
|
|
||||||
InternalOffset = (ulong)(currentTimePoint.NanoSeconds - ticksTimeSpan.NanoSeconds),
|
|
||||||
ClockSourceId = clockSourceId
|
|
||||||
};
|
|
||||||
|
|
||||||
WriteObjectToSharedMemory(SteadyClockContextOffset, 4, context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetAutomaticCorrectionEnabled(bool isAutomaticCorrectionEnabled)
|
public void SetAutomaticCorrectionEnabled(bool isAutomaticCorrectionEnabled)
|
||||||
@@ -58,10 +51,38 @@ namespace Ryujinx.HLE.HOS.Services.Time
|
|||||||
|
|
||||||
public void SetSteadyClockRawTimePoint(ITickSource tickSource, TimeSpanType currentTimePoint)
|
public void SetSteadyClockRawTimePoint(ITickSource tickSource, TimeSpanType currentTimePoint)
|
||||||
{
|
{
|
||||||
SteadyClockContext context = ReadObjectFromSharedMemory<SteadyClockContext>(SteadyClockContextOffset, 4);
|
SteadyClockContext context = ReadObjectFromSharedMemory<SteadyClockContext>(SteadyClockContextOffset, 4);
|
||||||
TimeSpanType ticksTimeSpan = TimeSpanType.FromTicks(tickSource.Counter, tickSource.Frequency);
|
|
||||||
|
|
||||||
context.InternalOffset = (ulong)(currentTimePoint.NanoSeconds - ticksTimeSpan.NanoSeconds);
|
UpdateSteadyClock(tickSource, context.ClockSourceId, currentTimePoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateSteadyClock(ITickSource tickSource, UInt128 clockSourceId, TimeSpanType currentTimePoint)
|
||||||
|
{
|
||||||
|
TimeSpanType ticksTimeSpan = TimeSpanType.FromTicks(tickSource.Counter, tickSource.Frequency);
|
||||||
|
|
||||||
|
ContinuousAdjustmentTimePoint adjustmentTimePoint = new ContinuousAdjustmentTimePoint
|
||||||
|
{
|
||||||
|
ClockOffset = (ulong)ticksTimeSpan.NanoSeconds,
|
||||||
|
Multiplier = 1,
|
||||||
|
DivisorLog2 = 0,
|
||||||
|
Context = new SystemClockContext
|
||||||
|
{
|
||||||
|
Offset = 0,
|
||||||
|
SteadyTimePoint = new SteadyClockTimePoint
|
||||||
|
{
|
||||||
|
ClockSourceId = clockSourceId,
|
||||||
|
TimePoint = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
WriteObjectToSharedMemory(ContinuousAdjustmentTimePointOffset, 4, adjustmentTimePoint);
|
||||||
|
|
||||||
|
SteadyClockContext context = new SteadyClockContext
|
||||||
|
{
|
||||||
|
InternalOffset = (ulong)(currentTimePoint.NanoSeconds - ticksTimeSpan.NanoSeconds),
|
||||||
|
ClockSourceId = clockSourceId
|
||||||
|
};
|
||||||
|
|
||||||
WriteObjectToSharedMemory(SteadyClockContextOffset, 4, context);
|
WriteObjectToSharedMemory(SteadyClockContextOffset, 4, context);
|
||||||
}
|
}
|
||||||
|
@@ -116,7 +116,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions
|
|||||||
device,
|
device,
|
||||||
device.System.KernelContext,
|
device.System.KernelContext,
|
||||||
metaLoader,
|
metaLoader,
|
||||||
nacpData.Value,
|
nacpData,
|
||||||
enablePtc,
|
enablePtc,
|
||||||
allowCodeMemoryForJit,
|
allowCodeMemoryForJit,
|
||||||
programName,
|
programName,
|
||||||
|
@@ -209,7 +209,7 @@ namespace Ryujinx.HLE.Loaders.Processes
|
|||||||
ProcessResult processResult = ProcessLoaderHelper.LoadNsos(_device,
|
ProcessResult processResult = ProcessLoaderHelper.LoadNsos(_device,
|
||||||
_device.System.KernelContext,
|
_device.System.KernelContext,
|
||||||
dummyExeFs.GetNpdm(),
|
dummyExeFs.GetNpdm(),
|
||||||
nacpData.Value,
|
nacpData,
|
||||||
diskCacheEnabled: false,
|
diskCacheEnabled: false,
|
||||||
allowCodeMemoryForJit: true,
|
allowCodeMemoryForJit: true,
|
||||||
programName,
|
programName,
|
||||||
|
@@ -219,7 +219,7 @@ namespace Ryujinx.HLE.Loaders.Processes
|
|||||||
Switch device,
|
Switch device,
|
||||||
KernelContext context,
|
KernelContext context,
|
||||||
MetaLoader metaLoader,
|
MetaLoader metaLoader,
|
||||||
ApplicationControlProperty applicationControlProperties,
|
BlitStruct<ApplicationControlProperty> applicationControlProperties,
|
||||||
bool diskCacheEnabled,
|
bool diskCacheEnabled,
|
||||||
bool allowCodeMemoryForJit,
|
bool allowCodeMemoryForJit,
|
||||||
string name,
|
string name,
|
||||||
@@ -355,7 +355,7 @@ namespace Ryujinx.HLE.Loaders.Processes
|
|||||||
context.Device.System.TickSource,
|
context.Device.System.TickSource,
|
||||||
context.Device.Gpu,
|
context.Device.Gpu,
|
||||||
$"{programId:x16}",
|
$"{programId:x16}",
|
||||||
applicationControlProperties.DisplayVersionString.ToString(),
|
applicationControlProperties.Value.DisplayVersionString.ToString(),
|
||||||
diskCacheEnabled,
|
diskCacheEnabled,
|
||||||
codeStart,
|
codeStart,
|
||||||
codeSize);
|
codeSize);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
using LibHac.Loader;
|
using LibHac.Common;
|
||||||
|
using LibHac.Loader;
|
||||||
using LibHac.Ns;
|
using LibHac.Ns;
|
||||||
using Ryujinx.Common.Logging;
|
using Ryujinx.Common.Logging;
|
||||||
using Ryujinx.Cpu;
|
using Ryujinx.Cpu;
|
||||||
@@ -9,9 +10,9 @@ using System.Linq;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.Loaders.Processes
|
namespace Ryujinx.HLE.Loaders.Processes
|
||||||
{
|
{
|
||||||
public struct ProcessResult
|
public class ProcessResult
|
||||||
{
|
{
|
||||||
public static ProcessResult Failed => new(null, new ApplicationControlProperty(), false, false, null, 0, 0, 0, TitleLanguage.AmericanEnglish);
|
public static ProcessResult Failed => new(null, new BlitStruct<ApplicationControlProperty>(1), false, false, null, 0, 0, 0, TitleLanguage.AmericanEnglish);
|
||||||
|
|
||||||
private readonly byte _mainThreadPriority;
|
private readonly byte _mainThreadPriority;
|
||||||
private readonly uint _mainThreadStackSize;
|
private readonly uint _mainThreadStackSize;
|
||||||
@@ -31,15 +32,15 @@ namespace Ryujinx.HLE.Loaders.Processes
|
|||||||
public readonly bool AllowCodeMemoryForJit;
|
public readonly bool AllowCodeMemoryForJit;
|
||||||
|
|
||||||
public ProcessResult(
|
public ProcessResult(
|
||||||
MetaLoader metaLoader,
|
MetaLoader metaLoader,
|
||||||
ApplicationControlProperty applicationControlProperties,
|
BlitStruct<ApplicationControlProperty> applicationControlProperties,
|
||||||
bool diskCacheEnabled,
|
bool diskCacheEnabled,
|
||||||
bool allowCodeMemoryForJit,
|
bool allowCodeMemoryForJit,
|
||||||
IDiskCacheLoadState diskCacheLoadState,
|
IDiskCacheLoadState diskCacheLoadState,
|
||||||
ulong pid,
|
ulong pid,
|
||||||
byte mainThreadPriority,
|
byte mainThreadPriority,
|
||||||
uint mainThreadStackSize,
|
uint mainThreadStackSize,
|
||||||
TitleLanguage titleLanguage)
|
TitleLanguage titleLanguage)
|
||||||
{
|
{
|
||||||
_mainThreadPriority = mainThreadPriority;
|
_mainThreadPriority = mainThreadPriority;
|
||||||
_mainThreadStackSize = mainThreadStackSize;
|
_mainThreadStackSize = mainThreadStackSize;
|
||||||
@@ -48,7 +49,7 @@ namespace Ryujinx.HLE.Loaders.Processes
|
|||||||
ProcessId = pid;
|
ProcessId = pid;
|
||||||
|
|
||||||
MetaLoader = metaLoader;
|
MetaLoader = metaLoader;
|
||||||
ApplicationControlProperties = applicationControlProperties;
|
ApplicationControlProperties = applicationControlProperties.Value;
|
||||||
|
|
||||||
if (metaLoader is not null)
|
if (metaLoader is not null)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user