summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ameerj2021-08-29 01:12:17 -0400
committerGravatar ameerj2021-08-29 02:03:35 -0400
commit3c65c8580f80445f0501d02c8d5590198a50b3b3 (patch)
tree131fe5504c9dfaf60eaf9ac77dc6f2b7898607f3 /src
parentMerge pull request #6919 from ameerj/vk-int8-capability (diff)
downloadyuzu-3c65c8580f80445f0501d02c8d5590198a50b3b3.tar.gz
yuzu-3c65c8580f80445f0501d02c8d5590198a50b3b3.tar.xz
yuzu-3c65c8580f80445f0501d02c8d5590198a50b3b3.zip
vk_swapchain: Prefer linear swapchain format when presenting sRGB images
Fixes broken sRGB when presenting from a secondary GPU.
Diffstat (limited to '')
-rw-r--r--src/video_core/renderer_vulkan/vk_blit_screen.cpp2
-rw-r--r--src/video_core/renderer_vulkan/vk_swapchain.cpp13
-rw-r--r--src/video_core/renderer_vulkan/vk_swapchain.h6
3 files changed, 10 insertions, 11 deletions
diff --git a/src/video_core/renderer_vulkan/vk_blit_screen.cpp b/src/video_core/renderer_vulkan/vk_blit_screen.cpp
index 5c43b8acf..3a78c9daa 100644
--- a/src/video_core/renderer_vulkan/vk_blit_screen.cpp
+++ b/src/video_core/renderer_vulkan/vk_blit_screen.cpp
@@ -356,7 +356,7 @@ void VKBlitScreen::CreateDescriptorPool() {
356void VKBlitScreen::CreateRenderPass() { 356void VKBlitScreen::CreateRenderPass() {
357 const VkAttachmentDescription color_attachment{ 357 const VkAttachmentDescription color_attachment{
358 .flags = 0, 358 .flags = 0,
359 .format = swapchain.GetImageFormat(), 359 .format = swapchain.GetImageViewFormat(),
360 .samples = VK_SAMPLE_COUNT_1_BIT, 360 .samples = VK_SAMPLE_COUNT_1_BIT,
361 .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR, 361 .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR,
362 .storeOp = VK_ATTACHMENT_STORE_OP_STORE, 362 .storeOp = VK_ATTACHMENT_STORE_OP_STORE,
diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp
index d990eefba..d0a731660 100644
--- a/src/video_core/renderer_vulkan/vk_swapchain.cpp
+++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp
@@ -20,16 +20,15 @@ namespace Vulkan {
20 20
21namespace { 21namespace {
22 22
23VkSurfaceFormatKHR ChooseSwapSurfaceFormat(vk::Span<VkSurfaceFormatKHR> formats, bool srgb) { 23VkSurfaceFormatKHR ChooseSwapSurfaceFormat(vk::Span<VkSurfaceFormatKHR> formats) {
24 if (formats.size() == 1 && formats[0].format == VK_FORMAT_UNDEFINED) { 24 if (formats.size() == 1 && formats[0].format == VK_FORMAT_UNDEFINED) {
25 VkSurfaceFormatKHR format; 25 VkSurfaceFormatKHR format;
26 format.format = VK_FORMAT_B8G8R8A8_UNORM; 26 format.format = VK_FORMAT_B8G8R8A8_UNORM;
27 format.colorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; 27 format.colorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
28 return format; 28 return format;
29 } 29 }
30 const auto& found = std::find_if(formats.begin(), formats.end(), [srgb](const auto& format) { 30 const auto& found = std::find_if(formats.begin(), formats.end(), [](const auto& format) {
31 const auto request_format = srgb ? VK_FORMAT_B8G8R8A8_SRGB : VK_FORMAT_B8G8R8A8_UNORM; 31 return format.format == VK_FORMAT_B8G8R8A8_UNORM &&
32 return format.format == request_format &&
33 format.colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; 32 format.colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
34 }); 33 });
35 return found != formats.end() ? *found : formats[0]; 34 return found != formats.end() ? *found : formats[0];
@@ -145,7 +144,7 @@ void VKSwapchain::CreateSwapchain(const VkSurfaceCapabilitiesKHR& capabilities,
145 const auto formats{physical_device.GetSurfaceFormatsKHR(surface)}; 144 const auto formats{physical_device.GetSurfaceFormatsKHR(surface)};
146 const auto present_modes{physical_device.GetSurfacePresentModesKHR(surface)}; 145 const auto present_modes{physical_device.GetSurfacePresentModesKHR(surface)};
147 146
148 const VkSurfaceFormatKHR surface_format{ChooseSwapSurfaceFormat(formats, srgb)}; 147 const VkSurfaceFormatKHR surface_format{ChooseSwapSurfaceFormat(formats)};
149 const VkPresentModeKHR present_mode{ChooseSwapPresentMode(present_modes)}; 148 const VkPresentModeKHR present_mode{ChooseSwapPresentMode(present_modes)};
150 149
151 u32 requested_image_count{capabilities.minImageCount + 1}; 150 u32 requested_image_count{capabilities.minImageCount + 1};
@@ -191,7 +190,7 @@ void VKSwapchain::CreateSwapchain(const VkSurfaceCapabilitiesKHR& capabilities,
191 190
192 images = swapchain.GetImages(); 191 images = swapchain.GetImages();
193 image_count = static_cast<u32>(images.size()); 192 image_count = static_cast<u32>(images.size());
194 image_format = surface_format.format; 193 image_view_format = srgb ? VK_FORMAT_B8G8R8A8_SRGB : VK_FORMAT_B8G8R8A8_UNORM;
195} 194}
196 195
197void VKSwapchain::CreateSemaphores() { 196void VKSwapchain::CreateSemaphores() {
@@ -207,7 +206,7 @@ void VKSwapchain::CreateImageViews() {
207 .flags = 0, 206 .flags = 0,
208 .image = {}, 207 .image = {},
209 .viewType = VK_IMAGE_VIEW_TYPE_2D, 208 .viewType = VK_IMAGE_VIEW_TYPE_2D,
210 .format = image_format, 209 .format = image_view_format,
211 .components = 210 .components =
212 { 211 {
213 .r = VK_COMPONENT_SWIZZLE_IDENTITY, 212 .r = VK_COMPONENT_SWIZZLE_IDENTITY,
diff --git a/src/video_core/renderer_vulkan/vk_swapchain.h b/src/video_core/renderer_vulkan/vk_swapchain.h
index 35c2cdc14..cd472dd0a 100644
--- a/src/video_core/renderer_vulkan/vk_swapchain.h
+++ b/src/video_core/renderer_vulkan/vk_swapchain.h
@@ -68,8 +68,8 @@ public:
68 return *image_views[index]; 68 return *image_views[index];
69 } 69 }
70 70
71 VkFormat GetImageFormat() const { 71 VkFormat GetImageViewFormat() const {
72 return image_format; 72 return image_view_format;
73 } 73 }
74 74
75private: 75private:
@@ -96,7 +96,7 @@ private:
96 u32 image_index{}; 96 u32 image_index{};
97 u32 frame_index{}; 97 u32 frame_index{};
98 98
99 VkFormat image_format{}; 99 VkFormat image_view_format{};
100 VkExtent2D extent{}; 100 VkExtent2D extent{};
101 101
102 bool current_srgb{}; 102 bool current_srgb{};