diff --git a/Ryujinx.Graphics.Gpu/Image/Texture.cs b/Ryujinx.Graphics.Gpu/Image/Texture.cs
index ca43c4300f..eacfa4f529 100644
--- a/Ryujinx.Graphics.Gpu/Image/Texture.cs
+++ b/Ryujinx.Graphics.Gpu/Image/Texture.cs
@@ -1382,9 +1382,16 @@ namespace Ryujinx.Graphics.Gpu.Image
/// Determine if any of this texture's data overlaps with another.
///
/// The texture to check against
+ /// The view compatibility of the two textures
/// True if any slice of the textures overlap, false otherwise
- public bool DataOverlaps(Texture texture)
+ public bool DataOverlaps(Texture texture, TextureViewCompatibility compatibility)
{
+ if (compatibility == TextureViewCompatibility.LayoutIncompatible && Info.GobBlocksInZ > 1 && Info.GobBlocksInZ == texture.Info.GobBlocksInZ)
+ {
+ // Allow overlapping slices of layout compatible 3D textures with matching GobBlocksInZ, as they are interleaved.
+ return false;
+ }
+
if (texture._sizeInfo.AllOffsets.Length == 1 && _sizeInfo.AllOffsets.Length == 1)
{
return Range.OverlapsWith(texture.Range);
diff --git a/Ryujinx.Graphics.Gpu/Image/TextureCache.cs b/Ryujinx.Graphics.Gpu/Image/TextureCache.cs
index fab38e1468..fed89770ab 100644
--- a/Ryujinx.Graphics.Gpu/Image/TextureCache.cs
+++ b/Ryujinx.Graphics.Gpu/Image/TextureCache.cs
@@ -582,7 +582,7 @@ namespace Ryujinx.Graphics.Gpu.Image
if (oInfo.Compatibility <= TextureViewCompatibility.LayoutIncompatible)
{
- if (!overlap.IsView && texture.DataOverlaps(overlap))
+ if (!overlap.IsView && texture.DataOverlaps(overlap, oInfo.Compatibility))
{
texture.Group.RegisterIncompatibleOverlap(new TextureIncompatibleOverlap(overlap.Group, oInfo.Compatibility), true);
}
@@ -657,7 +657,7 @@ namespace Ryujinx.Graphics.Gpu.Image
}
else
{
- bool dataOverlaps = texture.DataOverlaps(overlap);
+ bool dataOverlaps = texture.DataOverlaps(overlap, compatibility);
if (!overlap.IsView && dataOverlaps && !incompatibleOverlaps.Exists(incompatible => incompatible.Group == overlap.Group))
{
@@ -676,12 +676,6 @@ namespace Ryujinx.Graphics.Gpu.Image
continue;
}
- if (info.GobBlocksInZ > 1 && info.GobBlocksInZ == overlap.Info.GobBlocksInZ)
- {
- // Allow overlapping slices of 3D textures. Could be improved in future by making sure the textures don't overlap.
- continue;
- }
-
// The overlap texture is going to contain garbage data after we draw, or is generally incompatible.
// The texture group will obtain copy dependencies for any subresources that are compatible between the two textures,
// but sometimes its data must be flushed regardless.