diff options
author | gdk <gab.dark.100@gmail.com> | 2019-11-23 23:24:03 -0300 |
---|---|---|
committer | Thog <thog@protonmail.com> | 2020-01-09 02:13:00 +0100 |
commit | 16d88c21fc98cd7302811e142a39d590370e182e (patch) | |
tree | e2c1a457666a11427ca3a26d701720bfe508e0e3 /Ryujinx.Graphics.OpenGL/Window.cs | |
parent | b2b2e046696e9c187cd9d7d4e3e92dc521082fe5 (diff) |
Improved and simplified window texture presentation
Diffstat (limited to 'Ryujinx.Graphics.OpenGL/Window.cs')
-rw-r--r-- | Ryujinx.Graphics.OpenGL/Window.cs | 196 |
1 files changed, 9 insertions, 187 deletions
diff --git a/Ryujinx.Graphics.OpenGL/Window.cs b/Ryujinx.Graphics.OpenGL/Window.cs index 3fe83dd1..cf520ed4 100644 --- a/Ryujinx.Graphics.OpenGL/Window.cs +++ b/Ryujinx.Graphics.OpenGL/Window.cs @@ -1,7 +1,6 @@ using OpenTK.Graphics.OpenGL; using Ryujinx.Graphics.GAL; using System; -using System.Collections.Generic; namespace Ryujinx.Graphics.OpenGL { @@ -13,53 +12,19 @@ namespace Ryujinx.Graphics.OpenGL private int _width; private int _height; - private int _resizeWidth; - private int _resizeHeight; - - private bool _sizeChanged; - - private object _resizeLocker; - - private int _blitFramebufferHandle; private int _copyFramebufferHandle; - private int _screenTextureHandle; - - private TextureReleaseCallback _release; - - private struct PresentationTexture - { - public TextureView Texture { get; } - - public ImageCrop Crop { get; } - - public object Context { get; } - - public PresentationTexture(TextureView texture, ImageCrop crop, object context) - { - Texture = texture; - Crop = crop; - Context = context; - } - } - - private Queue<PresentationTexture> _textures; - public Window() { _width = NativeWidth; _height = NativeHeight; - - _resizeLocker = new object(); - - _textures = new Queue<PresentationTexture>(); } - public void Present() + public void Present(ITexture texture, ImageCrop crop) { - GL.Disable(EnableCap.FramebufferSrgb); + TextureView view = (TextureView)texture; - CopyTextureFromQueue(); + GL.Disable(EnableCap.FramebufferSrgb); int oldReadFramebufferHandle = GL.GetInteger(GetPName.ReadFramebufferBinding); int oldDrawFramebufferHandle = GL.GetInteger(GetPName.DrawFramebufferBinding); @@ -67,52 +32,10 @@ namespace Ryujinx.Graphics.OpenGL GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, 0); GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, GetCopyFramebufferHandleLazy()); - GL.ReadBuffer(ReadBufferMode.ColorAttachment0); - - GL.Clear(ClearBufferMask.ColorBufferBit); - - int windowWidth = _width; - int windowHeight = _height; - - GL.BlitFramebuffer( - 0, - 0, - windowWidth, - windowHeight, - 0, - 0, - windowWidth, - windowHeight, - ClearBufferMask.ColorBufferBit, - BlitFramebufferFilter.Linear); - - GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, oldReadFramebufferHandle); - GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, oldDrawFramebufferHandle); - - GL.Enable(EnableCap.FramebufferSrgb); - } - - private void CopyTextureFromQueue() - { - if (!_textures.TryDequeue(out PresentationTexture presentationTexture)) - { - return; - } - - TextureView texture = presentationTexture.Texture; - ImageCrop crop = presentationTexture.Crop; - object context = presentationTexture.Context; - - int oldReadFramebufferHandle = GL.GetInteger(GetPName.ReadFramebufferBinding); - int oldDrawFramebufferHandle = GL.GetInteger(GetPName.DrawFramebufferBinding); - - GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, GetCopyFramebufferHandleLazy()); - GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, GetBlitFramebufferHandleLazy()); - GL.FramebufferTexture( FramebufferTarget.ReadFramebuffer, FramebufferAttachment.ColorAttachment0, - texture.Handle, + view.Handle, 0); GL.ReadBuffer(ReadBufferMode.ColorAttachment0); @@ -124,7 +47,7 @@ namespace Ryujinx.Graphics.OpenGL if (crop.Left == 0 && crop.Right == 0) { srcX0 = 0; - srcX1 = texture.Width; + srcX1 = view.Width; } else { @@ -135,7 +58,7 @@ namespace Ryujinx.Graphics.OpenGL if (crop.Top == 0 && crop.Bottom == 0) { srcY0 = 0; - srcY1 = texture.Height; + srcY1 = view.Height; } else { @@ -173,126 +96,25 @@ namespace Ryujinx.Graphics.OpenGL GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, oldReadFramebufferHandle); GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, oldDrawFramebufferHandle); - texture.Release(); - - Release(context); - } - - public void QueueTexture(ITexture texture, ImageCrop crop, object context) - { - if (texture == null) - { - Release(context); - - return; - } - - TextureView textureView = (TextureView)texture; - - textureView.Acquire(); - - _textures.Enqueue(new PresentationTexture(textureView, crop, context)); - } - - public void RegisterTextureReleaseCallback(TextureReleaseCallback callback) - { - _release = callback; + GL.Enable(EnableCap.FramebufferSrgb); } public void SetSize(int width, int height) { - lock (_resizeLocker) - { - _resizeWidth = width; - _resizeHeight = height; - - _sizeChanged = true; - } - } - - private void Release(object context) - { - if (_release != null) - { - _release(context); - } - } - - private int GetBlitFramebufferHandleLazy() - { - int handle = _blitFramebufferHandle; - - if (handle == 0) - { - handle = GL.GenFramebuffer(); - - _blitFramebufferHandle = handle; - } - - return handle; + _width = width; + _height = height; } private int GetCopyFramebufferHandleLazy() { int handle = _copyFramebufferHandle; - void GenerateAndBindTexture() - { - int textureHandle = GenerateWindowTexture(); - - GL.BindFramebuffer(FramebufferTarget.Framebuffer, handle); - - GL.FramebufferTexture( - FramebufferTarget.Framebuffer, - FramebufferAttachment.ColorAttachment0, - textureHandle, - 0); - - _screenTextureHandle = textureHandle; - } - if (handle == 0) { handle = GL.GenFramebuffer(); _copyFramebufferHandle = handle; - - GenerateAndBindTexture(); } - else if (_sizeChanged) - { - GL.DeleteTexture(_screenTextureHandle); - - lock (_resizeLocker) - { - _width = _resizeWidth; - _height = _resizeHeight; - - _sizeChanged = false; - } - - GenerateAndBindTexture(); - } - - return handle; - } - - private int GenerateWindowTexture() - { - int handle = GL.GenTexture(); - - GL.BindTexture(TextureTarget.Texture2D, handle); - - GL.TexImage2D( - TextureTarget.Texture2D, - 0, - PixelInternalFormat.Rgba8, - _width, - _height, - 0, - PixelFormat.Rgba, - PixelType.UnsignedByte, - IntPtr.Zero); return handle; } |