sharpemu/tests/SharpEmu.Libs.Tests/Agc/Gen5StorageImageSwizzleCach...

41 lines
1.7 KiB
C#

// Copyright (C) 2026 SharpEmu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
using SharpEmu.ShaderCompiler;
using SharpEmu.ShaderCompiler.Resources;
using SharpEmu.ShaderCompiler.Tests.Resources;
using Xunit;
namespace SharpEmu.Libs.Tests.Agc;
public sealed class Gen5StorageImageSwizzleCacheTests
{
[Theory]
[InlineData("ImageStore")]
[InlineData("ImageStoreMip")]
public void SpecializationSeparatesStorageImageSwizzles(string opcode)
{
var identity = CreateSpecialization(Gen5ShaderTranslator.IdentityImageDstSelect, opcode);
var rotated = CreateSpecialization(0x9F5u, opcode);
Assert.NotEqual(identity, rotated);
Assert.Equal(Gen5ShaderTranslator.IdentityImageDstSelect, Assert.Single(identity.Images).ShaderSwizzle);
Assert.Equal(0x9F5u, Assert.Single(rotated.Images).ShaderSwizzle);
}
private static ResourceSpecialization CreateSpecialization(uint destinationSelect, string opcode)
{
var program = ResourceTestProgram.Program(
ResourceTestProgram.Image(0, opcode, resourceRegister: 8), ResourceTestProgram.EndProgram(8));
var plan = ResourceTestProgram.Extract(program, userDataCount: 16);
var userData = new uint[16];
userData[8] = 0x20;
userData[9] = 71u << 20;
userData[11] = (9u << 28) | destinationSelect;
var snapshot = new ResourceSnapshot();
var specialization = new ResourceSpecialization();
Assert.True(ResourceMaterializer.Materialize(plan, ResourceTestProgram.Inputs(userData),
ref snapshot, ref specialization, out var failure), failure.ToString());
return specialization;
}
}