Compare commits
1 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
da073fce61 |
@@ -360,7 +360,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
|
|
||||||
texture._viewStorage = this;
|
texture._viewStorage = this;
|
||||||
|
|
||||||
Group.UpdateViews(_views);
|
Group.UpdateViews(_views, texture);
|
||||||
|
|
||||||
if (texture.Group != null && texture.Group != Group)
|
if (texture.Group != null && texture.Group != Group)
|
||||||
{
|
{
|
||||||
@@ -384,6 +384,8 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
{
|
{
|
||||||
_views.Remove(texture);
|
_views.Remove(texture);
|
||||||
|
|
||||||
|
Group.RemoveView(texture);
|
||||||
|
|
||||||
texture._viewStorage = texture;
|
texture._viewStorage = texture;
|
||||||
|
|
||||||
DecrementReferenceCount();
|
DecrementReferenceCount();
|
||||||
|
@@ -989,7 +989,8 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
/// Update the views in this texture group, rebuilding the memory tracking if required.
|
/// Update the views in this texture group, rebuilding the memory tracking if required.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="views">The views list of the storage texture</param>
|
/// <param name="views">The views list of the storage texture</param>
|
||||||
public void UpdateViews(List<Texture> views)
|
/// <param name="texture">The texture that has been added, if that is the only change, otherwise null</param>
|
||||||
|
public void UpdateViews(List<Texture> views, Texture texture)
|
||||||
{
|
{
|
||||||
// This is saved to calculate overlapping views for each handle.
|
// This is saved to calculate overlapping views for each handle.
|
||||||
_views = views;
|
_views = views;
|
||||||
@@ -1026,6 +1027,17 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!regionsRebuilt)
|
if (!regionsRebuilt)
|
||||||
|
{
|
||||||
|
if (texture != null)
|
||||||
|
{
|
||||||
|
int offset = FindOffset(texture);
|
||||||
|
|
||||||
|
foreach (TextureGroupHandle handle in _handles)
|
||||||
|
{
|
||||||
|
handle.AddOverlap(offset, texture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
// Must update the overlapping views on all handles, but only if they were not just recreated.
|
// Must update the overlapping views on all handles, but only if they were not just recreated.
|
||||||
|
|
||||||
@@ -1034,10 +1046,26 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
handle.RecalculateOverlaps(this, views);
|
handle.RecalculateOverlaps(this, views);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SignalAllDirty();
|
SignalAllDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Removes a view from the group, removing it from all overlap lists.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="view">View to remove from the group</param>
|
||||||
|
public void RemoveView(Texture view)
|
||||||
|
{
|
||||||
|
int offset = FindOffset(view);
|
||||||
|
|
||||||
|
foreach (TextureGroupHandle handle in _handles)
|
||||||
|
{
|
||||||
|
handle.RemoveOverlap(offset, view);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Inherit handle state from an old set of handles, such as modified and dirty flags.
|
/// Inherit handle state from an old set of handles, such as modified and dirty flags.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@@ -159,6 +159,42 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Adds a single texture view as an overlap if its range overlaps.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="offset">The offset of the view in the group</param>
|
||||||
|
/// <param name="view">The texture to add as an overlap</param>
|
||||||
|
public void AddOverlap(int offset, Texture view)
|
||||||
|
{
|
||||||
|
// Overlaps can be accessed from the memory tracking signal handler, so access must be atomic.
|
||||||
|
|
||||||
|
if (OverlapsWith(offset, (int)view.Size))
|
||||||
|
{
|
||||||
|
lock (Overlaps)
|
||||||
|
{
|
||||||
|
Overlaps.Add(view);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Removes a single texture view as an overlap if its range overlaps.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="offset">The offset of the view in the group</param>
|
||||||
|
/// <param name="view">The texture to add as an overlap</param>
|
||||||
|
public void RemoveOverlap(int offset, Texture view)
|
||||||
|
{
|
||||||
|
// Overlaps can be accessed from the memory tracking signal handler, so access must be atomic.
|
||||||
|
|
||||||
|
if (OverlapsWith(offset, (int)view.Size))
|
||||||
|
{
|
||||||
|
lock (Overlaps)
|
||||||
|
{
|
||||||
|
Overlaps.Remove(view);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Registers a sync action to happen for this handle, and an interim flush action on the tracking handle.
|
/// Registers a sync action to happen for this handle, and an interim flush action on the tracking handle.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
Reference in New Issue
Block a user