sharpemu/tests/SharpEmu.ShaderCompiler.Tests/Resources/VectorCompareResourceTests.cs

69 lines
2.6 KiB
C#

// Copyright (C) 2026 SharpEmu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
using SharpEmu.ShaderCompiler.Resources;
using Xunit;
using static SharpEmu.ShaderCompiler.Tests.Resources.ResourceTestProgram;
namespace SharpEmu.ShaderCompiler.Tests.Resources;
public sealed class VectorCompareResourceTests
{
[Fact]
public void ExecutionComparePreservesResourcePointerWithUnknownVectorInputs()
{
var program = Program(
ScalarLoad(0, 0, 106, count: 2),
Vopc(8, "VCmpxLtU32", Gen5Operand.Vector(0), 1),
Branch(12, "SCbranchExecz", 4),
ScalarLoad(16, 106, 8, count: 4),
BufferLoad(24, 8),
EndProgram(32));
var plan = Extract(program, userDataCount: 2);
var memory = new TestWordMemory
{
Base = 0x2_00001000,
Words = [0x1010, 2, 0, 0, 0x3000, 0, 256, 0],
};
var snapshot = new ResourceSnapshot();
var specialization = new ResourceSpecialization();
Assert.True(ResourceMaterializer.Materialize(plan, Inputs([0x1000, 2], memory.Read),
ref snapshot, ref specialization, out var failure));
Assert.Equal(ResourceMaterializationFailure.None, failure);
Assert.Equal(new uint[] { 0x3000, 0, 256, 0 }, Assert.Single(snapshot.Buffers));
}
[Theory]
[InlineData(false, false)]
[InlineData(false, true)]
[InlineData(true, false)]
[InlineData(true, true)]
public void CompareUpdatesOnlyItsDestinationMask(bool updatesExecutionMask, bool comparisonPasses)
{
var program = Program(
MoveScalar(0, 106, 0x12345678),
MoveScalar(4, 107, 0x87654321),
MoveVector(8, 0, comparisonPasses ? 2u : 0u),
Vopc(12, updatesExecutionMask ? "VCmpxLtU32" : "VCmpLtU32", Operand(1), 0),
MoveScalarRegister(16, 8, 106),
MoveScalarRegister(20, 9, 107),
MoveScalarRegister(24, 10, 126),
MoveScalarRegister(28, 11, 127),
BufferLoad(32, 8),
EndProgram(40));
var plan = Extract(program, userDataCount: 0);
Assert.True(RuntimeValueEvaluator.EvaluateDescriptorSource(plan,
Assert.Single(plan.Info.Buffers).Source, Inputs([]), out var descriptor));
var comparisonMask = comparisonPasses ? 1u : 0u;
Assert.Equal(new uint[]
{
updatesExecutionMask ? 0x12345678u : comparisonMask,
updatesExecutionMask ? 0x87654321u : 0u,
updatesExecutionMask ? comparisonMask : uint.MaxValue,
0,
}, descriptor.Dwords);
}
}