aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.OpenGL/Window.cs
diff options
context:
space:
mode:
authorThog <me@thog.eu>2020-02-13 18:43:29 +0100
committerGitHub <noreply@github.com>2020-02-13 14:43:29 -0300
commit416ddd0f6e9b5c9e9b3da627cc90c98bb5a3a56b (patch)
treed5df7b68e74f0dfd52106a856182916cda13e3fc /Ryujinx.Graphics.OpenGL/Window.cs
parent8d83878f671e03b4bae803ee848a35158d8ffdf3 (diff)
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
Diffstat (limited to 'Ryujinx.Graphics.OpenGL/Window.cs')
-rw-r--r--Ryujinx.Graphics.OpenGL/Window.cs40
1 files changed, 28 insertions, 12 deletions
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()