aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Vulkan/Window.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Vulkan/Window.cs')
-rw-r--r--src/Ryujinx.Graphics.Vulkan/Window.cs49
1 files changed, 37 insertions, 12 deletions
diff --git a/src/Ryujinx.Graphics.Vulkan/Window.cs b/src/Ryujinx.Graphics.Vulkan/Window.cs
index 6027962c..2d0ad664 100644
--- a/src/Ryujinx.Graphics.Vulkan/Window.cs
+++ b/src/Ryujinx.Graphics.Vulkan/Window.cs
@@ -28,7 +28,7 @@ namespace Ryujinx.Graphics.Vulkan
private int _width;
private int _height;
private bool _vsyncEnabled;
- private bool _vsyncModeChanged;
+ private bool _swapchainIsDirty;
private VkFormat _format;
private AntiAliasing _currentAntiAliasing;
private bool _updateEffect;
@@ -38,6 +38,7 @@ namespace Ryujinx.Graphics.Vulkan
private float _scalingFilterLevel;
private bool _updateScalingFilter;
private ScalingFilter _currentScalingFilter;
+ private bool _colorSpacePassthroughEnabled;
public unsafe Window(VulkanRenderer gd, SurfaceKHR surface, PhysicalDevice physicalDevice, Device device)
{
@@ -60,7 +61,7 @@ namespace Ryujinx.Graphics.Vulkan
private void RecreateSwapchain()
{
var oldSwapchain = _swapchain;
- _vsyncModeChanged = false;
+ _swapchainIsDirty = false;
for (int i = 0; i < _swapchainImageViews.Length; i++)
{
@@ -106,7 +107,7 @@ namespace Ryujinx.Graphics.Vulkan
imageCount = capabilities.MaxImageCount;
}
- var surfaceFormat = ChooseSwapSurfaceFormat(surfaceFormats);
+ var surfaceFormat = ChooseSwapSurfaceFormat(surfaceFormats, _colorSpacePassthroughEnabled);
var extent = ChooseSwapExtent(capabilities);
@@ -178,22 +179,40 @@ namespace Ryujinx.Graphics.Vulkan
return new Auto<DisposableImageView>(new DisposableImageView(_gd.Api, _device, imageView));
}
- private static SurfaceFormatKHR ChooseSwapSurfaceFormat(SurfaceFormatKHR[] availableFormats)
+ private static SurfaceFormatKHR ChooseSwapSurfaceFormat(SurfaceFormatKHR[] availableFormats, bool colorSpacePassthroughEnabled)
{
if (availableFormats.Length == 1 && availableFormats[0].Format == VkFormat.Undefined)
{
return new SurfaceFormatKHR(VkFormat.B8G8R8A8Unorm, ColorSpaceKHR.PaceSrgbNonlinearKhr);
}
-
- foreach (var format in availableFormats)
+ var formatToReturn = availableFormats[0];
+ if (colorSpacePassthroughEnabled)
{
- if (format.Format == VkFormat.B8G8R8A8Unorm && format.ColorSpace == ColorSpaceKHR.PaceSrgbNonlinearKhr)
+ foreach (var format in availableFormats)
{
- return format;
+ if (format.Format == VkFormat.B8G8R8A8Unorm && format.ColorSpace == ColorSpaceKHR.SpacePassThroughExt)
+ {
+ formatToReturn = format;
+ break;
+ }
+ else if (format.Format == VkFormat.B8G8R8A8Unorm && format.ColorSpace == ColorSpaceKHR.PaceSrgbNonlinearKhr)
+ {
+ formatToReturn = format;
+ }
}
}
-
- return availableFormats[0];
+ else
+ {
+ foreach (var format in availableFormats)
+ {
+ if (format.Format == VkFormat.B8G8R8A8Unorm && format.ColorSpace == ColorSpaceKHR.PaceSrgbNonlinearKhr)
+ {
+ formatToReturn = format;
+ break;
+ }
+ }
+ }
+ return formatToReturn;
}
private static CompositeAlphaFlagsKHR ChooseCompositeAlpha(CompositeAlphaFlagsKHR supportedFlags)
@@ -259,7 +278,7 @@ namespace Ryujinx.Graphics.Vulkan
if (acquireResult == Result.ErrorOutOfDateKhr ||
acquireResult == Result.SuboptimalKhr ||
- _vsyncModeChanged)
+ _swapchainIsDirty)
{
RecreateSwapchain();
}
@@ -443,6 +462,12 @@ namespace Ryujinx.Graphics.Vulkan
_updateScalingFilter = true;
}
+ public override void SetColorSpacePassthrough(bool colorSpacePassthroughEnabled)
+ {
+ _colorSpacePassthroughEnabled = colorSpacePassthroughEnabled;
+ _swapchainIsDirty = true;
+ }
+
private void UpdateEffect()
{
if (_updateEffect)
@@ -559,7 +584,7 @@ namespace Ryujinx.Graphics.Vulkan
public override void ChangeVSyncMode(bool vsyncEnabled)
{
_vsyncEnabled = vsyncEnabled;
- _vsyncModeChanged = true;
+ _swapchainIsDirty = true;
}
protected virtual void Dispose(bool disposing)