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:
emmauss 2020-02-12 00:56:19 +00:00 committed by GitHub
parent c464e1ec52
commit 3aa3c4261a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 744 additions and 469 deletions

View file

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