sharpemu/tests/SharpEmu.Libs.Tests/VideoOut/VulkanStorageFeedbackTarget...

82 lines
3.1 KiB
C#

// Copyright (C) 2026 SharpEmu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
using SharpEmu.Libs.Gpu;
using SharpEmu.Libs.VideoOut;
using Xunit;
namespace SharpEmu.Libs.Tests.VideoOut;
public sealed class VulkanStorageFeedbackTargetResolverTests
{
private const ulong TargetAddress = 0x1044_500000;
[Fact]
public void ZeroWriteSingleTargetAliasUsesCompatibilityAttachment()
{
var target = Target();
var supported = VulkanStorageFeedbackTargetResolver.TryResolve(
[target], [Texture(TargetAddress, true)], [Blend(0)],
out var resolved, out var usedCompatibilityAttachment, out var unsupportedAddress);
Assert.True(supported);
Assert.True(usedCompatibilityAttachment);
Assert.Equal(0UL, unsupportedAddress);
Assert.Equal(0UL, resolved[0].Address);
Assert.Equal(target.Width, resolved[0].Width);
Assert.Equal(target.Height, resolved[0].Height);
Assert.Equal(target.Format, resolved[0].Format);
Assert.Equal(target.NumberType, resolved[0].NumberType);
}
[Fact]
public void WritableColorAliasRemainsUnsupported()
{
var supported = VulkanStorageFeedbackTargetResolver.TryResolve(
[Target()], [Texture(TargetAddress, true)], [Blend(0xF)],
out var resolved, out var usedCompatibilityAttachment, out var unsupportedAddress);
Assert.False(supported);
Assert.False(usedCompatibilityAttachment);
Assert.Equal(TargetAddress, unsupportedAddress);
Assert.Equal(TargetAddress, resolved[0].Address);
}
[Fact]
public void NonStorageAliasDoesNotNeedCompatibilityAttachment()
{
var supported = VulkanStorageFeedbackTargetResolver.TryResolve(
[Target()], [Texture(TargetAddress, false)], [Blend(0xF)],
out var resolved, out var usedCompatibilityAttachment, out var unsupportedAddress);
Assert.True(supported);
Assert.False(usedCompatibilityAttachment);
Assert.Equal(0UL, unsupportedAddress);
Assert.Equal(TargetAddress, resolved[0].Address);
}
[Fact]
public void AliasedMrtRemainsUnsupported()
{
const ulong otherAddress = 0x1042_F00000;
var supported = VulkanStorageFeedbackTargetResolver.TryResolve(
[Target(), Target(otherAddress)],
[Texture(TargetAddress, true)], [Blend(0), Blend(0)],
out _, out var usedCompatibilityAttachment, out var unsupportedAddress);
Assert.False(supported);
Assert.False(usedCompatibilityAttachment);
Assert.Equal(TargetAddress, unsupportedAddress);
}
private static GuestRenderTarget Target(ulong address = TargetAddress) =>
new(address, 2048, 2048, Format: 10, NumberType: 6);
private static GuestDrawTexture Texture(ulong address, bool isStorage) =>
new(address, 2048, 2048, Format: 10, NumberType: 0, RgbaPixels: [],
IsFallback: false, IsStorage: isStorage);
private static GuestBlendState Blend(uint writeMask) =>
GuestBlendState.Default with { WriteMask = writeMask };
}