From 9834a5ea755d2de36816ed8ae9067a14f11a6782 Mon Sep 17 00:00:00 2001 From: Lander Gallastegi Date: Mon, 14 Oct 2024 23:57:45 +0200 Subject: [PATCH] Add swap handling --- .../renderer_vulkan/liverpool_to_vk.cpp | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp index 188eb03f7..a4cdd35e2 100644 --- a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp +++ b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp @@ -736,6 +736,12 @@ vk::ClearValue ColorBufferClearValue(const AmdGpu::Liverpool::ColorBuffer& color const auto& c0 = color_buffer.clear_word0; const auto& c1 = color_buffer.clear_word1; const auto num_bits = AmdGpu::NumBits(color_buffer.info.format); + auto num_components = AmdGpu::NumComponents(format); + + const bool comp_swap_alt = comp_swap == AmdGpu::Liverpool::ColorBuffer::SwapMode::Alternate || + comp_swap == AmdGpu::Liverpool::ColorBuffer::SwapMode::AlternateReverse; + const bool comp_swap_reverse = comp_swap == AmdGpu::Liverpool::ColorBuffer::SwapMode::StandardReverse || + comp_swap == AmdGpu::Liverpool::ColorBuffer::SwapMode::AlternateReverse; vk::ClearColorValue color{}; @@ -1035,6 +1041,22 @@ vk::ClearValue ColorBufferClearValue(const AmdGpu::Liverpool::ColorBuffer& color break; } + if (num_components == 1) { + color.float32[static_cast(comp_swap)] = color.float32[0]; + } else { + if (comp_swap_alt && num_components == 4) { + std::swap(color.float32[0], color.float32[2]); + } + + if (comp_swap_reverse) { + std::reverse(std::begin(color.float32), std::begin(color.float32) + num_components); + } + + if (comp_swap_alt && num_components != 4) { + std::swap(color.float32[num_components - 1], color.float32[3]); + } + } + return {.color = color}; }