From 416ddd0f6e9b5c9e9b3da627cc90c98bb5a3a56b Mon Sep 17 00:00:00 2001 From: Thog <me@thog.eu> Date: Thu, 13 Feb 2020 18:43:29 +0100 Subject: Some fixes for the new GLRenderer (#930) * Some fixes for the new GLRenderer Changelog: - Fix transparency of the window on some games on Windows. - Fix escape key not being able to exit emulation. - Fix inverted logic in fullscreen event handling. - Fix a race condition when stoping emulation causing a hang. - Fix a memory leak of the OpenGL context when stoping emulation (saving ~200MB of RAM when stoping emulation). - Simplify and document behaviours when exiting the emulator while the emulation is running. * Make sure to clear alpha channel when presenting Texture This fix once and for all the transparency issue on Windows. * Enforce footer bar size to avoid gl widget to get resized to 1280x724 * Fix full screen inversion in MainWindow and make sure _listStatusBox don't come back when not needed * Remove previous transparency clear attempt that is useless now * Remove an extra line return --- Ryujinx.Graphics.OpenGL/Window.cs | 40 +++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) (limited to 'Ryujinx.Graphics.OpenGL/Window.cs') diff --git a/Ryujinx.Graphics.OpenGL/Window.cs b/Ryujinx.Graphics.OpenGL/Window.cs index 26fc6a64..2689a7c4 100644 --- a/Ryujinx.Graphics.OpenGL/Window.cs +++ b/Ryujinx.Graphics.OpenGL/Window.cs @@ -22,15 +22,30 @@ namespace Ryujinx.Graphics.OpenGL public void Present(ITexture texture, ImageCrop crop) { - TextureView view = (TextureView)texture; - GL.Disable(EnableCap.FramebufferSrgb); + CopyTextureToFrameBufferRGB(0, GetCopyFramebufferHandleLazy(), (TextureView)texture, crop); + + GL.Enable(EnableCap.FramebufferSrgb); + } + + public void SetSize(int width, int height) + { + _width = width; + _height = height; + } + + + private void CopyTextureToFrameBufferRGB(int drawFramebuffer, int readFramebuffer, TextureView view, ImageCrop crop) + { + bool[] oldFramebufferColorWritemask = new bool[4]; + int oldReadFramebufferHandle = GL.GetInteger(GetPName.ReadFramebufferBinding); int oldDrawFramebufferHandle = GL.GetInteger(GetPName.DrawFramebufferBinding); + GL.GetBoolean(GetIndexedPName.ColorWritemask, drawFramebuffer, oldFramebufferColorWritemask); - GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, 0); - GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, GetCopyFramebufferHandleLazy()); + GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, drawFramebuffer); + GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, readFramebuffer); GL.FramebufferTexture( FramebufferTarget.ReadFramebuffer, @@ -93,16 +108,17 @@ namespace Ryujinx.Graphics.OpenGL ClearBufferMask.ColorBufferBit, BlitFramebufferFilter.Linear); + // Remove Alpha channel + GL.ColorMask(drawFramebuffer, false, false, false, true); + GL.ClearBuffer(ClearBuffer.Color, 0, new float[] { 0.0f, 0.0f, 0.0f, 1.0f }); + GL.ColorMask(drawFramebuffer, + oldFramebufferColorWritemask[0], + oldFramebufferColorWritemask[1], + oldFramebufferColorWritemask[2], + oldFramebufferColorWritemask[3]); + GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, oldReadFramebufferHandle); GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, oldDrawFramebufferHandle); - - GL.Enable(EnableCap.FramebufferSrgb); - } - - public void SetSize(int width, int height) - { - _width = width; - _height = height; } private int GetCopyFramebufferHandleLazy() -- cgit v1.2.3-70-g09d2