Add inbuilt Opengl renderer to window (#922)
* add gl rendering widget * embed renderer into main window * add input * fix mouse input * fix mouse coords * refresh game list after closing game, remove profiler method * rebase, hide game list progress bar while game is running * Some bug fixes Changelog: - Reapply some changes that got lost while rebasing from #904 - Make sure to guarantee exclusivity on the GL context (fixing multiple possible race conditions on Windows) - Avoid making GLRenderer disposed multiple time * add fullscreen, enable input on focus, disable aplha * addressed comments * Disable transparency in the window * fix fullscreen state, fix focus, addressed comments * nit * addressed nit Co-authored-by: Thog <thog@protonmail.com>
This commit is contained in:
parent
c464e1ec52
commit
3aa3c4261a
11 changed files with 744 additions and 469 deletions
|
@ -8,7 +8,6 @@ using Ryujinx.Graphics.GAL;
|
|||
using Ryujinx.Graphics.OpenGL;
|
||||
using Ryujinx.HLE.FileSystem;
|
||||
using Ryujinx.HLE.FileSystem.Content;
|
||||
using Ryujinx.HLE.FileSystem;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
|
@ -30,7 +29,7 @@ namespace Ryujinx.Ui
|
|||
|
||||
private static HLE.Switch _emulationContext;
|
||||
|
||||
private static GlScreen _screen;
|
||||
private static GLRenderer _gLWidget;
|
||||
|
||||
private static AutoResetEvent _screenExitStatus = new AutoResetEvent(false);
|
||||
|
||||
|
@ -43,32 +42,38 @@ namespace Ryujinx.Ui
|
|||
|
||||
private static TreeView _treeView;
|
||||
|
||||
private static Debugger.Debugger _debugger;
|
||||
private static Ryujinx.Debugger.Debugger _debugger;
|
||||
|
||||
#pragma warning disable CS0649
|
||||
#pragma warning disable IDE0044
|
||||
[GUI] Window _mainWin;
|
||||
[GUI] CheckMenuItem _fullScreen;
|
||||
[GUI] MenuItem _stopEmulation;
|
||||
[GUI] CheckMenuItem _favToggle;
|
||||
[GUI] MenuItem _firmwareInstallFile;
|
||||
[GUI] MenuItem _firmwareInstallDirectory;
|
||||
[GUI] CheckMenuItem _iconToggle;
|
||||
[GUI] CheckMenuItem _appToggle;
|
||||
[GUI] CheckMenuItem _developerToggle;
|
||||
[GUI] CheckMenuItem _versionToggle;
|
||||
[GUI] CheckMenuItem _timePlayedToggle;
|
||||
[GUI] CheckMenuItem _lastPlayedToggle;
|
||||
[GUI] CheckMenuItem _fileExtToggle;
|
||||
[GUI] CheckMenuItem _fileSizeToggle;
|
||||
[GUI] CheckMenuItem _pathToggle;
|
||||
[GUI] TreeView _gameTable;
|
||||
[GUI] TreeSelection _gameTableSelection;
|
||||
[GUI] Label _progressLabel;
|
||||
[GUI] Label _firmwareVersionLabel;
|
||||
[GUI] LevelBar _progressBar;
|
||||
[GUI] MenuItem _openDebugger;
|
||||
[GUI] MenuItem _toolsMenu;
|
||||
|
||||
[GUI] Window _mainWin;
|
||||
[GUI] MenuBar _menuBar;
|
||||
[GUI] Box _footerBox;
|
||||
[GUI] MenuItem _fullScreen;
|
||||
[GUI] MenuItem _stopEmulation;
|
||||
[GUI] CheckMenuItem _favToggle;
|
||||
[GUI] MenuItem _firmwareInstallFile;
|
||||
[GUI] MenuItem _firmwareInstallDirectory;
|
||||
[GUI] MenuItem _openDebugger;
|
||||
[GUI] CheckMenuItem _iconToggle;
|
||||
[GUI] CheckMenuItem _appToggle;
|
||||
[GUI] CheckMenuItem _developerToggle;
|
||||
[GUI] CheckMenuItem _versionToggle;
|
||||
[GUI] CheckMenuItem _timePlayedToggle;
|
||||
[GUI] CheckMenuItem _lastPlayedToggle;
|
||||
[GUI] CheckMenuItem _fileExtToggle;
|
||||
[GUI] CheckMenuItem _fileSizeToggle;
|
||||
[GUI] CheckMenuItem _pathToggle;
|
||||
[GUI] TreeView _gameTable;
|
||||
[GUI] ScrolledWindow _gameTableWindow;
|
||||
[GUI] TreeSelection _gameTableSelection;
|
||||
[GUI] Label _progressLabel;
|
||||
[GUI] Label _firmwareVersionLabel;
|
||||
[GUI] LevelBar _progressBar;
|
||||
[GUI] Box _viewBox;
|
||||
[GUI] Box _listStatusBox;
|
||||
|
||||
#pragma warning restore CS0649
|
||||
#pragma warning restore IDE0044
|
||||
|
||||
|
@ -130,7 +135,7 @@ namespace Ryujinx.Ui
|
|||
_debugger = new Debugger.Debugger();
|
||||
_openDebugger.Activated += _openDebugger_Opened;
|
||||
#else
|
||||
_openDebugger.Visible = false;
|
||||
_openDebugger.Hide();
|
||||
#endif
|
||||
|
||||
_gameTable.Model = _tableStore = new ListStore(
|
||||
|
@ -154,6 +159,8 @@ namespace Ryujinx.Ui
|
|||
UpdateGameTable();
|
||||
|
||||
Task.Run(RefreshFirmwareLabel);
|
||||
|
||||
_fullScreen.Activated += FullScreen_Toggled;
|
||||
}
|
||||
|
||||
#if USE_DEBUGGING
|
||||
|
@ -384,27 +391,85 @@ namespace Ryujinx.Ui
|
|||
{
|
||||
device.Hid.InitializePrimaryController(ConfigurationState.Instance.Hid.ControllerType);
|
||||
|
||||
using (_screen = new GlScreen(device))
|
||||
_gLWidget?.Exit();
|
||||
_gLWidget?.Dispose();
|
||||
_gLWidget = new GLRenderer(_emulationContext);
|
||||
|
||||
Application.Invoke(delegate
|
||||
{
|
||||
_screen.MainLoop();
|
||||
}
|
||||
_viewBox.Remove(_gameTableWindow);
|
||||
_gLWidget.Expand = true;
|
||||
_viewBox.Child = _gLWidget;
|
||||
|
||||
_gLWidget.ShowAll();
|
||||
_listStatusBox.Hide();
|
||||
});
|
||||
|
||||
_gLWidget.WaitEvent.WaitOne();
|
||||
|
||||
_gLWidget.Start();
|
||||
|
||||
Application.Invoke(delegate
|
||||
{
|
||||
_viewBox.Remove(_gLWidget);
|
||||
_gLWidget.Exit();
|
||||
|
||||
if(_gLWidget.Window != this.Window && _gLWidget.Window != null)
|
||||
{
|
||||
_gLWidget.Window.Dispose();
|
||||
}
|
||||
|
||||
_viewBox.Add(_gameTableWindow);
|
||||
|
||||
_gameTableWindow.Expand = true;
|
||||
|
||||
this.Window.Title = "Ryujinx";
|
||||
|
||||
_listStatusBox.ShowAll();
|
||||
|
||||
UpdateColumns();
|
||||
UpdateGameTable();
|
||||
|
||||
Task.Run(RefreshFirmwareLabel);
|
||||
});
|
||||
|
||||
device.Dispose();
|
||||
|
||||
_emulationContext = null;
|
||||
_screen = null;
|
||||
_gameLoaded = false;
|
||||
_gLWidget = null;
|
||||
|
||||
DiscordIntegrationModule.SwitchToMainMenu();
|
||||
|
||||
_screenExitStatus.Set();
|
||||
|
||||
Application.Invoke(delegate
|
||||
{
|
||||
_stopEmulation.Sensitive = false;
|
||||
_firmwareInstallFile.Sensitive = true;
|
||||
_firmwareInstallDirectory.Sensitive = true;
|
||||
});
|
||||
|
||||
_screenExitStatus.Set();
|
||||
}
|
||||
|
||||
public void ToggleExtraWidgets(bool show)
|
||||
{
|
||||
if (_gLWidget != null)
|
||||
{
|
||||
if (show)
|
||||
{
|
||||
_menuBar.ShowAll();
|
||||
_footerBox.ShowAll();
|
||||
}
|
||||
else
|
||||
{
|
||||
_menuBar.Hide();
|
||||
_footerBox.Hide();
|
||||
}
|
||||
}
|
||||
|
||||
bool fullScreenToggled = this.Window.State.HasFlag(Gdk.WindowState.Fullscreen);
|
||||
|
||||
_fullScreen.Label = !fullScreenToggled ? "Exit Fullscreen" : "Enter Fullscreen";
|
||||
}
|
||||
|
||||
private static void UpdateGameMetadata(string titleId)
|
||||
|
@ -439,9 +504,9 @@ namespace Ryujinx.Ui
|
|||
{
|
||||
UpdateGameMetadata(device.System.TitleIdText);
|
||||
|
||||
if (_screen != null)
|
||||
if (_gLWidget != null)
|
||||
{
|
||||
_screen.Exit();
|
||||
_gLWidget.Exit();
|
||||
_screenExitStatus.WaitOne();
|
||||
}
|
||||
}
|
||||
|
@ -605,7 +670,7 @@ namespace Ryujinx.Ui
|
|||
|
||||
private void StopEmulation_Pressed(object sender, EventArgs args)
|
||||
{
|
||||
_screen?.Exit();
|
||||
_gLWidget?.Exit();
|
||||
}
|
||||
|
||||
private void Installer_File_Pressed(object o, EventArgs args)
|
||||
|
@ -803,13 +868,23 @@ namespace Ryujinx.Ui
|
|||
|
||||
private void FullScreen_Toggled(object o, EventArgs args)
|
||||
{
|
||||
if (_fullScreen.Active)
|
||||
bool fullScreenToggled = this.Window.State.HasFlag(Gdk.WindowState.Fullscreen);
|
||||
|
||||
if (!fullScreenToggled)
|
||||
{
|
||||
Fullscreen();
|
||||
|
||||
_fullScreen.Label = "Exit Fullscreen";
|
||||
|
||||
ToggleExtraWidgets(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
Unfullscreen();
|
||||
|
||||
_fullScreen.Label = "Enter Fullscreen";
|
||||
|
||||
ToggleExtraWidgets(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue