Vulkan: fix guest storage image and render-state handling (#332)

This commit is contained in:
lilp
2026-07-17 20:54:52 -03:00
committed by GitHub
parent b479dc0466
commit c9d018db8e
8 changed files with 806 additions and 147 deletions
@@ -0,0 +1,67 @@
// Copyright (C) 2026 SharpEmu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
using SharpEmu.Libs.Gpu;
namespace SharpEmu.Libs.VideoOut;
internal enum GuestDepthExtentResolutionKind
{
Exact,
TextureAlias,
StaleOneByOne,
Mismatch,
}
internal readonly record struct GuestDepthExtentResolution(
GuestDepthExtentResolutionKind Kind,
uint Width,
uint Height)
{
public bool IsUsable => Kind != GuestDepthExtentResolutionKind.Mismatch;
}
internal static class GuestDepthExtentResolver
{
public static GuestDepthExtentResolution Resolve(
GuestDepthTarget depth,
uint colorWidth,
uint colorHeight,
IReadOnlyList<GuestDrawTexture> textures)
{
if (depth.Width >= colorWidth && depth.Height >= colorHeight)
{
return new GuestDepthExtentResolution(
GuestDepthExtentResolutionKind.Exact,
depth.Width,
depth.Height);
}
var matchingTexture = textures.FirstOrDefault(texture =>
(texture.Address == depth.Address ||
texture.Address == depth.ReadAddress ||
texture.Address == depth.WriteAddress) &&
texture.Width >= colorWidth &&
texture.Height >= colorHeight);
if (matchingTexture is not null)
{
return new GuestDepthExtentResolution(
GuestDepthExtentResolutionKind.TextureAlias,
matchingTexture.Width,
matchingTexture.Height);
}
if (depth.Width == 1 && depth.Height == 1)
{
return new GuestDepthExtentResolution(
GuestDepthExtentResolutionKind.StaleOneByOne,
colorWidth,
colorHeight);
}
return new GuestDepthExtentResolution(
GuestDepthExtentResolutionKind.Mismatch,
depth.Width,
depth.Height);
}
}