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
This commit is contained in:
parent
8d83878f67
commit
416ddd0f6e
4 changed files with 97 additions and 72 deletions
|
@ -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()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue