From cb42ea21be2334f46bc58623e3c286bbcf70ec59 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Mon, 13 Jan 2025 14:46:10 +0100 Subject: [PATCH] [dxvk] Adjust swapchain format preferences in various cases For sRGB, using a native sRGB format allows the swapchain blitter to use a more efficient code path for drawing the HUD. Also allow RGB9E5 for sRGB and HDR10. --- src/dxvk/dxvk_presenter.cpp | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/dxvk/dxvk_presenter.cpp b/src/dxvk/dxvk_presenter.cpp index 9b96fe64f..ec76ba901 100644 --- a/src/dxvk/dxvk_presenter.cpp +++ b/src/dxvk/dxvk_presenter.cpp @@ -710,7 +710,13 @@ namespace dxvk { const VkSurfaceFormatKHR* pSupported, VkColorSpaceKHR colorSpace, VkFormat format) { - static const std::array srgbFormatList = { + static const std::array, 3> srgbFormatMap = {{ + { VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_R8G8B8A8_SRGB }, + { VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_B8G8R8A8_SRGB }, + { VK_FORMAT_A8B8G8R8_UNORM_PACK32, VK_FORMAT_A8B8G8R8_SRGB_PACK32 }, + }}; + + static const std::array srgbFormatList = { VK_FORMAT_B5G5R5A1_UNORM_PACK16, VK_FORMAT_R5G5B5A1_UNORM_PACK16, VK_FORMAT_A1B5G5R5_UNORM_PACK16_KHR, @@ -719,11 +725,9 @@ namespace dxvk { VK_FORMAT_R8G8B8A8_SRGB, VK_FORMAT_B8G8R8A8_SRGB, VK_FORMAT_A8B8G8R8_SRGB_PACK32, - VK_FORMAT_R8G8B8A8_UNORM, - VK_FORMAT_B8G8R8A8_UNORM, - VK_FORMAT_A8B8G8R8_UNORM_PACK32, VK_FORMAT_A2R10G10B10_UNORM_PACK32, VK_FORMAT_A2B10G10R10_UNORM_PACK32, + VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, VK_FORMAT_R16G16B16A16_UNORM, VK_FORMAT_R16G16B16A16_SFLOAT, }; @@ -731,9 +735,9 @@ namespace dxvk { static const std::array hdr10FormatList = { VK_FORMAT_A2R10G10B10_UNORM_PACK32, VK_FORMAT_A2B10G10R10_UNORM_PACK32, + VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, VK_FORMAT_R16G16B16A16_UNORM, VK_FORMAT_R16G16B16A16_SFLOAT, - VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, }; static const std::array scRGBFormatList = { @@ -749,6 +753,15 @@ namespace dxvk { scRGBFormatList.size(), scRGBFormatList.data() }, }}; + // For the sRGB color space, always prefer an actual sRGB + // format so that the blitter can use alpha blending. + if (colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) { + for (const auto& e : srgbFormatMap) { + if (format == e.first) + format = e.second; + } + } + // If the desired format is supported natively, use it VkFormat fallback = VK_FORMAT_UNDEFINED;