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