From ef24c8983dc3971cd906568d337e49be694ee542 Mon Sep 17 00:00:00 2001 From: riperiperi Date: Tue, 11 Jan 2022 08:37:40 +0000 Subject: [PATCH] Fix adjacent 3d texture slices being detected as Incompatible Overlaps (#2993) This fixes some regressions caused by #2971 which caused rendered 3D texture data to be lost for most slices. Fixes issues with Xenoblade 2's colour grading, probably a ton of other games. This also removes the check from TextureCache, making it the tiniest bit smaller (any win is a win here). --- Ryujinx.Graphics.Gpu/Image/Texture.cs | 9 ++++++++- Ryujinx.Graphics.Gpu/Image/TextureCache.cs | 10 ++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Ryujinx.Graphics.Gpu/Image/Texture.cs b/Ryujinx.Graphics.Gpu/Image/Texture.cs index ca43c4300..eacfa4f52 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 fab38e146..fed89770a 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.