diff options
author | gdkchan <gab.dark.100@gmail.com> | 2022-06-05 14:06:47 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-05 14:06:47 -0300 |
commit | a3e7bb8eb40b66e61a5a3bfef0b780d0c76a31c1 (patch) | |
tree | 4484bdd53aae7c5b6a0668cd584fafc5e0bd0bc4 /Ryujinx.Graphics.OpenGL/Image/TextureView.cs | |
parent | 2073ba29197be4fcdcd750db7e7b8a36110efd71 (diff) |
Copy dependency for multisample and non-multisample textures (#3382)1.1.139
* Use copy dependency for textures that differs in multisample but are otherwise compatible
* Remove allowMs flag as it's no longer required for correctness, it's just an optimization now
* Dispose intermmediate pool
Diffstat (limited to 'Ryujinx.Graphics.OpenGL/Image/TextureView.cs')
-rw-r--r-- | Ryujinx.Graphics.OpenGL/Image/TextureView.cs | 69 |
1 files changed, 66 insertions, 3 deletions
diff --git a/Ryujinx.Graphics.OpenGL/Image/TextureView.cs b/Ryujinx.Graphics.OpenGL/Image/TextureView.cs index 909a0620..afb9a278 100644 --- a/Ryujinx.Graphics.OpenGL/Image/TextureView.cs +++ b/Ryujinx.Graphics.OpenGL/Image/TextureView.cs @@ -115,14 +115,77 @@ namespace Ryujinx.Graphics.OpenGL.Image { TextureView destinationView = (TextureView)destination; - _renderer.TextureCopy.CopyUnscaled(this, destinationView, 0, firstLayer, 0, firstLevel); + if (destinationView.Target.IsMultisample() || Target.IsMultisample()) + { + Extents2D srcRegion = new Extents2D(0, 0, Width, Height); + Extents2D dstRegion = new Extents2D(0, 0, destinationView.Width, destinationView.Height); + + TextureView intermmediate = _renderer.TextureCopy.IntermmediatePool.GetOrCreateWithAtLeast( + GetIntermmediateTarget(Target), + Info.BlockWidth, + Info.BlockHeight, + Info.BytesPerPixel, + Format, + Width, + Height, + Info.Depth, + Info.Levels); + + GL.Disable(EnableCap.FramebufferSrgb); + + _renderer.TextureCopy.Copy(this, intermmediate, srcRegion, srcRegion, true); + _renderer.TextureCopy.Copy(intermmediate, destinationView, srcRegion, dstRegion, true, 0, firstLayer, 0, firstLevel); + + GL.Enable(EnableCap.FramebufferSrgb); + } + else + { + _renderer.TextureCopy.CopyUnscaled(this, destinationView, 0, firstLayer, 0, firstLevel); + } } public void CopyTo(ITexture destination, int srcLayer, int dstLayer, int srcLevel, int dstLevel) { - TextureView destinationView = (TextureView)destination; + TextureView destinationView = (TextureView)destination; + + if (destinationView.Target.IsMultisample() || Target.IsMultisample()) + { + Extents2D srcRegion = new Extents2D(0, 0, Width, Height); + Extents2D dstRegion = new Extents2D(0, 0, destinationView.Width, destinationView.Height); + + TextureView intermmediate = _renderer.TextureCopy.IntermmediatePool.GetOrCreateWithAtLeast( + GetIntermmediateTarget(Target), + Info.BlockWidth, + Info.BlockHeight, + Info.BytesPerPixel, + Format, + Math.Max(1, Width >> srcLevel), + Math.Max(1, Height >> srcLevel), + 1, + 1); + + GL.Disable(EnableCap.FramebufferSrgb); + + _renderer.TextureCopy.Copy(this, intermmediate, srcRegion, srcRegion, true, srcLayer, 0, srcLevel, 0, 1, 1); + _renderer.TextureCopy.Copy(intermmediate, destinationView, srcRegion, dstRegion, true, 0, dstLayer, 0, dstLevel, 1, 1); + + GL.Enable(EnableCap.FramebufferSrgb); + } + else + { + _renderer.TextureCopy.CopyUnscaled(this, destinationView, srcLayer, dstLayer, srcLevel, dstLevel, 1, 1); + } + } - _renderer.TextureCopy.CopyUnscaled(this, destinationView, srcLayer, dstLayer, srcLevel, dstLevel, 1, 1); + private static Target GetIntermmediateTarget(Target srcTarget) + { + return srcTarget switch + { + Target.Texture2D => Target.Texture2DMultisample, + Target.Texture2DArray => Target.Texture2DMultisampleArray, + Target.Texture2DMultisampleArray => Target.Texture2DArray, + _ => Target.Texture2D + }; } public void CopyTo(ITexture destination, Extents2D srcRegion, Extents2D dstRegion, bool linearFilter) |