diff options
author | Thog <me@thog.eu> | 2020-02-13 18:43:29 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-13 14:43:29 -0300 |
commit | 416ddd0f6e9b5c9e9b3da627cc90c98bb5a3a56b (patch) | |
tree | d5df7b68e74f0dfd52106a856182916cda13e3fc /Ryujinx.Graphics.OpenGL/Window.cs | |
parent | 8d83878f671e03b4bae803ee848a35158d8ffdf3 (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.cs | 40 |
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() |