diff --git a/src/Ryujinx.Graphics.Gpu/Image/Texture.cs b/src/Ryujinx.Graphics.Gpu/Image/Texture.cs
index e67caea81..dde28dbd7 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 de9c47c97..4e1133d1a 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;
///
- /// The views list from the storage texture.
+ /// The views array from the storage texture.
///
- private List _views;
+ private Texture[] _views;
private TextureGroupHandle[] _handles;
private bool[] _loadNeeded;
@@ -1074,7 +1074,7 @@ namespace Ryujinx.Graphics.Gpu.Image
public void UpdateViews(List 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
///
/// Removes a view from the group, removing it from all overlap lists.
///
+ /// The views list of the storage texture
/// View to remove from the group
- public void RemoveView(Texture view)
+ public void RemoveView(List 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 0af6b7ca8..860922d59 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 views,
+ IEnumerable 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.
///
/// The parent texture group, used to find a view's base CPU VA offset
- /// The list of views to search for overlaps
- public void RecalculateOverlaps(TextureGroup group, List views)
+ /// The views to search for overlaps
+ public void RecalculateOverlaps(TextureGroup group, IEnumerable views)
{
// Overlaps can be accessed from the memory tracking signal handler, so access must be atomic.
lock (Overlaps)