diff options
author | gdk <gab.dark.100@gmail.com> | 2019-10-30 20:45:01 -0300 |
---|---|---|
committer | Thog <thog@protonmail.com> | 2020-01-09 02:13:00 +0100 |
commit | d786d8d2b924da7cd116a2eb97d738a9f07b4e43 (patch) | |
tree | 0e84072c554066d20622d156d1394144ed5258bd /Ryujinx.Graphics.Gpu/Image/TextureManager.cs | |
parent | 3bcc395253e020df40763d36ba9401b126b17173 (diff) |
Support copy of slices to 3D textures, remove old 3D render target layered render support, do not delete textures with existing views created from them
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Image/TextureManager.cs')
-rw-r--r-- | Ryujinx.Graphics.Gpu/Image/TextureManager.cs | 67 |
1 files changed, 29 insertions, 38 deletions
diff --git a/Ryujinx.Graphics.Gpu/Image/TextureManager.cs b/Ryujinx.Graphics.Gpu/Image/TextureManager.cs index 7cf79d0f..2db1b4f2 100644 --- a/Ryujinx.Graphics.Gpu/Image/TextureManager.cs +++ b/Ryujinx.Graphics.Gpu/Image/TextureManager.cs @@ -17,13 +17,10 @@ namespace Ryujinx.Graphics.Gpu.Image private TextureBindingsManager _gpBindingsManager; private Texture[] _rtColors; - private Texture _rtColor3D; - - private Texture _rtDepthStencil; + private Texture _rtDepthStencil; private ITexture[] _rtHostColors; - - private ITexture _rtHostDs; + private ITexture _rtHostDs; private RangeList<Texture> _textures; @@ -98,13 +95,6 @@ namespace Ryujinx.Graphics.Gpu.Image public void SetRenderTargetColor(int index, Texture color) { _rtColors[index] = color; - - _rtColor3D = null; - } - - public void SetRenderTargetColor3D(Texture color) - { - _rtColor3D = color; } public void SetRenderTargetDepthStencil(Texture depthStencil) @@ -141,38 +131,21 @@ namespace Ryujinx.Graphics.Gpu.Image anyChanged = true; } - if (_rtColor3D == null) + for (int index = 0; index < _rtColors.Length; index++) { - for (int index = 0; index < _rtColors.Length; index++) - { - ITexture hostTexture = _rtColors[index]?.HostTexture; + ITexture hostTexture = _rtColors[index]?.HostTexture; - if (_rtHostColors[index] != hostTexture) - { - _rtHostColors[index] = hostTexture; - - anyChanged = true; - } - } - - if (anyChanged) - { - _context.Renderer.Pipeline.SetRenderTargets(_rtHostColors, _rtHostDs); - } - } - else - { - if (_rtHostColors[0] != _rtColor3D.HostTexture) + if (_rtHostColors[index] != hostTexture) { - _rtHostColors[0] = _rtColor3D.HostTexture; + _rtHostColors[index] = hostTexture; anyChanged = true; } + } - if (anyChanged) - { - _context.Renderer.Pipeline.SetRenderTargets(_rtColor3D.HostTexture, _rtHostDs); - } + if (anyChanged) + { + _context.Renderer.Pipeline.SetRenderTargets(_rtHostColors, _rtHostDs); } } @@ -447,11 +420,29 @@ namespace Ryujinx.Graphics.Gpu.Image ITexture newView = texture.HostTexture.CreateView(createInfo, firstLayer, firstLevel); - overlap.HostTexture.CopyTo(newView); + overlap.HostTexture.CopyTo(newView, 0, 0); overlap.ReplaceView(texture, overlapInfo, newView); } } + + // If the texture is a 3D texture, we need to additionally copy any slice + // of the 3D texture to the newly created 3D texture. + if (info.Target == Target.Texture3D) + { + foreach (Texture overlap in overlaps) + { + if (texture.IsViewCompatible( + overlap.Info, + overlap.Size, + isCopy: true, + out int firstLayer, + out int firstLevel)) + { + overlap.HostTexture.CopyTo(texture.HostTexture, firstLayer, firstLevel); + } + } + } } // Sampler textures are managed by the texture pool, all other textures |