forked from Mirror/Ryujinx
shader cache: Fix Linux boot issues (#1709)
* shader cache: Fix Linux boot issues This rollback the init logic back to previous state, and replicate the way PTC handle initialization. * shader cache: set default state of ready for translation event to false * Fix cpu unit tests
This commit is contained in:
parent
cc60ba9d22
commit
863edae328
7 changed files with 48 additions and 60 deletions
|
@ -31,6 +31,9 @@ namespace ARMeilleure.Translation
|
||||||
|
|
||||||
private volatile int _threadCount;
|
private volatile int _threadCount;
|
||||||
|
|
||||||
|
// FIXME: Remove this once the init logic of the emulator will be redone
|
||||||
|
public static ManualResetEvent IsReadyForTranslation = new ManualResetEvent(false);
|
||||||
|
|
||||||
public Translator(IJitMemoryAllocator allocator, IMemoryManager memory)
|
public Translator(IJitMemoryAllocator allocator, IMemoryManager memory)
|
||||||
{
|
{
|
||||||
_memory = memory;
|
_memory = memory;
|
||||||
|
@ -83,6 +86,8 @@ namespace ARMeilleure.Translation
|
||||||
{
|
{
|
||||||
if (Interlocked.Increment(ref _threadCount) == 1)
|
if (Interlocked.Increment(ref _threadCount) == 1)
|
||||||
{
|
{
|
||||||
|
IsReadyForTranslation.WaitOne();
|
||||||
|
|
||||||
if (Ptc.State == PtcState.Enabled)
|
if (Ptc.State == PtcState.Enabled)
|
||||||
{
|
{
|
||||||
Ptc.MakeAndSaveTranslations(_funcs, _memory, _jumpTable);
|
Ptc.MakeAndSaveTranslations(_funcs, _memory, _jumpTable);
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
using Ryujinx.Common.Configuration;
|
|
||||||
using Ryujinx.Graphics.GAL;
|
using Ryujinx.Graphics.GAL;
|
||||||
using Ryujinx.Graphics.Gpu.Engine;
|
using Ryujinx.Graphics.Gpu.Engine;
|
||||||
using Ryujinx.Graphics.Gpu.Engine.GPFifo;
|
using Ryujinx.Graphics.Gpu.Engine.GPFifo;
|
||||||
|
@ -19,11 +18,6 @@ namespace Ryujinx.Graphics.Gpu
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ManualResetEvent HostInitalized { get; }
|
public ManualResetEvent HostInitalized { get; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Event signaled when the gpu context is ready to be used.
|
|
||||||
/// </summary>
|
|
||||||
public ManualResetEvent ReadyEvent { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Host renderer.
|
/// Host renderer.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -93,20 +87,16 @@ namespace Ryujinx.Graphics.Gpu
|
||||||
_caps = new Lazy<Capabilities>(Renderer.GetCapabilities);
|
_caps = new Lazy<Capabilities>(Renderer.GetCapabilities);
|
||||||
|
|
||||||
HostInitalized = new ManualResetEvent(false);
|
HostInitalized = new ManualResetEvent(false);
|
||||||
ReadyEvent = new ManualResetEvent(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initialize the GPU emulation context.
|
/// Initialize the GPU shader cache.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="logLevel">The log level required.</param>
|
public void InitializeShaderCache()
|
||||||
public void Initialize(GraphicsDebugLevel logLevel)
|
|
||||||
{
|
{
|
||||||
HostInitalized.WaitOne();
|
HostInitalized.WaitOne();
|
||||||
|
|
||||||
Renderer.Initialize(logLevel);
|
|
||||||
Methods.ShaderCache.Initialize();
|
Methods.ShaderCache.Initialize();
|
||||||
ReadyEvent.Set();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -142,7 +132,6 @@ namespace Ryujinx.Graphics.Gpu
|
||||||
Renderer.Dispose();
|
Renderer.Dispose();
|
||||||
GPFifo.Dispose();
|
GPFifo.Dispose();
|
||||||
HostInitalized.Dispose();
|
HostInitalized.Dispose();
|
||||||
ReadyEvent.Dispose();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -503,8 +503,6 @@ namespace Ryujinx.HLE.HOS
|
||||||
|
|
||||||
Ptc.Initialize(TitleIdText, DisplayVersion, _device.System.EnablePtc && !modified);
|
Ptc.Initialize(TitleIdText, DisplayVersion, _device.System.EnablePtc && !modified);
|
||||||
|
|
||||||
_device.Gpu.ReadyEvent.WaitOne();
|
|
||||||
|
|
||||||
ProgramLoader.LoadNsos(_device.System.KernelContext, metaData, executables: programs);
|
ProgramLoader.LoadNsos(_device.System.KernelContext, metaData, executables: programs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -602,9 +600,7 @@ namespace Ryujinx.HLE.HOS
|
||||||
|
|
||||||
// Explicitly null titleid to disable the shader cache
|
// Explicitly null titleid to disable the shader cache
|
||||||
Graphics.Gpu.GraphicsConfig.TitleId = null;
|
Graphics.Gpu.GraphicsConfig.TitleId = null;
|
||||||
|
|
||||||
_device.Gpu.HostInitalized.Set();
|
_device.Gpu.HostInitalized.Set();
|
||||||
_device.Gpu.ReadyEvent.WaitOne();
|
|
||||||
|
|
||||||
ProgramLoader.LoadNsos(_device.System.KernelContext, metaData, executables: executable);
|
ProgramLoader.LoadNsos(_device.System.KernelContext, metaData, executables: executable);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using ARMeilleure.State;
|
using ARMeilleure.State;
|
||||||
|
using ARMeilleure.Translation;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using Ryujinx.Cpu;
|
using Ryujinx.Cpu;
|
||||||
using Ryujinx.Memory;
|
using Ryujinx.Memory;
|
||||||
|
@ -54,6 +55,7 @@ namespace Ryujinx.Tests.Cpu
|
||||||
_memory.Map(CodeBaseAddress, 0, Size * 2);
|
_memory.Map(CodeBaseAddress, 0, Size * 2);
|
||||||
|
|
||||||
_context = CpuContext.CreateExecutionContext();
|
_context = CpuContext.CreateExecutionContext();
|
||||||
|
Translator.IsReadyForTranslation.Set();
|
||||||
|
|
||||||
_cpuContext = new CpuContext(_memory);
|
_cpuContext = new CpuContext(_memory);
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using ARMeilleure.State;
|
using ARMeilleure.State;
|
||||||
|
using ARMeilleure.Translation;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using Ryujinx.Cpu;
|
using Ryujinx.Cpu;
|
||||||
using Ryujinx.Memory;
|
using Ryujinx.Memory;
|
||||||
|
@ -52,6 +53,7 @@ namespace Ryujinx.Tests.Cpu
|
||||||
|
|
||||||
_context = CpuContext.CreateExecutionContext();
|
_context = CpuContext.CreateExecutionContext();
|
||||||
_context.IsAarch32 = true;
|
_context.IsAarch32 = true;
|
||||||
|
Translator.IsReadyForTranslation.Set();
|
||||||
|
|
||||||
_cpuContext = new CpuContext(_memory);
|
_cpuContext = new CpuContext(_memory);
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using ARMeilleure.Translation.PTC;
|
using ARMeilleure.Translation;
|
||||||
|
using ARMeilleure.Translation.PTC;
|
||||||
using Gdk;
|
using Gdk;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
using OpenTK.Graphics;
|
using OpenTK.Graphics;
|
||||||
|
@ -199,6 +200,20 @@ namespace Ryujinx.Ui
|
||||||
Gtk.Application.Invoke(delegate
|
Gtk.Application.Invoke(delegate
|
||||||
{
|
{
|
||||||
parent.Present();
|
parent.Present();
|
||||||
|
|
||||||
|
|
||||||
|
string titleNameSection = string.IsNullOrWhiteSpace(_device.Application.TitleName) ? string.Empty
|
||||||
|
: $" - {_device.Application.TitleName}";
|
||||||
|
|
||||||
|
string titleVersionSection = string.IsNullOrWhiteSpace(_device.Application.DisplayVersion) ? string.Empty
|
||||||
|
: $" v{_device.Application.DisplayVersion}";
|
||||||
|
|
||||||
|
string titleIdSection = string.IsNullOrWhiteSpace(_device.Application.TitleIdText) ? string.Empty
|
||||||
|
: $" ({_device.Application.TitleIdText.ToUpper()})";
|
||||||
|
|
||||||
|
string titleArchSection = _device.Application.TitleIs64Bit ? " (64-bit)" : " (32-bit)";
|
||||||
|
|
||||||
|
parent.Title = $"Ryujinx {Program.Version}{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}";
|
||||||
});
|
});
|
||||||
|
|
||||||
Thread renderLoopThread = new Thread(Render)
|
Thread renderLoopThread = new Thread(Render)
|
||||||
|
@ -314,13 +329,16 @@ namespace Ryujinx.Ui
|
||||||
parent.Present();
|
parent.Present();
|
||||||
GraphicsContext.MakeCurrent(WindowInfo);
|
GraphicsContext.MakeCurrent(WindowInfo);
|
||||||
|
|
||||||
_device.Gpu.Initialize(_glLogLevel);
|
_device.Gpu.Renderer.Initialize(_glLogLevel);
|
||||||
|
|
||||||
// Make sure the first frame is not transparent.
|
// Make sure the first frame is not transparent.
|
||||||
GL.ClearColor(OpenTK.Color.Black);
|
GL.ClearColor(OpenTK.Color.Black);
|
||||||
GL.Clear(ClearBufferMask.ColorBufferBit);
|
GL.Clear(ClearBufferMask.ColorBufferBit);
|
||||||
SwapBuffers();
|
SwapBuffers();
|
||||||
|
|
||||||
|
_device.Gpu.InitializeShaderCache();
|
||||||
|
Translator.IsReadyForTranslation.Set();
|
||||||
|
|
||||||
while (IsActive)
|
while (IsActive)
|
||||||
{
|
{
|
||||||
if (IsStopped)
|
if (IsStopped)
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
using ARMeilleure.Translation;
|
||||||
using ARMeilleure.Translation.PTC;
|
using ARMeilleure.Translation.PTC;
|
||||||
using Gtk;
|
using Gtk;
|
||||||
using LibHac.Common;
|
using LibHac.Common;
|
||||||
|
@ -39,7 +40,6 @@ namespace Ryujinx.Ui
|
||||||
public static GlRenderer GlWidget => _glWidget;
|
public static GlRenderer GlWidget => _glWidget;
|
||||||
|
|
||||||
private static AutoResetEvent _deviceExitStatus = new AutoResetEvent(false);
|
private static AutoResetEvent _deviceExitStatus = new AutoResetEvent(false);
|
||||||
private static AutoResetEvent _widgetInitEvent = new AutoResetEvent(false);
|
|
||||||
|
|
||||||
private static ListStore _tableStore;
|
private static ListStore _tableStore;
|
||||||
|
|
||||||
|
@ -435,30 +435,6 @@ namespace Ryujinx.Ui
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_widgetInitEvent.Reset();
|
|
||||||
|
|
||||||
#if MACOS_BUILD
|
|
||||||
CreateGameWindow(device);
|
|
||||||
#else
|
|
||||||
Thread windowThread = new Thread(() =>
|
|
||||||
{
|
|
||||||
CreateGameWindow(device);
|
|
||||||
})
|
|
||||||
{
|
|
||||||
Name = "GUI.WindowThread"
|
|
||||||
};
|
|
||||||
|
|
||||||
windowThread.Start();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
_widgetInitEvent.WaitOne();
|
|
||||||
|
|
||||||
// Make sure the widget get initialized by forcing an update of GTK
|
|
||||||
while (Application.EventsPending())
|
|
||||||
{
|
|
||||||
Application.RunIteration();
|
|
||||||
}
|
|
||||||
|
|
||||||
Logger.Notice.Print(LogClass.Application, $"Using Firmware Version: {firmwareVersion?.VersionString}");
|
Logger.Notice.Print(LogClass.Application, $"Using Firmware Version: {firmwareVersion?.VersionString}");
|
||||||
|
|
||||||
if (Directory.Exists(path))
|
if (Directory.Exists(path))
|
||||||
|
@ -519,24 +495,26 @@ namespace Ryujinx.Ui
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
string titleNameSection = string.IsNullOrWhiteSpace(device.Application.TitleName) ? string.Empty
|
|
||||||
: $" - {device.Application.TitleName}";
|
|
||||||
|
|
||||||
string titleVersionSection = string.IsNullOrWhiteSpace(device.Application.DisplayVersion) ? string.Empty
|
|
||||||
: $" v{device.Application.DisplayVersion}";
|
|
||||||
|
|
||||||
string titleIdSection = string.IsNullOrWhiteSpace(device.Application.TitleIdText) ? string.Empty
|
|
||||||
: $" ({device.Application.TitleIdText.ToUpper()})";
|
|
||||||
|
|
||||||
string titleArchSection = device.Application.TitleIs64Bit ? " (64-bit)" : " (32-bit)";
|
|
||||||
|
|
||||||
Title = $"Ryujinx {Program.Version}{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}";
|
|
||||||
|
|
||||||
_emulationContext = device;
|
_emulationContext = device;
|
||||||
_gamePath = path;
|
_gamePath = path;
|
||||||
|
|
||||||
_deviceExitStatus.Reset();
|
_deviceExitStatus.Reset();
|
||||||
|
|
||||||
|
Translator.IsReadyForTranslation.Reset();
|
||||||
|
#if MACOS_BUILD
|
||||||
|
CreateGameWindow(device);
|
||||||
|
#else
|
||||||
|
Thread windowThread = new Thread(() =>
|
||||||
|
{
|
||||||
|
CreateGameWindow(device);
|
||||||
|
})
|
||||||
|
{
|
||||||
|
Name = "GUI.WindowThread"
|
||||||
|
};
|
||||||
|
|
||||||
|
windowThread.Start();
|
||||||
|
#endif
|
||||||
|
|
||||||
_gameLoaded = true;
|
_gameLoaded = true;
|
||||||
_stopEmulation.Sensitive = true;
|
_stopEmulation.Sensitive = true;
|
||||||
|
|
||||||
|
@ -559,7 +537,7 @@ namespace Ryujinx.Ui
|
||||||
_windowsMultimediaTimerResolution = new WindowsMultimediaTimerResolution(1);
|
_windowsMultimediaTimerResolution = new WindowsMultimediaTimerResolution(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
_glWidget = new GlRenderer(device, ConfigurationState.Instance.Logger.GraphicsDebugLevel);
|
_glWidget = new GlRenderer(_emulationContext, ConfigurationState.Instance.Logger.GraphicsDebugLevel);
|
||||||
|
|
||||||
Application.Invoke(delegate
|
Application.Invoke(delegate
|
||||||
{
|
{
|
||||||
|
@ -576,8 +554,6 @@ namespace Ryujinx.Ui
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
_widgetInitEvent.Set();
|
|
||||||
|
|
||||||
_glWidget.WaitEvent.WaitOne();
|
_glWidget.WaitEvent.WaitOne();
|
||||||
|
|
||||||
_glWidget.Start();
|
_glWidget.Start();
|
||||||
|
|
Loading…
Reference in a new issue