Compare commits
10 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
e37735ed26 | ||
|
74a18b7c18 | ||
|
74fe814329 | ||
|
d1a093e5ca | ||
|
dfb14a5607 | ||
|
904a5ffcb4 | ||
|
946633276b | ||
|
baf94e0e3e | ||
|
cf6201a4a6 | ||
|
18909195d1 |
72
.github/workflows/flatpak.yml
vendored
72
.github/workflows/flatpak.yml
vendored
@@ -51,38 +51,76 @@ jobs:
|
|||||||
- name: Restore Nuget packages
|
- name: Restore Nuget packages
|
||||||
# With .NET 8.0.100, Microsoft.NET.ILLink.Tasks isn't restored by default and only seems to appears when publishing.
|
# With .NET 8.0.100, Microsoft.NET.ILLink.Tasks isn't restored by default and only seems to appears when publishing.
|
||||||
# So we just publish to grab the dependencies
|
# So we just publish to grab the dependencies
|
||||||
run: dotnet publish -c Release -r linux-x64 Ryujinx/${{ env.RYUJINX_PROJECT_FILE }} --self-contained
|
run: |
|
||||||
|
dotnet publish -c Release -r linux-x64 Ryujinx/${{ env.RYUJINX_PROJECT_FILE }} --self-contained
|
||||||
|
dotnet publish -c Release -r linux-arm64 Ryujinx/${{ env.RYUJINX_PROJECT_FILE }} --self-contained
|
||||||
|
|
||||||
- name: Generate nuget_sources.json
|
- name: Generate nuget_sources.json
|
||||||
shell: python
|
shell: python
|
||||||
run: |
|
run: |
|
||||||
|
import hashlib
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import base64
|
import base64
|
||||||
import binascii
|
import binascii
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
import urllib.request
|
||||||
|
|
||||||
sources = []
|
sources = []
|
||||||
|
|
||||||
for path in Path(os.environ['NUGET_PACKAGES']).glob('**/*.nupkg.sha512'):
|
|
||||||
name = path.parent.parent.name
|
|
||||||
version = path.parent.name
|
|
||||||
filename = '{}.{}.nupkg'.format(name, version)
|
|
||||||
url = 'https://api.nuget.org/v3-flatcontainer/{}/{}/{}'.format(name, version, filename)
|
|
||||||
|
|
||||||
with path.open() as fp:
|
def create_source_from_external(name, version):
|
||||||
sha512 = binascii.hexlify(base64.b64decode(fp.read())).decode('ascii')
|
full_dir_path = Path(os.environ["NUGET_PACKAGES"]).joinpath(name).joinpath(version)
|
||||||
|
os.makedirs(full_dir_path, exist_ok=True)
|
||||||
|
|
||||||
sources.append({
|
filename = "{}.{}.nupkg".format(name, version)
|
||||||
'type': 'file',
|
url = "https://api.nuget.org/v3-flatcontainer/{}/{}/{}".format(
|
||||||
'url': url,
|
name, version, filename
|
||||||
'sha512': sha512,
|
)
|
||||||
'dest': os.environ['NUGET_SOURCES_DESTDIR'],
|
|
||||||
'dest-filename': filename,
|
|
||||||
})
|
|
||||||
|
|
||||||
with open('flathub/nuget_sources.json', 'w') as fp:
|
print(f"Processing {url}...")
|
||||||
json.dump(sources, fp, indent=4)
|
response = urllib.request.urlopen(url)
|
||||||
|
sha512 = hashlib.sha512(response.read()).hexdigest()
|
||||||
|
|
||||||
|
return {
|
||||||
|
"type": "file",
|
||||||
|
"url": url,
|
||||||
|
"sha512": sha512,
|
||||||
|
"dest": os.environ["NUGET_SOURCES_DESTDIR"],
|
||||||
|
"dest-filename": filename,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
has_added_x64_apphost = False
|
||||||
|
|
||||||
|
for path in Path(os.environ["NUGET_PACKAGES"]).glob("**/*.nupkg.sha512"):
|
||||||
|
name = path.parent.parent.name
|
||||||
|
version = path.parent.name
|
||||||
|
filename = "{}.{}.nupkg".format(name, version)
|
||||||
|
url = "https://api.nuget.org/v3-flatcontainer/{}/{}/{}".format(
|
||||||
|
name, version, filename
|
||||||
|
)
|
||||||
|
|
||||||
|
with path.open() as fp:
|
||||||
|
sha512 = binascii.hexlify(base64.b64decode(fp.read())).decode("ascii")
|
||||||
|
|
||||||
|
sources.append(
|
||||||
|
{
|
||||||
|
"type": "file",
|
||||||
|
"url": url,
|
||||||
|
"sha512": sha512,
|
||||||
|
"dest": os.environ["NUGET_SOURCES_DESTDIR"],
|
||||||
|
"dest-filename": filename,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# .NET will not add current installed application host to the list, force inject it here.
|
||||||
|
if not has_added_x64_apphost and name.startswith('microsoft.netcore.app.host'):
|
||||||
|
sources.append(create_source_from_external("microsoft.netcore.app.host.linux-x64", version))
|
||||||
|
has_added_x64_apphost = True
|
||||||
|
|
||||||
|
with open("flathub/nuget_sources.json", "w") as fp:
|
||||||
|
json.dump(sources, fp, indent=4)
|
||||||
|
|
||||||
- name: Update flatpak metadata
|
- name: Update flatpak metadata
|
||||||
id: metadata
|
id: metadata
|
||||||
|
@@ -73,6 +73,10 @@
|
|||||||
"GameListContextMenuCreateShortcut": "Create Application Shortcut",
|
"GameListContextMenuCreateShortcut": "Create Application Shortcut",
|
||||||
"GameListContextMenuCreateShortcutToolTip": "Create a Desktop Shortcut that launches the selected Application",
|
"GameListContextMenuCreateShortcutToolTip": "Create a Desktop Shortcut that launches the selected Application",
|
||||||
"GameListContextMenuCreateShortcutToolTipMacOS": "Create a shortcut in macOS's Applications folder that launches the selected Application",
|
"GameListContextMenuCreateShortcutToolTipMacOS": "Create a shortcut in macOS's Applications folder that launches the selected Application",
|
||||||
|
"GameListContextMenuOpenModsDirectory": "Open Mods Directory",
|
||||||
|
"GameListContextMenuOpenModsDirectoryToolTip": "Opens the directory which contains Application's Mods",
|
||||||
|
"GameListContextMenuOpenSdModsDirectory": "Open Atmosphere Mods Directory",
|
||||||
|
"GameListContextMenuOpenSdModsDirectoryToolTip": "Opens the alternative SD card Atmosphere directory which contains Application's Mods. Useful for mods that are packaged for real hardware.",
|
||||||
"StatusBarGamesLoaded": "{0}/{1} Games Loaded",
|
"StatusBarGamesLoaded": "{0}/{1} Games Loaded",
|
||||||
"StatusBarSystemVersion": "System Version: {0}",
|
"StatusBarSystemVersion": "System Version: {0}",
|
||||||
"LinuxVmMaxMapCountDialogTitle": "Low limit for memory mappings detected",
|
"LinuxVmMaxMapCountDialogTitle": "Low limit for memory mappings detected",
|
||||||
@@ -329,8 +333,6 @@
|
|||||||
"DialogUpdaterAddingFilesMessage": "Adding New Update...",
|
"DialogUpdaterAddingFilesMessage": "Adding New Update...",
|
||||||
"DialogUpdaterCompleteMessage": "Update Complete!",
|
"DialogUpdaterCompleteMessage": "Update Complete!",
|
||||||
"DialogUpdaterRestartMessage": "Do you want to restart Ryujinx now?",
|
"DialogUpdaterRestartMessage": "Do you want to restart Ryujinx now?",
|
||||||
"DialogUpdaterArchNotSupportedMessage": "You are not running a supported system architecture!",
|
|
||||||
"DialogUpdaterArchNotSupportedSubMessage": "(Only x64 systems are supported!)",
|
|
||||||
"DialogUpdaterNoInternetMessage": "You are not connected to the Internet!",
|
"DialogUpdaterNoInternetMessage": "You are not connected to the Internet!",
|
||||||
"DialogUpdaterNoInternetSubMessage": "Please verify that you have a working Internet connection!",
|
"DialogUpdaterNoInternetSubMessage": "Please verify that you have a working Internet connection!",
|
||||||
"DialogUpdaterDirtyBuildMessage": "You Cannot update a Dirty build of Ryujinx!",
|
"DialogUpdaterDirtyBuildMessage": "You Cannot update a Dirty build of Ryujinx!",
|
||||||
|
@@ -68,7 +68,8 @@ namespace Ryujinx.Modules
|
|||||||
}
|
}
|
||||||
else if (OperatingSystem.IsLinux())
|
else if (OperatingSystem.IsLinux())
|
||||||
{
|
{
|
||||||
_platformExt = "linux_x64.tar.gz";
|
var arch = RuntimeInformation.OSArchitecture == Architecture.Arm64 ? "arm64" : "x64";
|
||||||
|
_platformExt = $"linux_{arch}.tar.gz";
|
||||||
}
|
}
|
||||||
|
|
||||||
Version newVersion;
|
Version newVersion;
|
||||||
@@ -637,20 +638,6 @@ namespace Ryujinx.Modules
|
|||||||
public static bool CanUpdate(bool showWarnings)
|
public static bool CanUpdate(bool showWarnings)
|
||||||
{
|
{
|
||||||
#if !DISABLE_UPDATER
|
#if !DISABLE_UPDATER
|
||||||
if (RuntimeInformation.OSArchitecture != Architecture.X64 && !OperatingSystem.IsMacOS())
|
|
||||||
{
|
|
||||||
if (showWarnings)
|
|
||||||
{
|
|
||||||
Dispatcher.UIThread.InvokeAsync(() =>
|
|
||||||
ContentDialogHelper.CreateWarningDialog(
|
|
||||||
LocaleManager.Instance[LocaleKeys.DialogUpdaterArchNotSupportedMessage],
|
|
||||||
LocaleManager.Instance[LocaleKeys.DialogUpdaterArchNotSupportedSubMessage])
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!NetworkInterface.GetIsNetworkAvailable())
|
if (!NetworkInterface.GetIsNetworkAvailable())
|
||||||
{
|
{
|
||||||
if (showWarnings)
|
if (showWarnings)
|
||||||
|
@@ -51,6 +51,15 @@
|
|||||||
Header="{locale:Locale GameListContextMenuManageMod}"
|
Header="{locale:Locale GameListContextMenuManageMod}"
|
||||||
ToolTip.Tip="{locale:Locale GameListContextMenuManageModToolTip}" />
|
ToolTip.Tip="{locale:Locale GameListContextMenuManageModToolTip}" />
|
||||||
<Separator />
|
<Separator />
|
||||||
|
<MenuItem
|
||||||
|
Click="OpenModsDirectory_Click"
|
||||||
|
Header="{locale:Locale GameListContextMenuOpenModsDirectory}"
|
||||||
|
ToolTip.Tip="{locale:Locale GameListContextMenuOpenModsDirectoryToolTip}" />
|
||||||
|
<MenuItem
|
||||||
|
Click="OpenSdModsDirectory_Click"
|
||||||
|
Header="{locale:Locale GameListContextMenuOpenSdModsDirectory}"
|
||||||
|
ToolTip.Tip="{locale:Locale GameListContextMenuOpenSdModsDirectoryToolTip}" />
|
||||||
|
<Separator />
|
||||||
<MenuItem Header="{locale:Locale GameListContextMenuCacheManagement}">
|
<MenuItem Header="{locale:Locale GameListContextMenuCacheManagement}">
|
||||||
<MenuItem
|
<MenuItem
|
||||||
Click="PurgePtcCache_Click"
|
Click="PurgePtcCache_Click"
|
||||||
|
@@ -126,6 +126,32 @@ namespace Ryujinx.Ava.UI.Controls
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void OpenModsDirectory_Click(object sender, RoutedEventArgs args)
|
||||||
|
{
|
||||||
|
var viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel;
|
||||||
|
|
||||||
|
if (viewModel?.SelectedApplication != null)
|
||||||
|
{
|
||||||
|
string modsBasePath = ModLoader.GetModsBasePath();
|
||||||
|
string titleModsPath = ModLoader.GetApplicationDir(modsBasePath, viewModel.SelectedApplication.TitleId);
|
||||||
|
|
||||||
|
OpenHelper.OpenFolder(titleModsPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OpenSdModsDirectory_Click(object sender, RoutedEventArgs args)
|
||||||
|
{
|
||||||
|
var viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel;
|
||||||
|
|
||||||
|
if (viewModel?.SelectedApplication != null)
|
||||||
|
{
|
||||||
|
string sdModsBasePath = ModLoader.GetSdModsBasePath();
|
||||||
|
string titleModsPath = ModLoader.GetApplicationDir(sdModsBasePath, viewModel.SelectedApplication.TitleId);
|
||||||
|
|
||||||
|
OpenHelper.OpenFolder(titleModsPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async void OpenModManager_Click(object sender, RoutedEventArgs args)
|
public async void OpenModManager_Click(object sender, RoutedEventArgs args)
|
||||||
{
|
{
|
||||||
var viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel;
|
var viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel;
|
||||||
|
@@ -2,6 +2,7 @@ using Ryujinx.Common.Logging;
|
|||||||
using Ryujinx.Common.Utilities;
|
using Ryujinx.Common.Utilities;
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Runtime.Versioning;
|
||||||
|
|
||||||
namespace Ryujinx.Common.Configuration
|
namespace Ryujinx.Common.Configuration
|
||||||
{
|
{
|
||||||
@@ -95,18 +96,9 @@ namespace Ryujinx.Common.Configuration
|
|||||||
|
|
||||||
BaseDirPath = Path.GetFullPath(BaseDirPath); // convert relative paths
|
BaseDirPath = Path.GetFullPath(BaseDirPath); // convert relative paths
|
||||||
|
|
||||||
// NOTE: Moves the Ryujinx folder in `~/.config` to `~/Library/Application Support` if one is found
|
if (IsPathSymlink(BaseDirPath))
|
||||||
// and a Ryujinx folder does not already exist in Application Support.
|
|
||||||
// Also creates a symlink from `~/.config/Ryujinx` to `~/Library/Application Support/Ryujinx` to preserve backwards compatibility.
|
|
||||||
// This should be removed in the future.
|
|
||||||
if (OperatingSystem.IsMacOS() && Mode == LaunchMode.UserProfile)
|
|
||||||
{
|
{
|
||||||
string oldConfigPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), DefaultBaseDir);
|
Logger.Warning?.Print(LogClass.Application, $"Application data directory is a symlink. This may be unintended.");
|
||||||
if (Path.Exists(oldConfigPath) && !IsPathSymlink(oldConfigPath) && !Path.Exists(BaseDirPath))
|
|
||||||
{
|
|
||||||
FileSystemUtils.MoveDirectory(oldConfigPath, BaseDirPath);
|
|
||||||
Directory.CreateSymbolicLink(oldConfigPath, BaseDirPath);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SetupBasePaths();
|
SetupBasePaths();
|
||||||
@@ -241,8 +233,91 @@ namespace Ryujinx.Common.Configuration
|
|||||||
// Should be removed, when the existence of the old directory isn't checked anymore.
|
// Should be removed, when the existence of the old directory isn't checked anymore.
|
||||||
private static bool IsPathSymlink(string path)
|
private static bool IsPathSymlink(string path)
|
||||||
{
|
{
|
||||||
FileAttributes attributes = File.GetAttributes(path);
|
try
|
||||||
return (attributes & FileAttributes.ReparsePoint) == FileAttributes.ReparsePoint;
|
{
|
||||||
|
FileAttributes attributes = File.GetAttributes(path);
|
||||||
|
return (attributes & FileAttributes.ReparsePoint) == FileAttributes.ReparsePoint;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[SupportedOSPlatform("macos")]
|
||||||
|
public static void FixMacOSConfigurationFolders()
|
||||||
|
{
|
||||||
|
string oldConfigPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
|
||||||
|
".config", DefaultBaseDir);
|
||||||
|
if (Path.Exists(oldConfigPath) && !IsPathSymlink(oldConfigPath) && !Path.Exists(BaseDirPath))
|
||||||
|
{
|
||||||
|
FileSystemUtils.MoveDirectory(oldConfigPath, BaseDirPath);
|
||||||
|
Directory.CreateSymbolicLink(oldConfigPath, BaseDirPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
string correctApplicationDataDirectoryPath =
|
||||||
|
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), DefaultBaseDir);
|
||||||
|
if (IsPathSymlink(correctApplicationDataDirectoryPath))
|
||||||
|
{
|
||||||
|
//copy the files somewhere temporarily
|
||||||
|
string tempPath = Path.Combine(Path.GetTempPath(), DefaultBaseDir);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
FileSystemUtils.CopyDirectory(correctApplicationDataDirectoryPath, tempPath, true);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
Logger.Error?.Print(LogClass.Application,
|
||||||
|
$"Critical error copying Ryujinx application data into the temp folder. {exception}");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
FileSystemInfo resolvedDirectoryInfo =
|
||||||
|
Directory.ResolveLinkTarget(correctApplicationDataDirectoryPath, true);
|
||||||
|
string resolvedPath = resolvedDirectoryInfo.FullName;
|
||||||
|
Logger.Error?.Print(LogClass.Application, $"Please manually move your Ryujinx data from {resolvedPath} to {correctApplicationDataDirectoryPath}, and remove the symlink.");
|
||||||
|
}
|
||||||
|
catch (Exception symlinkException)
|
||||||
|
{
|
||||||
|
Logger.Error?.Print(LogClass.Application, $"Unable to resolve the symlink for Ryujinx application data: {symlinkException}. Follow the symlink at {correctApplicationDataDirectoryPath} and move your data back to the Application Support folder.");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//delete the symlink
|
||||||
|
try
|
||||||
|
{
|
||||||
|
//This will fail if this is an actual directory, so there is no way we can actually delete user data here.
|
||||||
|
File.Delete(correctApplicationDataDirectoryPath);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
Logger.Error?.Print(LogClass.Application,
|
||||||
|
$"Critical error deleting the Ryujinx application data folder symlink at {correctApplicationDataDirectoryPath}. {exception}");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
FileSystemInfo resolvedDirectoryInfo =
|
||||||
|
Directory.ResolveLinkTarget(correctApplicationDataDirectoryPath, true);
|
||||||
|
string resolvedPath = resolvedDirectoryInfo.FullName;
|
||||||
|
Logger.Error?.Print(LogClass.Application, $"Please manually move your Ryujinx data from {resolvedPath} to {correctApplicationDataDirectoryPath}, and remove the symlink.");
|
||||||
|
}
|
||||||
|
catch (Exception symlinkException)
|
||||||
|
{
|
||||||
|
Logger.Error?.Print(LogClass.Application, $"Unable to resolve the symlink for Ryujinx application data: {symlinkException}. Follow the symlink at {correctApplicationDataDirectoryPath} and move your data back to the Application Support folder.");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//put the files back
|
||||||
|
try
|
||||||
|
{
|
||||||
|
FileSystemUtils.CopyDirectory(tempPath, correctApplicationDataDirectoryPath, true);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
Logger.Error?.Print(LogClass.Application,
|
||||||
|
$"Critical error copying Ryujinx application data into the correct location. {exception}. Please manually move your application data from {tempPath} to {correctApplicationDataDirectoryPath}.");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string GetModsPath() => CustomModsPath ?? Directory.CreateDirectory(Path.Combine(BaseDirPath, DefaultModsDir)).FullName;
|
public static string GetModsPath() => CustomModsPath ?? Directory.CreateDirectory(Path.Combine(BaseDirPath, DefaultModsDir)).FullName;
|
||||||
|
@@ -148,6 +148,7 @@ namespace Ryujinx.Graphics.GAL
|
|||||||
B8G8R8A8Unorm,
|
B8G8R8A8Unorm,
|
||||||
B8G8R8A8Srgb,
|
B8G8R8A8Srgb,
|
||||||
B10G10R10A2Unorm,
|
B10G10R10A2Unorm,
|
||||||
|
X8UintD24Unorm,
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class FormatExtensions
|
public static class FormatExtensions
|
||||||
@@ -269,6 +270,7 @@ namespace Ryujinx.Graphics.GAL
|
|||||||
case Format.D16Unorm:
|
case Format.D16Unorm:
|
||||||
return 2;
|
return 2;
|
||||||
case Format.S8UintD24Unorm:
|
case Format.S8UintD24Unorm:
|
||||||
|
case Format.X8UintD24Unorm:
|
||||||
case Format.D32Float:
|
case Format.D32Float:
|
||||||
case Format.D24UnormS8Uint:
|
case Format.D24UnormS8Uint:
|
||||||
return 4;
|
return 4;
|
||||||
@@ -349,6 +351,7 @@ namespace Ryujinx.Graphics.GAL
|
|||||||
case Format.D16Unorm:
|
case Format.D16Unorm:
|
||||||
case Format.D24UnormS8Uint:
|
case Format.D24UnormS8Uint:
|
||||||
case Format.S8UintD24Unorm:
|
case Format.S8UintD24Unorm:
|
||||||
|
case Format.X8UintD24Unorm:
|
||||||
case Format.D32Float:
|
case Format.D32Float:
|
||||||
case Format.D32FloatS8Uint:
|
case Format.D32FloatS8Uint:
|
||||||
return true;
|
return true;
|
||||||
@@ -633,6 +636,7 @@ namespace Ryujinx.Graphics.GAL
|
|||||||
case Format.D16Unorm:
|
case Format.D16Unorm:
|
||||||
case Format.D24UnormS8Uint:
|
case Format.D24UnormS8Uint:
|
||||||
case Format.S8UintD24Unorm:
|
case Format.S8UintD24Unorm:
|
||||||
|
case Format.X8UintD24Unorm:
|
||||||
case Format.D32Float:
|
case Format.D32Float:
|
||||||
case Format.D32FloatS8Uint:
|
case Format.D32FloatS8Uint:
|
||||||
case Format.S8Uint:
|
case Format.S8Uint:
|
||||||
|
@@ -8,13 +8,13 @@ namespace Ryujinx.Graphics.Gpu.Engine.Types
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
enum ZetaFormat
|
enum ZetaFormat
|
||||||
{
|
{
|
||||||
D32Float = 0xa,
|
Zf32 = 0xa,
|
||||||
D16Unorm = 0x13,
|
Z16 = 0x13,
|
||||||
D24UnormS8Uint = 0x14,
|
Z24S8 = 0x14,
|
||||||
D24Unorm = 0x15,
|
X8Z24 = 0x15,
|
||||||
S8UintD24Unorm = 0x16,
|
S8Z24 = 0x16,
|
||||||
S8Uint = 0x17,
|
S8Uint = 0x17,
|
||||||
D32FloatS8Uint = 0x19,
|
Zf32X24S8 = 0x19,
|
||||||
}
|
}
|
||||||
|
|
||||||
static class ZetaFormatConverter
|
static class ZetaFormatConverter
|
||||||
@@ -29,14 +29,14 @@ namespace Ryujinx.Graphics.Gpu.Engine.Types
|
|||||||
return format switch
|
return format switch
|
||||||
{
|
{
|
||||||
#pragma warning disable IDE0055 // Disable formatting
|
#pragma warning disable IDE0055 // Disable formatting
|
||||||
ZetaFormat.D32Float => new FormatInfo(Format.D32Float, 1, 1, 4, 1),
|
ZetaFormat.Zf32 => new FormatInfo(Format.D32Float, 1, 1, 4, 1),
|
||||||
ZetaFormat.D16Unorm => new FormatInfo(Format.D16Unorm, 1, 1, 2, 1),
|
ZetaFormat.Z16 => new FormatInfo(Format.D16Unorm, 1, 1, 2, 1),
|
||||||
ZetaFormat.D24UnormS8Uint => new FormatInfo(Format.D24UnormS8Uint, 1, 1, 4, 2),
|
ZetaFormat.Z24S8 => new FormatInfo(Format.D24UnormS8Uint, 1, 1, 4, 2),
|
||||||
ZetaFormat.D24Unorm => new FormatInfo(Format.D24UnormS8Uint, 1, 1, 4, 1),
|
ZetaFormat.X8Z24 => new FormatInfo(Format.X8UintD24Unorm, 1, 1, 4, 1),
|
||||||
ZetaFormat.S8UintD24Unorm => new FormatInfo(Format.S8UintD24Unorm, 1, 1, 4, 2),
|
ZetaFormat.S8Z24 => new FormatInfo(Format.S8UintD24Unorm, 1, 1, 4, 2),
|
||||||
ZetaFormat.S8Uint => new FormatInfo(Format.S8Uint, 1, 1, 1, 1),
|
ZetaFormat.S8Uint => new FormatInfo(Format.S8Uint, 1, 1, 1, 1),
|
||||||
ZetaFormat.D32FloatS8Uint => new FormatInfo(Format.D32FloatS8Uint, 1, 1, 8, 2),
|
ZetaFormat.Zf32X24S8 => new FormatInfo(Format.D32FloatS8Uint, 1, 1, 8, 2),
|
||||||
_ => FormatInfo.Default,
|
_ => FormatInfo.Default,
|
||||||
#pragma warning restore IDE0055
|
#pragma warning restore IDE0055
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@@ -185,6 +185,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
G24R8RUintGUnormBUnormAUnorm = G24R8 | RUint | GUnorm | BUnorm | AUnorm, // 0x24a0e
|
G24R8RUintGUnormBUnormAUnorm = G24R8 | RUint | GUnorm | BUnorm | AUnorm, // 0x24a0e
|
||||||
Z24S8RUintGUnormBUnormAUnorm = Z24S8 | RUint | GUnorm | BUnorm | AUnorm, // 0x24a29
|
Z24S8RUintGUnormBUnormAUnorm = Z24S8 | RUint | GUnorm | BUnorm | AUnorm, // 0x24a29
|
||||||
Z24S8RUintGUnormBUintAUint = Z24S8 | RUint | GUnorm | BUint | AUint, // 0x48a29
|
Z24S8RUintGUnormBUintAUint = Z24S8 | RUint | GUnorm | BUint | AUint, // 0x48a29
|
||||||
|
X8Z24RUnormGUintBUintAUint = X8Z24 | RUnorm | GUint | BUint | AUint, // 0x4912a
|
||||||
S8Z24RUnormGUintBUintAUint = S8Z24 | RUnorm | GUint | BUint | AUint, // 0x4912b
|
S8Z24RUnormGUintBUintAUint = S8Z24 | RUnorm | GUint | BUint | AUint, // 0x4912b
|
||||||
R32B24G8RFloatGUintBUnormAUnorm = R32B24G8 | RFloat | GUint | BUnorm | AUnorm, // 0x25385
|
R32B24G8RFloatGUintBUnormAUnorm = R32B24G8 | RFloat | GUint | BUnorm | AUnorm, // 0x25385
|
||||||
Zf32X24S8RFloatGUintBUnormAUnorm = Zf32X24S8 | RFloat | GUint | BUnorm | AUnorm, // 0x253b0
|
Zf32X24S8RFloatGUintBUnormAUnorm = Zf32X24S8 | RFloat | GUint | BUnorm | AUnorm, // 0x253b0
|
||||||
@@ -410,6 +411,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
{ TextureFormat.G24R8RUintGUnormBUnormAUnorm, new FormatInfo(Format.D24UnormS8Uint, 1, 1, 4, 2) },
|
{ TextureFormat.G24R8RUintGUnormBUnormAUnorm, new FormatInfo(Format.D24UnormS8Uint, 1, 1, 4, 2) },
|
||||||
{ TextureFormat.Z24S8RUintGUnormBUnormAUnorm, new FormatInfo(Format.D24UnormS8Uint, 1, 1, 4, 2) },
|
{ TextureFormat.Z24S8RUintGUnormBUnormAUnorm, new FormatInfo(Format.D24UnormS8Uint, 1, 1, 4, 2) },
|
||||||
{ TextureFormat.Z24S8RUintGUnormBUintAUint, new FormatInfo(Format.D24UnormS8Uint, 1, 1, 4, 2) },
|
{ TextureFormat.Z24S8RUintGUnormBUintAUint, new FormatInfo(Format.D24UnormS8Uint, 1, 1, 4, 2) },
|
||||||
|
{ TextureFormat.X8Z24RUnormGUintBUintAUint, new FormatInfo(Format.X8UintD24Unorm, 1, 1, 4, 2) },
|
||||||
{ TextureFormat.S8Z24RUnormGUintBUintAUint, new FormatInfo(Format.S8UintD24Unorm, 1, 1, 4, 2) },
|
{ TextureFormat.S8Z24RUnormGUintBUintAUint, new FormatInfo(Format.S8UintD24Unorm, 1, 1, 4, 2) },
|
||||||
{ TextureFormat.R32B24G8RFloatGUintBUnormAUnorm, new FormatInfo(Format.D32FloatS8Uint, 1, 1, 8, 2) },
|
{ TextureFormat.R32B24G8RFloatGUintBUnormAUnorm, new FormatInfo(Format.D32FloatS8Uint, 1, 1, 8, 2) },
|
||||||
{ TextureFormat.Zf32X24S8RFloatGUintBUnormAUnorm, new FormatInfo(Format.D32FloatS8Uint, 1, 1, 8, 2) },
|
{ TextureFormat.Zf32X24S8RFloatGUintBUnormAUnorm, new FormatInfo(Format.D32FloatS8Uint, 1, 1, 8, 2) },
|
||||||
|
@@ -242,7 +242,8 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
return TextureMatchQuality.FormatAlias;
|
return TextureMatchQuality.FormatAlias;
|
||||||
}
|
}
|
||||||
else if ((lhs.FormatInfo.Format == Format.D24UnormS8Uint ||
|
else if ((lhs.FormatInfo.Format == Format.D24UnormS8Uint ||
|
||||||
lhs.FormatInfo.Format == Format.S8UintD24Unorm) && rhs.FormatInfo.Format == Format.B8G8R8A8Unorm)
|
lhs.FormatInfo.Format == Format.S8UintD24Unorm ||
|
||||||
|
lhs.FormatInfo.Format == Format.X8UintD24Unorm) && rhs.FormatInfo.Format == Format.B8G8R8A8Unorm)
|
||||||
{
|
{
|
||||||
return TextureMatchQuality.FormatAlias;
|
return TextureMatchQuality.FormatAlias;
|
||||||
}
|
}
|
||||||
|
@@ -68,6 +68,7 @@ namespace Ryujinx.Graphics.OpenGL
|
|||||||
Add(Format.S8Uint, new FormatInfo(1, false, false, All.StencilIndex8, PixelFormat.StencilIndex, PixelType.UnsignedByte));
|
Add(Format.S8Uint, new FormatInfo(1, false, false, All.StencilIndex8, PixelFormat.StencilIndex, PixelType.UnsignedByte));
|
||||||
Add(Format.D16Unorm, new FormatInfo(1, false, false, All.DepthComponent16, PixelFormat.DepthComponent, PixelType.UnsignedShort));
|
Add(Format.D16Unorm, new FormatInfo(1, false, false, All.DepthComponent16, PixelFormat.DepthComponent, PixelType.UnsignedShort));
|
||||||
Add(Format.S8UintD24Unorm, new FormatInfo(1, false, false, All.Depth24Stencil8, PixelFormat.DepthStencil, PixelType.UnsignedInt248));
|
Add(Format.S8UintD24Unorm, new FormatInfo(1, false, false, All.Depth24Stencil8, PixelFormat.DepthStencil, PixelType.UnsignedInt248));
|
||||||
|
Add(Format.X8UintD24Unorm, new FormatInfo(1, false, false, All.DepthComponent24, PixelFormat.DepthComponent, PixelType.UnsignedInt));
|
||||||
Add(Format.D32Float, new FormatInfo(1, false, false, All.DepthComponent32f, PixelFormat.DepthComponent, PixelType.Float));
|
Add(Format.D32Float, new FormatInfo(1, false, false, All.DepthComponent32f, PixelFormat.DepthComponent, PixelType.Float));
|
||||||
Add(Format.D24UnormS8Uint, new FormatInfo(1, false, false, All.Depth24Stencil8, PixelFormat.DepthStencil, PixelType.UnsignedInt248));
|
Add(Format.D24UnormS8Uint, new FormatInfo(1, false, false, All.Depth24Stencil8, PixelFormat.DepthStencil, PixelType.UnsignedInt248));
|
||||||
Add(Format.D32FloatS8Uint, new FormatInfo(1, false, false, All.Depth32fStencil8, PixelFormat.DepthStencil, PixelType.Float32UnsignedInt248Rev));
|
Add(Format.D32FloatS8Uint, new FormatInfo(1, false, false, All.Depth32fStencil8, PixelFormat.DepthStencil, PixelType.Float32UnsignedInt248Rev));
|
||||||
@@ -224,5 +225,17 @@ namespace Ryujinx.Graphics.OpenGL
|
|||||||
{
|
{
|
||||||
return _tableImage[(int)format];
|
return _tableImage[(int)format];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool IsPackedDepthStencil(Format format)
|
||||||
|
{
|
||||||
|
return format == Format.D24UnormS8Uint ||
|
||||||
|
format == Format.D32FloatS8Uint ||
|
||||||
|
format == Format.S8UintD24Unorm;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsDepthOnly(Format format)
|
||||||
|
{
|
||||||
|
return format == Format.D16Unorm || format == Format.D32Float || format == Format.X8UintD24Unorm;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -119,11 +119,11 @@ namespace Ryujinx.Graphics.OpenGL
|
|||||||
|
|
||||||
private static FramebufferAttachment GetAttachment(Format format)
|
private static FramebufferAttachment GetAttachment(Format format)
|
||||||
{
|
{
|
||||||
if (IsPackedDepthStencilFormat(format))
|
if (FormatTable.IsPackedDepthStencil(format))
|
||||||
{
|
{
|
||||||
return FramebufferAttachment.DepthStencilAttachment;
|
return FramebufferAttachment.DepthStencilAttachment;
|
||||||
}
|
}
|
||||||
else if (IsDepthOnlyFormat(format))
|
else if (FormatTable.IsDepthOnly(format))
|
||||||
{
|
{
|
||||||
return FramebufferAttachment.DepthAttachment;
|
return FramebufferAttachment.DepthAttachment;
|
||||||
}
|
}
|
||||||
@@ -133,18 +133,6 @@ namespace Ryujinx.Graphics.OpenGL
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool IsPackedDepthStencilFormat(Format format)
|
|
||||||
{
|
|
||||||
return format == Format.D24UnormS8Uint ||
|
|
||||||
format == Format.D32FloatS8Uint ||
|
|
||||||
format == Format.S8UintD24Unorm;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool IsDepthOnlyFormat(Format format)
|
|
||||||
{
|
|
||||||
return format == Format.D16Unorm || format == Format.D32Float;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int GetColorLayerCount(int index)
|
public int GetColorLayerCount(int index)
|
||||||
{
|
{
|
||||||
return _colors[index]?.Info.GetDepthOrLayers() ?? 0;
|
return _colors[index]?.Info.GetDepthOrLayers() ?? 0;
|
||||||
|
@@ -294,7 +294,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
|
|||||||
{
|
{
|
||||||
return FramebufferAttachment.DepthStencilAttachment;
|
return FramebufferAttachment.DepthStencilAttachment;
|
||||||
}
|
}
|
||||||
else if (IsDepthOnly(format))
|
else if (FormatTable.IsDepthOnly(format))
|
||||||
{
|
{
|
||||||
return FramebufferAttachment.DepthAttachment;
|
return FramebufferAttachment.DepthAttachment;
|
||||||
}
|
}
|
||||||
@@ -324,11 +324,11 @@ namespace Ryujinx.Graphics.OpenGL.Image
|
|||||||
|
|
||||||
private static ClearBufferMask GetMask(Format format)
|
private static ClearBufferMask GetMask(Format format)
|
||||||
{
|
{
|
||||||
if (format == Format.D24UnormS8Uint || format == Format.D32FloatS8Uint || format == Format.S8UintD24Unorm)
|
if (FormatTable.IsPackedDepthStencil(format))
|
||||||
{
|
{
|
||||||
return ClearBufferMask.DepthBufferBit | ClearBufferMask.StencilBufferBit;
|
return ClearBufferMask.DepthBufferBit | ClearBufferMask.StencilBufferBit;
|
||||||
}
|
}
|
||||||
else if (IsDepthOnly(format))
|
else if (FormatTable.IsDepthOnly(format))
|
||||||
{
|
{
|
||||||
return ClearBufferMask.DepthBufferBit;
|
return ClearBufferMask.DepthBufferBit;
|
||||||
}
|
}
|
||||||
@@ -342,11 +342,6 @@ namespace Ryujinx.Graphics.OpenGL.Image
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool IsDepthOnly(Format format)
|
|
||||||
{
|
|
||||||
return format == Format.D16Unorm || format == Format.D32Float;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextureView BgraSwap(TextureView from)
|
public TextureView BgraSwap(TextureView from)
|
||||||
{
|
{
|
||||||
TextureView to = (TextureView)_renderer.CreateTexture(from.Info);
|
TextureView to = (TextureView)_renderer.CreateTexture(from.Info);
|
||||||
|
@@ -376,7 +376,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||||||
{
|
{
|
||||||
return format switch
|
return format switch
|
||||||
{
|
{
|
||||||
Format.D16Unorm or Format.D32Float => ImageAspectFlags.DepthBit,
|
Format.D16Unorm or Format.D32Float or Format.X8UintD24Unorm => ImageAspectFlags.DepthBit,
|
||||||
Format.S8Uint => ImageAspectFlags.StencilBit,
|
Format.S8Uint => ImageAspectFlags.StencilBit,
|
||||||
Format.D24UnormS8Uint or
|
Format.D24UnormS8Uint or
|
||||||
Format.D32FloatS8Uint or
|
Format.D32FloatS8Uint or
|
||||||
@@ -389,7 +389,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||||||
{
|
{
|
||||||
return format switch
|
return format switch
|
||||||
{
|
{
|
||||||
Format.D16Unorm or Format.D32Float => ImageAspectFlags.DepthBit,
|
Format.D16Unorm or Format.D32Float or Format.X8UintD24Unorm => ImageAspectFlags.DepthBit,
|
||||||
Format.S8Uint => ImageAspectFlags.StencilBit,
|
Format.S8Uint => ImageAspectFlags.StencilBit,
|
||||||
Format.D24UnormS8Uint or
|
Format.D24UnormS8Uint or
|
||||||
Format.D32FloatS8Uint or
|
Format.D32FloatS8Uint or
|
||||||
|
@@ -220,7 +220,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||||||
|
|
||||||
public static bool IsD24S8(Format format)
|
public static bool IsD24S8(Format format)
|
||||||
{
|
{
|
||||||
return format == Format.D24UnormS8Uint || format == Format.S8UintD24Unorm;
|
return format == Format.D24UnormS8Uint || format == Format.S8UintD24Unorm || format == Format.X8UintD24Unorm;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool IsRGB16IntFloat(Format format)
|
private static bool IsRGB16IntFloat(Format format)
|
||||||
|
@@ -67,6 +67,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||||||
Add(Format.S8Uint, VkFormat.S8Uint);
|
Add(Format.S8Uint, VkFormat.S8Uint);
|
||||||
Add(Format.D16Unorm, VkFormat.D16Unorm);
|
Add(Format.D16Unorm, VkFormat.D16Unorm);
|
||||||
Add(Format.S8UintD24Unorm, VkFormat.D24UnormS8Uint);
|
Add(Format.S8UintD24Unorm, VkFormat.D24UnormS8Uint);
|
||||||
|
Add(Format.X8UintD24Unorm, VkFormat.X8D24UnormPack32);
|
||||||
Add(Format.D32Float, VkFormat.D32Sfloat);
|
Add(Format.D32Float, VkFormat.D32Sfloat);
|
||||||
Add(Format.D24UnormS8Uint, VkFormat.D24UnormS8Uint);
|
Add(Format.D24UnormS8Uint, VkFormat.D24UnormS8Uint);
|
||||||
Add(Format.D32FloatS8Uint, VkFormat.D32SfloatS8Uint);
|
Add(Format.D32FloatS8Uint, VkFormat.D32SfloatS8Uint);
|
||||||
|
@@ -154,9 +154,8 @@ namespace Ryujinx.Graphics.Vulkan
|
|||||||
{
|
{
|
||||||
Format.S8Uint => Format.R8Unorm,
|
Format.S8Uint => Format.R8Unorm,
|
||||||
Format.D16Unorm => Format.R16Unorm,
|
Format.D16Unorm => Format.R16Unorm,
|
||||||
Format.S8UintD24Unorm => Format.R8G8B8A8Unorm,
|
Format.D24UnormS8Uint or Format.S8UintD24Unorm or Format.X8UintD24Unorm => Format.R8G8B8A8Unorm,
|
||||||
Format.D32Float => Format.R32Float,
|
Format.D32Float => Format.R32Float,
|
||||||
Format.D24UnormS8Uint => Format.R8G8B8A8Unorm,
|
|
||||||
Format.D32FloatS8Uint => Format.R32G32Float,
|
Format.D32FloatS8Uint => Format.R32G32Float,
|
||||||
_ => throw new ArgumentException($"\"{format}\" is not a supported depth or stencil format."),
|
_ => throw new ArgumentException($"\"{format}\" is not a supported depth or stencil format."),
|
||||||
};
|
};
|
||||||
|
@@ -486,20 +486,6 @@ namespace Ryujinx.Graphics.Vulkan
|
|||||||
pExtendedFeatures = &featuresFragmentShaderInterlock;
|
pExtendedFeatures = &featuresFragmentShaderInterlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
PhysicalDeviceSubgroupSizeControlFeaturesEXT featuresSubgroupSizeControl;
|
|
||||||
|
|
||||||
if (physicalDevice.IsDeviceExtensionPresent("VK_EXT_subgroup_size_control"))
|
|
||||||
{
|
|
||||||
featuresSubgroupSizeControl = new PhysicalDeviceSubgroupSizeControlFeaturesEXT
|
|
||||||
{
|
|
||||||
SType = StructureType.PhysicalDeviceSubgroupSizeControlFeaturesExt,
|
|
||||||
PNext = pExtendedFeatures,
|
|
||||||
SubgroupSizeControl = true,
|
|
||||||
};
|
|
||||||
|
|
||||||
pExtendedFeatures = &featuresSubgroupSizeControl;
|
|
||||||
}
|
|
||||||
|
|
||||||
PhysicalDeviceCustomBorderColorFeaturesEXT featuresCustomBorderColor;
|
PhysicalDeviceCustomBorderColorFeaturesEXT featuresCustomBorderColor;
|
||||||
|
|
||||||
if (physicalDevice.IsDeviceExtensionPresent("VK_EXT_custom_border_color") &&
|
if (physicalDevice.IsDeviceExtensionPresent("VK_EXT_custom_border_color") &&
|
||||||
|
@@ -673,9 +673,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||||||
MemoryState.UnmapProcessCodeMemoryAllowed,
|
MemoryState.UnmapProcessCodeMemoryAllowed,
|
||||||
KMemoryPermission.None,
|
KMemoryPermission.None,
|
||||||
KMemoryPermission.None,
|
KMemoryPermission.None,
|
||||||
MemoryAttribute.Mask,
|
MemoryAttribute.Mask & ~MemoryAttribute.PermissionLocked,
|
||||||
MemoryAttribute.None,
|
MemoryAttribute.None,
|
||||||
MemoryAttribute.IpcAndDeviceMapped | MemoryAttribute.PermissionLocked,
|
MemoryAttribute.IpcAndDeviceMapped,
|
||||||
out MemoryState state,
|
out MemoryState state,
|
||||||
out _,
|
out _,
|
||||||
out _);
|
out _);
|
||||||
|
@@ -50,6 +50,12 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrlGpu
|
|||||||
case 0x06:
|
case 0x06:
|
||||||
result = CallIoctlMethod<GetTpcMasksArguments>(GetTpcMasks, arguments);
|
result = CallIoctlMethod<GetTpcMasksArguments>(GetTpcMasks, arguments);
|
||||||
break;
|
break;
|
||||||
|
case 0x12:
|
||||||
|
result = CallIoctlMethod<NumVsmsArguments>(NumVsms, arguments);
|
||||||
|
break;
|
||||||
|
case 0x13:
|
||||||
|
result = CallIoctlMethod<VsmsMappingArguments>(VsmsMapping, arguments);
|
||||||
|
break;
|
||||||
case 0x14:
|
case 0x14:
|
||||||
result = CallIoctlMethod<GetActiveSlotMaskArguments>(GetActiveSlotMask, arguments);
|
result = CallIoctlMethod<GetActiveSlotMaskArguments>(GetActiveSlotMask, arguments);
|
||||||
break;
|
break;
|
||||||
@@ -76,6 +82,12 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrlGpu
|
|||||||
case 0x06:
|
case 0x06:
|
||||||
result = CallIoctlMethod<GetTpcMasksArguments, int>(GetTpcMasks, arguments, inlineOutBuffer);
|
result = CallIoctlMethod<GetTpcMasksArguments, int>(GetTpcMasks, arguments, inlineOutBuffer);
|
||||||
break;
|
break;
|
||||||
|
case 0x12:
|
||||||
|
result = CallIoctlMethod<NumVsmsArguments>(NumVsms, arguments);
|
||||||
|
break;
|
||||||
|
case 0x13:
|
||||||
|
result = CallIoctlMethod<VsmsMappingArguments>(VsmsMapping, arguments);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,6 +228,27 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrlGpu
|
|||||||
return NvInternalResult.Success;
|
return NvInternalResult.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private NvInternalResult NumVsms(ref NumVsmsArguments arguments)
|
||||||
|
{
|
||||||
|
Logger.Stub?.PrintStub(LogClass.ServiceNv);
|
||||||
|
|
||||||
|
arguments.NumVsms = 2;
|
||||||
|
|
||||||
|
return NvInternalResult.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
private NvInternalResult VsmsMapping(ref VsmsMappingArguments arguments)
|
||||||
|
{
|
||||||
|
Logger.Stub?.PrintStub(LogClass.ServiceNv);
|
||||||
|
|
||||||
|
arguments.Sm0GpcIndex = 0;
|
||||||
|
arguments.Sm0TpcIndex = 0;
|
||||||
|
arguments.Sm1GpcIndex = 0;
|
||||||
|
arguments.Sm1TpcIndex = 1;
|
||||||
|
|
||||||
|
return NvInternalResult.Success;
|
||||||
|
}
|
||||||
|
|
||||||
private NvInternalResult GetActiveSlotMask(ref GetActiveSlotMaskArguments arguments)
|
private NvInternalResult GetActiveSlotMask(ref GetActiveSlotMaskArguments arguments)
|
||||||
{
|
{
|
||||||
Logger.Stub?.PrintStub(LogClass.ServiceNv);
|
Logger.Stub?.PrintStub(LogClass.ServiceNv);
|
||||||
|
@@ -0,0 +1,11 @@
|
|||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrlGpu.Types
|
||||||
|
{
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
struct NumVsmsArguments
|
||||||
|
{
|
||||||
|
public uint NumVsms;
|
||||||
|
public uint Reserved;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,13 @@
|
|||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrlGpu.Types
|
||||||
|
{
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
struct VsmsMappingArguments
|
||||||
|
{
|
||||||
|
public byte Sm0GpcIndex;
|
||||||
|
public byte Sm0TpcIndex;
|
||||||
|
public byte Sm1GpcIndex;
|
||||||
|
public byte Sm1TpcIndex;
|
||||||
|
}
|
||||||
|
}
|
@@ -15,7 +15,7 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The current version of the file format
|
/// The current version of the file format
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const int CurrentVersion = 48;
|
public const int CurrentVersion = 49;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Version of the configuration file format
|
/// Version of the configuration file format
|
||||||
|
@@ -1430,6 +1430,18 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
configurationFileUpdated = true;
|
configurationFileUpdated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (configurationFileFormat.Version < 49)
|
||||||
|
{
|
||||||
|
Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 49.");
|
||||||
|
|
||||||
|
if (OperatingSystem.IsMacOS())
|
||||||
|
{
|
||||||
|
AppDataManager.FixMacOSConfigurationFolders();
|
||||||
|
}
|
||||||
|
|
||||||
|
configurationFileUpdated = true;
|
||||||
|
}
|
||||||
|
|
||||||
Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog;
|
Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog;
|
||||||
Graphics.ResScale.Value = configurationFileFormat.ResScale;
|
Graphics.ResScale.Value = configurationFileFormat.ResScale;
|
||||||
Graphics.ResScaleCustom.Value = configurationFileFormat.ResScaleCustom;
|
Graphics.ResScaleCustom.Value = configurationFileFormat.ResScaleCustom;
|
||||||
|
@@ -78,7 +78,8 @@ namespace Ryujinx.Modules
|
|||||||
}
|
}
|
||||||
else if (OperatingSystem.IsLinux())
|
else if (OperatingSystem.IsLinux())
|
||||||
{
|
{
|
||||||
_platformExt = "linux_x64.tar.gz";
|
var arch = RuntimeInformation.OSArchitecture == Architecture.Arm64 ? "arm64" : "x64";
|
||||||
|
_platformExt = $"linux_{arch}.tar.gz";
|
||||||
artifactIndex = 0;
|
artifactIndex = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -512,16 +513,6 @@ namespace Ryujinx.Modules
|
|||||||
public static bool CanUpdate(bool showWarnings)
|
public static bool CanUpdate(bool showWarnings)
|
||||||
{
|
{
|
||||||
#if !DISABLE_UPDATER
|
#if !DISABLE_UPDATER
|
||||||
if (RuntimeInformation.OSArchitecture != Architecture.X64)
|
|
||||||
{
|
|
||||||
if (showWarnings)
|
|
||||||
{
|
|
||||||
GtkDialog.CreateWarningDialog("You are not running a supported system architecture!", "(Only x64 systems are supported!)");
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!NetworkInterface.GetIsNetworkAvailable())
|
if (!NetworkInterface.GetIsNetworkAvailable())
|
||||||
{
|
{
|
||||||
if (showWarnings)
|
if (showWarnings)
|
||||||
|
Reference in New Issue
Block a user