diff --git a/src/SharpEmu.Libs/VideoOut/HostVideoOptions.cs b/src/SharpEmu.Libs/VideoOut/HostVideoOptions.cs index 9e84110..b0a8f9c 100644 --- a/src/SharpEmu.Libs/VideoOut/HostVideoOptions.cs +++ b/src/SharpEmu.Libs/VideoOut/HostVideoOptions.cs @@ -67,8 +67,16 @@ public sealed record HostVideoOptions public PerformanceOverlayCorner OverlayCorner { get; init; } = PerformanceOverlayCorner.TopRight; public PerformanceOverlayMode OverlayMode { get; init; } = PerformanceOverlayMode.TitleBar; + // On macOS, Auto keeps guests on SDR output: reporting HDR moves titles onto render paths + // MoltenVK cannot build yet (Silent Hill's HDR switch fails a pipeline compile and then + // crashes inside MoltenVK on every run). --hdr=on still opts in. + internal static bool AutoHdrAllowed => !OperatingSystem.IsMacOS(); + internal bool CanUseHdr(bool displayHdrEnabled, bool surfaceSupportsHdr) => - surfaceSupportsHdr && (HdrMode == HostHdrMode.On || HdrMode == HostHdrMode.Auto && displayHdrEnabled); + CanUseHdr(displayHdrEnabled, surfaceSupportsHdr, AutoHdrAllowed); + + internal bool CanUseHdr(bool displayHdrEnabled, bool surfaceSupportsHdr, bool autoAllowed) => + surfaceSupportsHdr && (HdrMode == HostHdrMode.On || HdrMode == HostHdrMode.Auto && autoAllowed && displayHdrEnabled); public HostVideoOptions Normalize() => this with { diff --git a/tests/SharpEmu.Libs.Tests/VideoOut/VideoOutOutputSupportTests.cs b/tests/SharpEmu.Libs.Tests/VideoOut/VideoOutOutputSupportTests.cs index 8f93a81..cbf2e08 100644 --- a/tests/SharpEmu.Libs.Tests/VideoOut/VideoOutOutputSupportTests.cs +++ b/tests/SharpEmu.Libs.Tests/VideoOut/VideoOutOutputSupportTests.cs @@ -24,6 +24,15 @@ public sealed class VideoOutOutputSupportTests private static readonly ulong MemoryFault = unchecked((ulong)(int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT); + [Theory] + [InlineData(true)] + [InlineData(false)] + public void AutoHdrFollowsThePlatformPolicyButOnAlwaysOptsIn(bool autoAllowed) + { + Assert.Equal(autoAllowed, new HostVideoOptions { HdrMode = HostHdrMode.Auto }.CanUseHdr(true, true, autoAllowed)); + Assert.True(new HostVideoOptions { HdrMode = HostHdrMode.On }.CanUseHdr(true, true, autoAllowed)); + } + [Theory] [InlineData(HostHdrMode.Auto, false, true, false)] [InlineData(HostHdrMode.Auto, true, false, false)] @@ -35,7 +44,7 @@ public sealed class VideoOutOutputSupportTests public void OutputStatusReportsHdrOnlyWhenAllowedAndSupported( HostHdrMode mode, bool displayHdrEnabled, bool surfaceSupportsHdr, bool expectedHdr) { - var supported = new HostVideoOptions { HdrMode = mode }.CanUseHdr(displayHdrEnabled, surfaceSupportsHdr); + var supported = new HostVideoOptions { HdrMode = mode }.CanUseHdr(displayHdrEnabled, surfaceSupportsHdr, autoAllowed: true); Assert.Equal(expectedHdr, supported); var bytes = Enumerable.Repeat((byte)0xA5, 0x32).ToArray();