Compare commits

...

18 Commits

Author SHA1 Message Date
mmdurrant 133aa1790f
Merge fd40bd064e into a23d8cb92f 2024-05-10 19:39:48 +09:00
Marco Carvalho a23d8cb92f
Replace "List.ForEach" for "foreach" (#6783)
* Replace "List.ForEach" for "foreach"

* dotnet format

* Update Ptc.cs

* Update GpuContext.cs
2024-05-08 13:53:25 +02:00
mmdurrant fd40bd064e
Merge branch 'master' into mmdurrant/texture-tests 2023-10-30 22:23:07 -06:00
Michael Durrant 5421d9308d Cleanup 2023-10-30 21:14:10 -06:00
mmdurrant eb0e0fedce
Merge pull request #1 from Michael-Dimitrov/mmdurrant/texture-tests
Regenerate .astc and .astc.rgba files for astc decoder tests
2023-10-30 20:42:18 -06:00
Michael Dimitrov 0f00bb1e5c Regenerate .astc and .astc.rgba files for astc decoder tests 2023-10-30 21:44:45 -04:00
Michael Durrant d644d2ba5c whitespace/formatting 2023-07-31 13:55:14 -06:00
Michael Durrant 4ce3f5b29d Merge branch 'master' of https://github.com/Ryujinx/Ryujinx into mmdurrant/texture-tests 2023-07-31 13:32:39 -06:00
Michael Durrant 415315af6a I can't remember what changed here... that's what I get for taking a 10 week break 2023-07-31 13:28:03 -06:00
Michael Durrant f5d415dfef More test cases, debug statements 2023-07-31 13:27:14 -06:00
Michael Durrant 37a43b98db More test cases! Weird stuff! 2023-06-15 23:18:41 -06:00
Michael Durrant 1e01c8b7c2 4x4 test passes, 5x5 test fails 2023-06-15 22:38:01 -06:00
Michael Durrant 3884ffa628 changed threhsold 2023-06-14 10:04:02 -06:00
Michael Durrant 9630691d13 A kinda passing test 2023-06-13 19:32:12 -06:00
Michael Durrant 8be123440d added notes so folks can help me review 2023-06-12 16:14:38 -06:00
Michael Durrant 601c924699 Test WIP, pushing so I can get 2nd look 2023-06-12 11:30:22 -06:00
Michael Durrant 4b40ffdb2d wip 2023-06-11 16:34:07 -06:00
Michael Durrant 18231cc9da wip 2023-06-11 11:27:53 -06:00
35 changed files with 445 additions and 5 deletions

View File

@ -857,8 +857,14 @@ namespace ARMeilleure.Translation.PTC
Stopwatch sw = Stopwatch.StartNew();
threads.ForEach((thread) => thread.Start());
threads.ForEach((thread) => thread.Join());
foreach (var thread in threads)
{
thread.Start();
}
foreach (var thread in threads)
{
thread.Join();
}
threads.Clear();

View File

@ -395,8 +395,14 @@ namespace Ryujinx.Graphics.Gpu
{
Renderer.CreateSync(SyncNumber, strict);
SyncActions.ForEach(action => action.SyncPreAction(syncpoint));
SyncpointActions.ForEach(action => action.SyncPreAction(syncpoint));
foreach (var action in SyncActions)
{
action.SyncPreAction(syncpoint);
}
foreach (var action in SyncpointActions)
{
action.SyncPreAction(syncpoint);
}
SyncNumber++;

View File

@ -0,0 +1,198 @@
using LibHac.FsSystem;
using Microsoft.FSharp.Core;
using Microsoft.VisualBasic;
using NUnit.Framework;
using Ryujinx.Graphics.Gpu;
using Ryujinx.Graphics.Texture.Astc;
using Ryujinx.HLE.HOS.Services.SurfaceFlinger;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ryujinx.Tests.Graphics
{
/**
*
* NOTES
*
* HOW I GENERATED INPUT DATA
* Step 1. Create ASTC-compressed image from sample data.
* *** NOTE This image isn't 2^x evenly sized, it's 768x512 - something that would break down into nice squares, for sure.
* `astcenc-sse2 -cl MoreRocks.png MoreRocks.l-4x4-100.astc 4x4 100`
*
* Step 2. Decompress the data we just created.
* `astcenc-sse2 -dl MoreRocks.l-4x4-100.astc MoreRocks.l-4x4-100.astc.png`
*
* Step 3.
* I used convertio to convert the PNG generated in step 2 to create MorRocks.l-4x4-100.astc.rgba
* WHAT WE DO IN THE TEST BELOW:
* 1. Read the sample image, ASTC-compressed reference, and decompressed reference that we generated above.
* 2. Run TryDecodeToRgba8P on our ASTC-compressed texture.
* 2a. Write the output of step 2 to the disk.
* 3. Assert that the data we decompressed in our method is the same data as the decompressed reference image.
*
*/
public class AstcDecoderTests
{
private string _workingDir;
private string _testDataDir;
[SetUp]
public void SetupFixture()
{
_workingDir = TestContext.CurrentContext.TestDirectory;
_testDataDir = Path.Join(_workingDir, "Graphics", "TestData");
GraphicsConfig.EnableTextureRecompression = false;
}
// public void
[TestCase(4, 4)]
[TestCase(5, 5)]
[TestCase(5, 4)]
[TestCase(6, 5)]
[TestCase(6, 6)]
[TestCase(8, 5)]
[TestCase(8, 6)]
[TestCase(8, 8)]
[TestCase(10, 5)]
[TestCase(10, 6)]
[TestCase(10, 8)]
[TestCase(10, 10)]
[TestCase(12, 10)]
[TestCase(12, 12)]
public void Paramterized_BlockSizes_Test(int blockWidth, int blockHeight)
{
TestContext.Out.WriteLine($"Testing Block Size {blockWidth}x{blockHeight}");
var (encodedRef, decodedRef) = GetTestDataTupleFromShortname("MoreRocks", blockWidth, blockHeight);
int astcHeaderLength = 16;
// skip the header. Decode method doesn't work without this and will return false.
var rawastc = encodedRef[astcHeaderLength..];
int texWidth = 256;
int texHeight = 256;
byte[] outputBuffer = Array.Empty<byte>();
int depth = 1;
int levels = 1;
int layers = 1;
bool succeeded = AstcDecoder.TryDecodeToRgba8P(rawastc, blockWidth, blockHeight, texWidth, texHeight, depth, levels, layers, out outputBuffer);
// The decode function said it was valid data and that it could parse it.
Assert.AreEqual(true, succeeded);
// Length is the same as the one we made w/ ARM's decoder. That's good.
Assert.AreEqual(decodedRef.Length, outputBuffer.Length);
var wordsRef = RgbaWord.FromBytes(decodedRef.ToArray());
var wordsOut = RgbaWord.FromBytes(outputBuffer);
var wordDifferences = wordsRef.Select((x, i) => new { index = i, diff = x.Diff(wordsOut[i]) }).ToArray();
// BUT compression is funny.
// Calculate the byte differences.
var byteDifferences = decodedRef.ToArray().Select((x, i) => new { index = i, delta = x - outputBuffer[i] }).ToList();
var matchCount = byteDifferences.Count(x => x.delta == 0);
var matchPercent = ((float)matchCount / outputBuffer.Length);
var wordUnchangedCount = wordDifferences.Count(x => x.diff.IsZero());
var wordUnchangedPercent = (float)wordUnchangedCount / wordDifferences.Length;
TestContext.Out.WriteLine($"Pixel-wise comparison: {wordUnchangedPercent * 100:F4} ({wordUnchangedCount}/{wordDifferences.Length})");
TestContext.Out.WriteLine($"Byte-wise comparison: {matchPercent * 100:F4} ({matchCount}/{byteDifferences.Count}) were same.");
for (var threshold = 1; threshold < 32; threshold++)
{
var tc = byteDifferences.Count(x => Math.Abs(x.delta) >= threshold);
var tcp = ((float)tc / byteDifferences.Count);
if (tc > 0)
TestContext.Out.WriteLine($"{tcp * 100:F4}% ({tc}/{byteDifferences.Count}) are different by at least {threshold}.");
}
Assert.IsTrue(byteDifferences.All(x => Math.Abs(x.delta) <= 1));
}
/// <summary>
/// Get test data from FS using short name naming convention.
/// </summary>
/// <param name="shortName"></param>
/// <returns></returns>
private (ReadOnlyMemory<byte>, ReadOnlyMemory<byte>) GetTestDataTupleFromShortname(string shortName, int blockWidth, int blockHeight)
{
var encodedRef = GetFileDataFromPath($"{shortName}.l-{blockWidth}x{blockHeight}-100.astc");
// var decodedRef = _getFileDataFromPath($"{shortName}.s4x4.astc.png");
var rgba8raw = GetFileDataFromPath($"{shortName}.l-{blockWidth}x{blockHeight}-100.astc.rgba");
return (encodedRef, rgba8raw);
}
private ReadOnlyMemory<byte> GetFileDataFromPath(string relativeFilePath)
{
var fullPath = Path.Join(_testDataDir, relativeFilePath);
return File.ReadAllBytes(fullPath);
}
private class RgbaWord
{
public byte r;
public byte g;
public byte b;
public byte a;
public bool IsZero()
{
return r == 0 && g == 0 && b == 0 && a == 0;
}
public bool SameAs(RgbaWord other)
{
return this.r == other.r && this.g == other.g && this.b == other.b && this.a == other.a;
}
public RgbaWord Diff(RgbaWord other)
{
/*
Returns 0 for a field if equal and absolute value of diff if not.
*/
return new RgbaWord()
{
r = (byte)Math.Abs(this.r - other.r),
g = (byte)Math.Abs(this.g - other.g),
b = (byte)Math.Abs(this.b - other.b),
a = (byte)Math.Abs(this.a - other.a)
};
}
/// <summary>
/// Return an array of RGBA words given an array of bytes.
/// </summary>
/// <param name="rawBytes"></param>
/// <returns></returns>
public static RgbaWord[] FromBytes(byte[] rawBytes)
{
var result = new List<RgbaWord>();
// rawbytes has to be factor-of-4-sized.
for (var i = 0; i < rawBytes.Length; i += 4)
{
result.Add(new RgbaWord()
{
r = rawBytes[i],
g = rawBytes[i + 1],
b = rawBytes[i + 2],
a = rawBytes[i + 3]
});
}
return result.ToArray();
}
}
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

View File

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
@ -33,6 +33,213 @@
<ProjectReference Include="..\ARMeilleure\ARMeilleure.csproj" />
</ItemGroup>
<ItemGroup>
<None Update="Graphics\TestData\astcenc-sse2.exe">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\diff.png">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\kodim01.l4x4.astc">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\kodim01.l4x4.astc.png">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\kodim01.l4x4.astc.tga">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\kodim01.png">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\kodim01.png.output.png">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\kodim01.rgba">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-10x10-100.astc">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-10x10-100.astc.png">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-10x10-100.astc.png.rgba">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-10x10-100.astc.rgba">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-10x5-100.astc">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-10x5-100.astc.png">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-10x5-100.astc.png.rgba">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-10x5-100.astc.rgba">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-10x6-100.astc">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-10x6-100.astc.png">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-10x6-100.astc.png.rgba">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-10x6-100.astc.rgba">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-10x8-100.astc">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-10x8-100.astc.png">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-10x8-100.astc.png.rgba">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-10x8-100.astc.rgba">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-12x10-100.astc">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-12x10-100.astc.png">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-12x10-100.astc.png.rgba">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-12x10-100.astc.rgba">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-12x12-100.astc">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-12x12-100.astc.png">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-12x12-100.astc.png.rgba">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-12x12-100.astc.rgba">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-4x4-100.astc">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-4x4-100.astc.png">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-4x4-100.astc.png.rgba">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-4x4-100.astc.rgba">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-5x4-100.astc">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-5x4-100.astc.rgba">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-5x5-100.astc">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-5x5-100.astc.png">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-5x5-100.astc.png.rgba">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-5x5-100.astc.rgba">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-6x5-100.astc">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-6x5-100.astc.png">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-6x5-100.astc.png.rgba">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-6x5-100.astc.rgba">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-6x6-100.astc">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-6x6-100.astc.png">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-6x6-100.astc.png.rgba">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-6x6-100.astc.rgba">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-8x5-100.astc">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-8x5-100.astc.png">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-8x5-100.astc.png.rgba">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-8x5-100.astc.rgba">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-8x6-100.astc">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-8x6-100.astc.png">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-8x6-100.astc.png.rgba">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-8x6-100.astc.rgba">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-8x8-100.astc">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-8x8-100.astc.png">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-8x8-100.astc.png.rgba">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.l-8x8-100.astc.rgba">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.s4x4.astc">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.s4x4.astc.png">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.s4x4.astc.png.rgba">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.s4x4.astc.rgba">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="Graphics\TestData\MoreRocks.s4x4.astc.tga">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
</ItemGroup>
<Target Name="CopyUnicorn" AfterTargets="Build">
<ItemGroup>
<UnicornLib Include="..\Ryujinx.Tests.Unicorn\libs\$(TargetOS)\*unicorn.*" />