diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2024-05-14 12:06:36 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-14 17:06:36 +0200 |
| commit | 2ef4f92b0793feb7073ed85b7f7dc08dca6f14e9 (patch) | |
| tree | 941a7bd42e1f551e9d7d9fc042c7e96a7bda8aff | |
| parent | 2b6cc4b3536693d222b695295c9db4715ca3f570 (diff) | |
Make TextureGroup.ClearModified thread safe (#6686)
| -rw-r--r-- | src/Ryujinx.Graphics.Gpu/Image/Texture.cs | 2 | ||||
| -rw-r--r-- | src/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs | 18 | ||||
| -rw-r--r-- | src/Ryujinx.Graphics.Gpu/Image/TextureGroupHandle.cs | 6 |
3 files changed, 16 insertions, 10 deletions
diff --git a/src/Ryujinx.Graphics.Gpu/Image/Texture.cs b/src/Ryujinx.Graphics.Gpu/Image/Texture.cs index e67caea8..dde28dbd 100644 --- a/src/Ryujinx.Graphics.Gpu/Image/Texture.cs +++ b/src/Ryujinx.Graphics.Gpu/Image/Texture.cs @@ -390,7 +390,7 @@ namespace Ryujinx.Graphics.Gpu.Image { _views.Remove(texture); - Group.RemoveView(texture); + Group.RemoveView(_views, texture); texture._viewStorage = texture; diff --git a/src/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs b/src/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs index de9c47c9..4e1133d1 100644 --- a/src/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs +++ b/src/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs @@ -88,9 +88,9 @@ namespace Ryujinx.Graphics.Gpu.Image private MultiRange TextureRange => Storage.Range; /// <summary> - /// The views list from the storage texture. + /// The views array from the storage texture. /// </summary> - private List<Texture> _views; + private Texture[] _views; private TextureGroupHandle[] _handles; private bool[] _loadNeeded; @@ -1074,7 +1074,7 @@ namespace Ryujinx.Graphics.Gpu.Image public void UpdateViews(List<Texture> views, Texture texture) { // This is saved to calculate overlapping views for each handle. - _views = views; + _views = views.ToArray(); bool layerViews = _hasLayerViews; bool mipViews = _hasMipViews; @@ -1136,9 +1136,13 @@ namespace Ryujinx.Graphics.Gpu.Image /// <summary> /// Removes a view from the group, removing it from all overlap lists. /// </summary> + /// <param name="views">The views list of the storage texture</param> /// <param name="view">View to remove from the group</param> - public void RemoveView(Texture view) + public void RemoveView(List<Texture> views, Texture view) { + // This is saved to calculate overlapping views for each handle. + _views = views.ToArray(); + int offset = FindOffset(view); foreach (TextureGroupHandle handle in _handles) @@ -1605,9 +1609,11 @@ namespace Ryujinx.Graphics.Gpu.Image Storage.SignalModifiedDirty(); - if (_views != null) + Texture[] views = _views; + + if (views != null) { - foreach (Texture texture in _views) + foreach (Texture texture in views) { texture.SignalModifiedDirty(); } diff --git a/src/Ryujinx.Graphics.Gpu/Image/TextureGroupHandle.cs b/src/Ryujinx.Graphics.Gpu/Image/TextureGroupHandle.cs index 0af6b7ca..860922d5 100644 --- a/src/Ryujinx.Graphics.Gpu/Image/TextureGroupHandle.cs +++ b/src/Ryujinx.Graphics.Gpu/Image/TextureGroupHandle.cs @@ -121,7 +121,7 @@ namespace Ryujinx.Graphics.Gpu.Image public TextureGroupHandle(TextureGroup group, int offset, ulong size, - List<Texture> views, + IEnumerable<Texture> views, int firstLayer, int firstLevel, int baseSlice, @@ -201,8 +201,8 @@ namespace Ryujinx.Graphics.Gpu.Image /// Calculate a list of which views overlap this handle. /// </summary> /// <param name="group">The parent texture group, used to find a view's base CPU VA offset</param> - /// <param name="views">The list of views to search for overlaps</param> - public void RecalculateOverlaps(TextureGroup group, List<Texture> views) + /// <param name="views">The views to search for overlaps</param> + public void RecalculateOverlaps(TextureGroup group, IEnumerable<Texture> views) { // Overlaps can be accessed from the memory tracking signal handler, so access must be atomic. lock (Overlaps) |
