diff options
| author | 2021-04-25 03:14:43 -0300 | |
|---|---|---|
| committer | 2021-04-25 03:14:43 -0300 | |
| commit | 2ff39f6fdc1be6e1ed83b384bb9773049061e6b9 (patch) | |
| tree | 103338558d78b74530df72d70914b40df8a4762f | |
| parent | Merge pull request #6234 from Morph1984/stub-am (diff) | |
| parent | vk_texture_cache: Swap R and B channels of color flipped format (diff) | |
| download | yuzu-2ff39f6fdc1be6e1ed83b384bb9773049061e6b9.tar.gz yuzu-2ff39f6fdc1be6e1ed83b384bb9773049061e6b9.tar.xz yuzu-2ff39f6fdc1be6e1ed83b384bb9773049061e6b9.zip | |
Merge pull request #6238 from ameerj/vk-bgr-fix
vk_texture_cache: Swap R and B channels of color flipped format
Diffstat (limited to '')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.cpp | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index bc2a53841..017348e05 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp | |||
| @@ -417,7 +417,7 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) { | |||
| 417 | }; | 417 | }; |
| 418 | } | 418 | } |
| 419 | 419 | ||
| 420 | [[nodiscard]] constexpr SwizzleSource ConvertGreenRed(SwizzleSource value) { | 420 | [[nodiscard]] SwizzleSource ConvertGreenRed(SwizzleSource value) { |
| 421 | switch (value) { | 421 | switch (value) { |
| 422 | case SwizzleSource::G: | 422 | case SwizzleSource::G: |
| 423 | return SwizzleSource::R; | 423 | return SwizzleSource::R; |
| @@ -426,6 +426,17 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) { | |||
| 426 | } | 426 | } |
| 427 | } | 427 | } |
| 428 | 428 | ||
| 429 | [[nodiscard]] SwizzleSource SwapBlueRed(SwizzleSource value) { | ||
| 430 | switch (value) { | ||
| 431 | case SwizzleSource::R: | ||
| 432 | return SwizzleSource::B; | ||
| 433 | case SwizzleSource::B: | ||
| 434 | return SwizzleSource::R; | ||
| 435 | default: | ||
| 436 | return value; | ||
| 437 | } | ||
| 438 | } | ||
| 439 | |||
| 429 | void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage image, | 440 | void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage image, |
| 430 | VkImageAspectFlags aspect_mask, bool is_initialized, | 441 | VkImageAspectFlags aspect_mask, bool is_initialized, |
| 431 | std::span<const VkBufferImageCopy> copies) { | 442 | std::span<const VkBufferImageCopy> copies) { |
| @@ -543,6 +554,15 @@ void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage im | |||
| 543 | }; | 554 | }; |
| 544 | } | 555 | } |
| 545 | 556 | ||
| 557 | [[nodiscard]] bool IsFormatFlipped(PixelFormat format) { | ||
| 558 | switch (format) { | ||
| 559 | case PixelFormat::A1B5G5R5_UNORM: | ||
| 560 | return true; | ||
| 561 | default: | ||
| 562 | return false; | ||
| 563 | } | ||
| 564 | } | ||
| 565 | |||
| 546 | struct RangedBarrierRange { | 566 | struct RangedBarrierRange { |
| 547 | u32 min_mip = std::numeric_limits<u32>::max(); | 567 | u32 min_mip = std::numeric_limits<u32>::max(); |
| 548 | u32 max_mip = std::numeric_limits<u32>::min(); | 568 | u32 max_mip = std::numeric_limits<u32>::min(); |
| @@ -948,6 +968,9 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI | |||
| 948 | }; | 968 | }; |
| 949 | if (!info.IsRenderTarget()) { | 969 | if (!info.IsRenderTarget()) { |
| 950 | swizzle = info.Swizzle(); | 970 | swizzle = info.Swizzle(); |
| 971 | if (IsFormatFlipped(format)) { | ||
| 972 | std::ranges::transform(swizzle, swizzle.begin(), SwapBlueRed); | ||
| 973 | } | ||
| 951 | if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != 0) { | 974 | if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != 0) { |
| 952 | std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed); | 975 | std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed); |
| 953 | } | 976 | } |