aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Gpu
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Gpu')
-rw-r--r--src/Ryujinx.Graphics.Gpu/Image/Texture.cs2
-rw-r--r--src/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs18
-rw-r--r--src/Ryujinx.Graphics.Gpu/Image/TextureGroupHandle.cs6
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)