mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2026-08-03 11:23:51 +00:00
Compare commits
2
Commits
Canary-1.3.338
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3f62488b26 | ||
|
|
e3940abe01 |
@@ -162,6 +162,7 @@ namespace Ryujinx.Common.Logging
|
||||
{
|
||||
if (_logTargets.Any(t => t.Name == target.Name))
|
||||
{
|
||||
target.Dispose();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -195,11 +195,14 @@ namespace Ryujinx.Graphics.GAL.Multithreading
|
||||
{
|
||||
// The reference table is sized so that it will never overflow, so long as the references are taken after the command is allocated.
|
||||
|
||||
int index = _refProducerPtr;
|
||||
// make sure increment is thread safe
|
||||
int index = Interlocked.Increment(ref _refProducerPtr) - 1;
|
||||
|
||||
index %= _refQueue.Length;
|
||||
|
||||
_refQueue[index] = obj;
|
||||
|
||||
_refProducerPtr = (_refProducerPtr + 1) % _refQueue.Length;
|
||||
_refProducerPtr %= _refQueue.Length;
|
||||
|
||||
return index;
|
||||
}
|
||||
@@ -531,10 +534,15 @@ namespace Ryujinx.Graphics.GAL.Multithreading
|
||||
_running = false;
|
||||
_galWorkAvailable.Set();
|
||||
|
||||
if (_gpuThread != null && _gpuThread.IsAlive)
|
||||
if (_gpuThread is { IsAlive: true })
|
||||
{
|
||||
_gpuThread.Join();
|
||||
}
|
||||
|
||||
if (_backendThread is { IsAlive: true })
|
||||
{
|
||||
_backendThread.Join();
|
||||
}
|
||||
|
||||
// Dispose the renderer.
|
||||
_baseRenderer.Dispose();
|
||||
|
||||
@@ -4,6 +4,7 @@ using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Net.Http;
|
||||
using System.Threading;
|
||||
using SDL;
|
||||
using static SDL.SDL3;
|
||||
@@ -43,6 +44,9 @@ namespace Ryujinx.SDL3.Common
|
||||
|
||||
private SDL3Driver() { }
|
||||
|
||||
private static readonly HttpClient _httpClient = new();
|
||||
private const string GamepadDbUrl = "https://raw.githubusercontent.com/mdqinc/SDL_GameControllerDB/refs/heads/master/gamecontrollerdb.txt";
|
||||
|
||||
public void Initialize()
|
||||
{
|
||||
lock (_lock)
|
||||
@@ -96,8 +100,10 @@ namespace Ryujinx.SDL3.Common
|
||||
|
||||
SDL_SetEventEnabled((uint)SDL_EventType.SDL_EVENT_GAMEPAD_SENSOR_UPDATE, false);
|
||||
|
||||
string gamepadDbPath = Path.Combine(AppDataManager.BaseDirPath, "SDL_GameControllerDB.txt");
|
||||
string gamepadDbPath = Path.Combine(AppDataManager.BaseDirPath, "gamecontrollerdb.txt");
|
||||
|
||||
UpdateGamepadDb(gamepadDbPath);
|
||||
|
||||
if (File.Exists(gamepadDbPath))
|
||||
{
|
||||
SDL_AddGamepadMappingsFromFile(gamepadDbPath);
|
||||
@@ -110,6 +116,37 @@ namespace Ryujinx.SDL3.Common
|
||||
}
|
||||
}
|
||||
|
||||
private static void UpdateGamepadDb(string gamepadDbPath)
|
||||
{
|
||||
try
|
||||
{
|
||||
byte[] remoteBytes = _httpClient.GetByteArrayAsync(GamepadDbUrl).GetAwaiter().GetResult();
|
||||
|
||||
bool shouldWrite = true;
|
||||
|
||||
if (File.Exists(gamepadDbPath))
|
||||
{
|
||||
byte[] localBytes = File.ReadAllBytes(gamepadDbPath);
|
||||
|
||||
if (localBytes.AsSpan().SequenceEqual(remoteBytes))
|
||||
{
|
||||
shouldWrite = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (shouldWrite)
|
||||
{
|
||||
File.WriteAllBytes(gamepadDbPath ?? "", remoteBytes);
|
||||
|
||||
Logger.Info?.Print(LogClass.Application, "Updated gamepad database.");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Warning?.Print(LogClass.Application, $"Failed to check/download gamepad database, using existing local copy if present: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
public bool RegisterWindow(SDL_WindowID windowId, Action<SDL_Event> windowEventHandler)
|
||||
{
|
||||
return _registeredWindowHandlers.TryAdd(windowId, windowEventHandler);
|
||||
|
||||
Reference in New Issue
Block a user