Avalonia - Use embedded window for avalonia (#3674)

* wip

* use embedded window

* fix race condition on opengl Windows

* fix glx issues on prime nvidia

* fix mouse support win32

* clean up

* addressed review

* addressed review

* fix warnings

* fix sotware keyboard dialog

* Update Ryujinx.Ava/Ui/Applet/SwkbdAppletDialog.axaml.cs

Co-authored-by: gdkchan <gab.dark.100@gmail.com>

* remove double semi

Co-authored-by: gdkchan <gab.dark.100@gmail.com>
This commit is contained in:
Emmanuel Hansen 2022-09-19 18:05:26 +00:00 committed by GitHub
parent b9f1ff3c77
commit 6f0395538b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
58 changed files with 868 additions and 3531 deletions

View file

@ -12,11 +12,7 @@ namespace Ryujinx.Graphics.OpenGL
private int _width;
private int _height;
private bool _sizeChanged;
private int _copyFramebufferHandle;
private int _stagingFrameBuffer;
private int[] _stagingTextures;
private int _currentTexture;
internal BackgroundContextWorker BackgroundContext { get; private set; }
@ -25,28 +21,15 @@ namespace Ryujinx.Graphics.OpenGL
public Window(OpenGLRenderer renderer)
{
_renderer = renderer;
_stagingTextures = new int[TextureCount];
}
public void Present(ITexture texture, ImageCrop crop, Action<object> swapBuffersCallback)
public void Present(ITexture texture, ImageCrop crop, Action swapBuffersCallback)
{
GL.Disable(EnableCap.FramebufferSrgb);
if (_sizeChanged)
{
if (_stagingFrameBuffer != 0)
{
GL.DeleteTextures(_stagingTextures.Length, _stagingTextures);
GL.DeleteFramebuffer(_stagingFrameBuffer);
}
CreateStagingFramebuffer();
_sizeChanged = false;
}
(int oldDrawFramebufferHandle, int oldReadFramebufferHandle) = ((Pipeline)_renderer.Pipeline).GetBoundFramebuffers();
CopyTextureToFrameBufferRGB(_stagingFrameBuffer, GetCopyFramebufferHandleLazy(), (TextureView)texture, crop, swapBuffersCallback);
CopyTextureToFrameBufferRGB(0, GetCopyFramebufferHandleLazy(), (TextureView)texture, crop, swapBuffersCallback);
GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, oldReadFramebufferHandle);
GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, oldDrawFramebufferHandle);
@ -59,41 +42,17 @@ namespace Ryujinx.Graphics.OpenGL
public void ChangeVSyncMode(bool vsyncEnabled) { }
private void CreateStagingFramebuffer()
{
_stagingFrameBuffer = GL.GenFramebuffer();
GL.GenTextures(_stagingTextures.Length, _stagingTextures);
GL.BindFramebuffer(FramebufferTarget.Framebuffer, _stagingFrameBuffer);
foreach (var stagingTexture in _stagingTextures)
{
GL.BindTexture(TextureTarget.Texture2D, stagingTexture);
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, _width, _height, 0, PixelFormat.Rgba, PixelType.UnsignedByte, IntPtr.Zero);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest);
GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, TextureTarget.Texture2D, stagingTexture, 0);
}
GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);
GL.BindTexture(TextureTarget.Texture2D, 0);
}
public void SetSize(int width, int height)
{
_width = width;
_height = height;
_sizeChanged = true;
}
private void CopyTextureToFrameBufferRGB(int drawFramebuffer, int readFramebuffer, TextureView view, ImageCrop crop, Action<object> swapBuffersCallback)
private void CopyTextureToFrameBufferRGB(int drawFramebuffer, int readFramebuffer, TextureView view, ImageCrop crop, Action swapBuffersCallback)
{
GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, drawFramebuffer);
GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, readFramebuffer);
GL.FramebufferTexture2D(FramebufferTarget.DrawFramebuffer, FramebufferAttachment.ColorAttachment0, TextureTarget.Texture2D, _stagingTextures[_currentTexture], 0);
TextureView viewConverted = view.Format.IsBgr() ? _renderer.TextureCopy.BgraSwap(view) : view;
GL.FramebufferTexture(
@ -189,12 +148,8 @@ namespace Ryujinx.Graphics.OpenGL
// Set clip control, viewport and the framebuffer to the output to placate overlays and OBS capture.
GL.ClipControl(ClipOrigin.LowerLeft, ClipDepthMode.NegativeOneToOne);
GL.Viewport(0, 0, _width, _height);
GL.BindFramebuffer(FramebufferTarget.Framebuffer, drawFramebuffer);
GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, _stagingFrameBuffer);
swapBuffersCallback((object)_stagingTextures[_currentTexture]);
_currentTexture = ++_currentTexture % _stagingTextures.Length;
swapBuffersCallback();
((Pipeline)_renderer.Pipeline).RestoreClipControl();
((Pipeline)_renderer.Pipeline).RestoreScissor0Enable();
@ -246,14 +201,6 @@ namespace Ryujinx.Graphics.OpenGL
_copyFramebufferHandle = 0;
}
if (_stagingFrameBuffer != 0)
{
GL.DeleteTextures(_stagingTextures.Length, _stagingTextures);
GL.DeleteFramebuffer(_stagingFrameBuffer);
_stagingFrameBuffer = 0;
_stagingTextures = null;
}
}
}
}