Skip to content

Commit

Permalink
Fix SDL driver fallbacks on Linux, includes upstream FNA (not FNA3D) …
Browse files Browse the repository at this point in the history
…update
  • Loading branch information
Chicken-Bones committed Sep 29, 2023
1 parent a30d9e0 commit decb6e6
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 12 deletions.
23 changes: 12 additions & 11 deletions patches/tModLoader/Terraria/ModLoader/Engine/FNAFixes.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using SDL2;
using System;
using System.Linq;

namespace Terraria.ModLoader.Engine;

Expand All @@ -9,7 +10,7 @@ internal static void Init()
{
if (OperatingSystem.IsWindows()) {
// FNA sets this to "1" on Windows. Terraria does not want this. See #2020
SDL.SDL_SetHint(SDL.SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, "0");
SDL.SDL_SetHint(SDL.SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, "0" );
}

ConfigureDrivers();
Expand All @@ -21,23 +22,23 @@ private static void ConfigureDrivers()
// Hints in https://github.com/libsdl-org/SDL/blob/release-2.28.x/include/SDL_hints.h#L2384
// Note that env var names change in SDL 3.x

// Default driver order https://github.com/libsdl-org/SDL/blob/release-2.28.x/src/video/SDL_video.c#L67
ConfigureDrivers("SDL_VIDEODRIVER", "-videodriver", "cocoa,x11,wayland,vivante,directfb,windows,winrt,haiku,uikit,android,ps2,psp,vita,n3ds,kmsdrm,riscos,rpi,nacl,emscripten,qnx,ngage,offscreen,dummy,evdev");

// Default driver order https://github.com/libsdl-org/SDL/blob/release-2.28.x/src/audio/SDL_audio.c#L38
ConfigureDrivers("SDL_AUDIODRIVER", "-audiodriver", "pulseaudio,alsa,sndio,netbsd,qsa,wasapi,directsound,haiku,coreaudio,aaudio,openslES,android,ps2,psp,vita,n3ds,emscripten,jack,pipewire,dsp,disk,dummy");
ConfigureDrivers("SDL_VIDEODRIVER", "-videodriver", SDL.SDL_GetNumVideoDrivers(), SDL.SDL_GetVideoDriver);
ConfigureDrivers("SDL_AUDIODRIVER", "-audiodriver", SDL.SDL_GetNumAudioDrivers(), SDL.SDL_GetAudioDriver);
}

private static void ConfigureDrivers(string sdlEnvVar, string launchArg, string defaultDriverList)
private static void ConfigureDrivers(string sdlHintName, string launchArg, int numDrivers, Func<int, string> getDriver)
{
var drivers = Enumerable.Range(0, numDrivers).Select(getDriver).Where(n => n != null).ToArray();
var defaultDriverString = string.Join(",", drivers);

if (Program.LaunchParameters.TryGetValue(launchArg, out var launchArgValue)) {
Environment.SetEnvironmentVariable(sdlEnvVar, launchArgValue);
Environment.SetEnvironmentVariable(sdlHintName, launchArgValue);
}

// Append the default driver list, in case of an old or unsupported env var left on the system (See #2926)
if (Environment.GetEnvironmentVariable(sdlEnvVar) is string envVarValue) {
Logging.FNA.Info($"Detected {sdlEnvVar}={envVarValue}. Appending default driver list as fallbacks.");
Environment.SetEnvironmentVariable(sdlEnvVar, $"{envVarValue},{defaultDriverList}");
if (Environment.GetEnvironmentVariable(sdlHintName) is string envVarValue) {
Logging.FNA.Info($"Detected {sdlHintName}={envVarValue}. Appending default driver list as fallback: {defaultDriverString}");
SDL.SDL_SetHintWithPriority(sdlHintName, $"{envVarValue},{defaultDriverString}", SDL.SDL_HintPriority.SDL_HINT_OVERRIDE);
}
}
}

0 comments on commit decb6e6

Please sign in to comment.