Helion-Engine / Helion

A modern fast paced Doom FPS engine
GNU General Public License v3.0
86 stars 9 forks source link

Crash on ALT-TAB from fullscreen #581

Closed lemming104 closed 2 months ago

lemming104 commented 2 months ago

I think this might have been due to 20ec9b04494625d410f4e77c60993cf0f8067b90, although I'm not 100% sure because I haven't tested both with and without that change yet.

Whenever Helion is running full-screen, and I ALT-Tab to another application, or pretty much whenever anything steals focus, Helion crashes. This also occurs with the default keybind for "screenshot" (PrtScn), which on standard Windows 11 installs, launches the snipping tool, which steals focus.

(Only tangentially related, one other thing that has puzzled me about Helion is that the video capture tool built into the Windows "game bar" (Win + G) has never worked for me. I mainly point this out because it seems like another general video init/setup thing, and video captures can be very useful for demonstrating certain bugs and quirks.)

Log snippet:

21:46:37.2219 Fatal error occurred System.Exception: Framebuffer not complete (Virtual): FramebufferIncompleteAttachment
   at Helion.Render.OpenGL.Framebuffer.GLFramebuffer.CheckFramebufferOrThrow() in C:\git\Helion\Core\Render\OpenGL\Framebuffer\GLFramebuffer.cs:line 47
   at Helion.Render.OpenGL.Framebuffer.GLFramebuffer..ctor(String label, Dimension dimension, Int32 numColorAttachments, Nullable`1 storage) in C:\git\Helion\Core\Render\OpenGL\Framebuffer\GLFramebuffer.cs:line 39
   at Helion.Render.OpenGL.Renderers.FramebufferRenderer.CreateFramebuffer(Dimension& dimension) in C:\git\Helion\Core\Render\OpenGL\Renderers\FramebufferRenderer.cs:line 105
   at Helion.Render.OpenGL.Renderers.FramebufferRenderer.UpdateToDimensionIfNeeded(Dimension dimension) in C:\git\Helion\Core\Render\OpenGL\Renderers\FramebufferRenderer.cs:line 127
   at Helion.Render.Renderer.SetupAndBindVirtualFramebuffer() in C:\git\Helion\Core\Render\Renderer.cs:line 262
   at Helion.Render.Renderer.Render(RenderCommands renderCommands) in C:\git\Helion\Core\Render\Renderer.cs:line 215
   at Helion.Client.Client.PerformRender() in C:\git\Helion\client\Client.cs:line 169
   at Helion.Client.Client.Render() in C:\git\Helion\client\Client.cs:line 214
   at Helion.Client.Client.Window_MainLoop(FrameEventArgs frameEventArgs) in C:\git\Helion\client\Client.cs:line 240
   at OpenTK.Windowing.Desktop.GameWindow.Run()
   at Helion.Client.Client.Run() in C:\git\Helion\client\Client.cs:line 284
   at Helion.Client.Client.Run(CommandLineArgs commandLineArgs) in C:\git\Helion\client\Client.cs:line 456
   at Helion.Client.Client.RunRelease(CommandLineArgs commandLineArgs) in C:\git\Helion\client\Client.cs:line 406    at Helion.Render.OpenGL.Framebuffer.GLFramebuffer.CheckFramebufferOrThrow() in C:\git\Helion\Core\Render\OpenGL\Framebuffer\GLFramebuffer.cs:line 47
   at Helion.Render.OpenGL.Framebuffer.GLFramebuffer..ctor(String label, Dimension dimension, Int32 numColorAttachments, Nullable`1 storage) in C:\git\Helion\Core\Render\OpenGL\Framebuffer\GLFramebuffer.cs:line 39
   at Helion.Render.OpenGL.Renderers.FramebufferRenderer.CreateFramebuffer(Dimension& dimension) in C:\git\Helion\Core\Render\OpenGL\Renderers\FramebufferRenderer.cs:line 105
   at Helion.Render.OpenGL.Renderers.FramebufferRenderer.UpdateToDimensionIfNeeded(Dimension dimension) in C:\git\Helion\Core\Render\OpenGL\Renderers\FramebufferRenderer.cs:line 127
   at Helion.Render.Renderer.SetupAndBindVirtualFramebuffer() in C:\git\Helion\Core\Render\Renderer.cs:line 262
   at Helion.Render.Renderer.Render(RenderCommands renderCommands) in C:\git\Helion\Core\Render\Renderer.cs:line 215
   at Helion.Client.Client.PerformRender() in C:\git\Helion\client\Client.cs:line 169
   at Helion.Client.Client.Render() in C:\git\Helion\client\Client.cs:line 214
   at Helion.Client.Client.Window_MainLoop(FrameEventArgs frameEventArgs) in C:\git\Helion\client\Client.cs:line 240
   at OpenTK.Windowing.Desktop.GameWindow.Run()
   at Helion.Client.Client.Run() in C:\git\Helion\client\Client.cs:line 284
   at Helion.Client.Client.Run(CommandLineArgs commandLineArgs) in C:\git\Helion\client\Client.cs:line 456
   at Helion.Client.Client.RunRelease(CommandLineArgs commandLineArgs) in C:\git\Helion\client\Client.cs:line 406
nstlaurent commented 2 months ago

Always using the framebuffer did cause it. This was apparently a bug before if you happened to use a virtual resolution. The change was necessary to force a 32 bit depth buffer when I realized the behavior wasn't consistent between NVIDIA and AMD cards.

As for the video capture, it's related to the fact that Helion is using exclusive fullscreen. Anything that tries to capture from the window will not work because apparently this method requires double buffering. OBS has the same problem if you setup a window capture. Works in windowed, but not fullscreen. To get it to work in OBS I have to setup a Game Capture source and set the mode to 'Capture any fullscreen application'.

I just played with the Windows Game Bar this appears to be the issue. It even detects this: image

What is silly about this is that exclusive fullscreen is a Windows feature to disable double-buffering and rendering lag, and yet their own Game Bar doesn't handle it... lol

lemming104 commented 2 months ago

Confirmed that 0099ce8ea014bbba50295e6d5391e1da8807db74 seems to fix the ALT-TAB issue.