diff --git a/tests/SharpEmu.Libs.Tests/Gpu/Images/GuestImageCacheTests.Metadata.cs b/tests/SharpEmu.Libs.Tests/Gpu/Images/GuestImageCacheTests.Metadata.cs index 6f8a042..b0438dc 100644 --- a/tests/SharpEmu.Libs.Tests/Gpu/Images/GuestImageCacheTests.Metadata.cs +++ b/tests/SharpEmu.Libs.Tests/Gpu/Images/GuestImageCacheTests.Metadata.cs @@ -196,6 +196,41 @@ public sealed partial class GuestImageCacheTests harness.Shutdown(); } + [Fact] + public void ATextureRequestWithDcc_GivesAnImageFoundWithoutMetadataItsDccMetadata() + { + if (!GatePrerequisites.Ready(_vulkan)) return; + using var harness = new CacheHarness(_vulkan); + const ulong SliceSize = 0x1000; + var address = harness.MapBacked(0x20000, ReadWrite); + var metadata = address + 0x10000; + var plain = LinearRequest(address + 0xc000, 4, Format.R8G8B8A8Unorm, GuestPixelFormat.Bits8_8_8_8UNorm, GuestImageType.Color2D, new Extent3D(1, 1, 1), 1, 4, 1); + var imageId = harness.Find(ref plain); + var image = harness.Image(imageId); + image.Description.TileMode = GuestTileMode.RenderTarget; + Assert.Equal(MetadataKind.None, image.Description.Metadata.Kind); + harness.Write(metadata, Enumerable.Repeat((byte)0x55, (int)SliceSize).ToArray()); + harness.Worker.Run(() => + { + Assert.NotNull(harness.Cache.ObtainBuffer(metadata, SliceSize, isWritten: true).Buffer); + harness.Cache.FillBuffer(metadata, SliceSize, 0, isGds: false); + }); + Assert.True(harness.Cache.HasGpuDirtyBytes(metadata, SliceSize)); + + var compressed = plain; + compressed.Description.TileMode = GuestTileMode.RenderTarget; + compressed.Description.Metadata.Kind = MetadataKind.Dcc; + compressed.Description.Metadata.Range = new GuestSpan(metadata, 0); + Assert.Equal(imageId, harness.Find(ref compressed)); + Assert.Equal(MetadataKind.Dcc, image.Description.Metadata.Kind); + Assert.Equal(metadata, image.Description.Metadata.Range.Address); + Assert.Equal(SliceSize, image.Description.DccSliceSize); + Assert.False(harness.Cache.HasGpuDirtyBytes(metadata, SliceSize)); + Assert.True(harness.Images.TryReadGuestDccClear(metadata, SliceSize, 0, out _, out var code)); + Assert.Equal(0x00, code); + harness.Shutdown(); + } + [Fact] public void GuestDccClear_ReadsOnlyUniformClearSlices() {