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:
Mary 2020-11-17 22:40:19 +01:00 committed by GitHub
parent cc60ba9d22
commit 863edae328
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 48 additions and 60 deletions

View file

@ -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);

View file

@ -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();
} }
} }
} }

View file

@ -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);
} }

View file

@ -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);

View file

@ -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);

View file

@ -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)

View file

@ -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();