Added addition error logging to graphics.log when SDL fails
This commit is contained in:
committed by
abcdefg30
parent
30f14dcc4c
commit
0f90713aba
@@ -304,7 +304,7 @@ namespace OpenRA
|
|||||||
if (!string.IsNullOrEmpty(supportDirArg))
|
if (!string.IsNullOrEmpty(supportDirArg))
|
||||||
Platform.OverrideSupportDir(supportDirArg);
|
Platform.OverrideSupportDir(supportDirArg);
|
||||||
|
|
||||||
Console.WriteLine("Platform is {0}", Platform.CurrentPlatform);
|
Console.WriteLine($"Platform is {Platform.CurrentPlatform}");
|
||||||
|
|
||||||
// Load the engine version as early as possible so it can be written to exception logs
|
// Load the engine version as early as possible so it can be written to exception logs
|
||||||
try
|
try
|
||||||
@@ -316,8 +316,8 @@ namespace OpenRA
|
|||||||
if (string.IsNullOrEmpty(EngineVersion))
|
if (string.IsNullOrEmpty(EngineVersion))
|
||||||
EngineVersion = "Unknown";
|
EngineVersion = "Unknown";
|
||||||
|
|
||||||
Console.WriteLine("Engine version is {0}", EngineVersion);
|
Console.WriteLine($"Engine version is {EngineVersion}");
|
||||||
Console.WriteLine("Runtime: {0}", Platform.RuntimeVersion);
|
Console.WriteLine($"Runtime: {Platform.RuntimeVersion}");
|
||||||
|
|
||||||
// Special case handling of Game.Mod argument: if it matches a real filesystem path
|
// Special case handling of Game.Mod argument: if it matches a real filesystem path
|
||||||
// then we use this to override the mod search path, and replace it with the mod id
|
// then we use this to override the mod search path, and replace it with the mod id
|
||||||
@@ -372,7 +372,7 @@ namespace OpenRA
|
|||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Log.Write("graphics", "{0}", e);
|
Log.Write("graphics", $"{e}");
|
||||||
Console.WriteLine("Renderer initialization failed. Check graphics.log for details.");
|
Console.WriteLine("Renderer initialization failed. Check graphics.log for details.");
|
||||||
|
|
||||||
Renderer?.Dispose();
|
Renderer?.Dispose();
|
||||||
@@ -391,7 +391,7 @@ namespace OpenRA
|
|||||||
Mods = new InstalledMods(modSearchPaths, explicitModPaths);
|
Mods = new InstalledMods(modSearchPaths, explicitModPaths);
|
||||||
Console.WriteLine("Internal mods:");
|
Console.WriteLine("Internal mods:");
|
||||||
foreach (var mod in Mods)
|
foreach (var mod in Mods)
|
||||||
Console.WriteLine("\t{0}: {1} ({2})", mod.Key, mod.Value.Metadata.Title, mod.Value.Metadata.Version);
|
Console.WriteLine($"\t{mod.Key}: {mod.Value.Metadata.Title} ({mod.Value.Metadata.Version})");
|
||||||
|
|
||||||
modLaunchWrapper = args.GetValue("Engine.LaunchWrapper", null);
|
modLaunchWrapper = args.GetValue("Engine.LaunchWrapper", null);
|
||||||
|
|
||||||
@@ -416,7 +416,7 @@ namespace OpenRA
|
|||||||
|
|
||||||
Console.WriteLine("External mods:");
|
Console.WriteLine("External mods:");
|
||||||
foreach (var mod in ExternalMods)
|
foreach (var mod in ExternalMods)
|
||||||
Console.WriteLine("\t{0}: {1} ({2})", mod.Key, mod.Value.Title, mod.Value.Version);
|
Console.WriteLine($"\t{mod.Key}: {mod.Value.Title} ({mod.Value.Version})");
|
||||||
|
|
||||||
InitializeMod(modID, args);
|
InitializeMod(modID, args);
|
||||||
Ui.InitializeTranslation();
|
Ui.InitializeTranslation();
|
||||||
@@ -452,7 +452,7 @@ namespace OpenRA
|
|||||||
if (!Mods.ContainsKey(mod))
|
if (!Mods.ContainsKey(mod))
|
||||||
throw new InvalidOperationException($"Unknown or invalid mod '{mod}'.");
|
throw new InvalidOperationException($"Unknown or invalid mod '{mod}'.");
|
||||||
|
|
||||||
Console.WriteLine("Loading mod: {0}", mod);
|
Console.WriteLine($"Loading mod: {mod}");
|
||||||
|
|
||||||
Sound.StopVideo();
|
Sound.StopVideo();
|
||||||
|
|
||||||
|
|||||||
@@ -151,21 +151,28 @@ namespace OpenRA.Platforms.Default
|
|||||||
if (enableLegacyGL)
|
if (enableLegacyGL)
|
||||||
testProfiles.Add(GLProfile.Legacy);
|
testProfiles.Add(GLProfile.Legacy);
|
||||||
|
|
||||||
|
var errorLog = new List<string>();
|
||||||
supportedProfiles = testProfiles
|
supportedProfiles = testProfiles
|
||||||
.Where(CanCreateGLWindow)
|
.Where(profile => CanCreateGLWindow(profile, errorLog))
|
||||||
.ToArray();
|
.ToArray();
|
||||||
|
|
||||||
if (!supportedProfiles.Any())
|
if (!supportedProfiles.Any())
|
||||||
|
{
|
||||||
|
foreach (var error in errorLog)
|
||||||
|
Log.Write("graphics", error);
|
||||||
|
|
||||||
throw new InvalidOperationException("No supported OpenGL profiles were found.");
|
throw new InvalidOperationException("No supported OpenGL profiles were found.");
|
||||||
|
}
|
||||||
|
|
||||||
profile = supportedProfiles.Contains(requestProfile) ? requestProfile : supportedProfiles.First();
|
profile = supportedProfiles.Contains(requestProfile) ? requestProfile : supportedProfiles.First();
|
||||||
|
|
||||||
// Note: This must be called after the CanCreateGLWindow checks above,
|
// Note: This must be called after the CanCreateGLWindow checks above,
|
||||||
// which needs to create and destroy its own SDL contexts as a workaround for specific buggy drivers
|
// which needs to create and destroy its own SDL contexts as a workaround for specific buggy drivers
|
||||||
SDL.SDL_Init(SDL.SDL_INIT_VIDEO);
|
if (SDL.SDL_Init(SDL.SDL_INIT_VIDEO) != 0)
|
||||||
SetSDLAttributes(profile);
|
Log.Write("graphics", $"SDL initialisation failed: {SDL.SDL_GetError()}");
|
||||||
|
|
||||||
Console.WriteLine("Using SDL 2 with OpenGL ({0}) renderer", profile);
|
SetSDLAttributes(profile);
|
||||||
|
Console.WriteLine($"Using SDL 2 with OpenGL ({profile}) renderer");
|
||||||
if (videoDisplay < 0 || videoDisplay >= DisplayCount)
|
if (videoDisplay < 0 || videoDisplay >= DisplayCount)
|
||||||
videoDisplay = 0;
|
videoDisplay = 0;
|
||||||
|
|
||||||
@@ -210,7 +217,7 @@ namespace OpenRA.Platforms.Default
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Console.WriteLine("Desktop resolution: {0}x{1}", display.w, display.h);
|
Console.WriteLine($"Desktop resolution: {display.w}x{display.h}");
|
||||||
if (requestEffectiveWindowSize.Width == 0 && requestEffectiveWindowSize.Height == 0)
|
if (requestEffectiveWindowSize.Width == 0 && requestEffectiveWindowSize.Height == 0)
|
||||||
{
|
{
|
||||||
Console.WriteLine("No custom resolution provided, using desktop resolution");
|
Console.WriteLine("No custom resolution provided, using desktop resolution");
|
||||||
@@ -219,7 +226,7 @@ namespace OpenRA.Platforms.Default
|
|||||||
else
|
else
|
||||||
surfaceSize = windowSize = new Size((int)(requestEffectiveWindowSize.Width * windowScale), (int)(requestEffectiveWindowSize.Height * windowScale));
|
surfaceSize = windowSize = new Size((int)(requestEffectiveWindowSize.Width * windowScale), (int)(requestEffectiveWindowSize.Height * windowScale));
|
||||||
|
|
||||||
Console.WriteLine("Using resolution: {0}x{1}", windowSize.Width, windowSize.Height);
|
Console.WriteLine($"Using resolution: {windowSize.Width}x{windowSize.Height}");
|
||||||
|
|
||||||
var windowFlags = SDL.SDL_WindowFlags.SDL_WINDOW_OPENGL | SDL.SDL_WindowFlags.SDL_WINDOW_ALLOW_HIGHDPI;
|
var windowFlags = SDL.SDL_WindowFlags.SDL_WINDOW_OPENGL | SDL.SDL_WindowFlags.SDL_WINDOW_ALLOW_HIGHDPI;
|
||||||
|
|
||||||
@@ -510,18 +517,25 @@ namespace OpenRA.Platforms.Default
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CanCreateGLWindow(GLProfile profile)
|
static bool CanCreateGLWindow(GLProfile profile, List<string> errorLog)
|
||||||
{
|
{
|
||||||
// Implementation inspired by TestIndividualGLVersion from Veldrid
|
// Implementation inspired by TestIndividualGLVersion from Veldrid
|
||||||
|
|
||||||
// Need to create and destroy its own SDL contexts as a workaround for specific buggy drivers
|
// Need to create and destroy its own SDL contexts as a workaround for specific buggy drivers
|
||||||
SDL.SDL_Init(SDL.SDL_INIT_VIDEO);
|
if (SDL.SDL_Init(SDL.SDL_INIT_VIDEO) != 0)
|
||||||
|
{
|
||||||
|
// Continue to harvest additional SDL errors below
|
||||||
|
errorLog.Add($"{profile}: SDL init failed: {SDL.SDL_GetError()}");
|
||||||
|
SDL.SDL_ClearError();
|
||||||
|
}
|
||||||
|
|
||||||
SetSDLAttributes(profile);
|
SetSDLAttributes(profile);
|
||||||
|
|
||||||
var flags = SDL.SDL_WindowFlags.SDL_WINDOW_HIDDEN | SDL.SDL_WindowFlags.SDL_WINDOW_OPENGL;
|
var flags = SDL.SDL_WindowFlags.SDL_WINDOW_HIDDEN | SDL.SDL_WindowFlags.SDL_WINDOW_OPENGL;
|
||||||
var window = SDL.SDL_CreateWindow("", 0, 0, 1, 1, flags);
|
var window = SDL.SDL_CreateWindow("", 0, 0, 1, 1, flags);
|
||||||
if (window == IntPtr.Zero || !string.IsNullOrEmpty(SDL.SDL_GetError()))
|
if (window == IntPtr.Zero || !string.IsNullOrEmpty(SDL.SDL_GetError()))
|
||||||
{
|
{
|
||||||
|
errorLog.Add($"{profile}: SDL window creation failed: {SDL.SDL_GetError()}");
|
||||||
SDL.SDL_ClearError();
|
SDL.SDL_ClearError();
|
||||||
SDL.SDL_Quit();
|
SDL.SDL_Quit();
|
||||||
return false;
|
return false;
|
||||||
@@ -530,6 +544,7 @@ namespace OpenRA.Platforms.Default
|
|||||||
var context = SDL.SDL_GL_CreateContext(window);
|
var context = SDL.SDL_GL_CreateContext(window);
|
||||||
if (context == IntPtr.Zero || SDL.SDL_GL_MakeCurrent(window, context) < 0)
|
if (context == IntPtr.Zero || SDL.SDL_GL_MakeCurrent(window, context) < 0)
|
||||||
{
|
{
|
||||||
|
errorLog.Add($"{profile}: GL context creation failed: {SDL.SDL_GetError()}");
|
||||||
SDL.SDL_ClearError();
|
SDL.SDL_ClearError();
|
||||||
SDL.SDL_DestroyWindow(window);
|
SDL.SDL_DestroyWindow(window);
|
||||||
SDL.SDL_Quit();
|
SDL.SDL_Quit();
|
||||||
@@ -542,6 +557,8 @@ namespace OpenRA.Platforms.Default
|
|||||||
{
|
{
|
||||||
var isAngle = SDL.SDL_GL_ExtensionSupported("GL_ANGLE_texture_usage") == SDL.SDL_bool.SDL_TRUE;
|
var isAngle = SDL.SDL_GL_ExtensionSupported("GL_ANGLE_texture_usage") == SDL.SDL_bool.SDL_TRUE;
|
||||||
success = isAngle ^ (profile != GLProfile.ANGLE);
|
success = isAngle ^ (profile != GLProfile.ANGLE);
|
||||||
|
if (!success)
|
||||||
|
errorLog.Add(isAngle ? "GL profile is ANGLE" : "GL profile is Embedded");
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL.SDL_GL_DeleteContext(context);
|
SDL.SDL_GL_DeleteContext(context);
|
||||||
|
|||||||
Reference in New Issue
Block a user