diff options
Diffstat (limited to 'src/video_core/renderer_vulkan')
| -rw-r--r-- | src/video_core/renderer_vulkan/maxwell_to_vk.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.cpp | 49 |
2 files changed, 44 insertions, 7 deletions
diff --git a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp index 1c136c410..a2c6d0e6c 100644 --- a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp +++ b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp | |||
| @@ -127,6 +127,7 @@ struct FormatTuple { | |||
| 127 | {VK_FORMAT_A2B10G10R10_UNORM_PACK32, Attachable | Storage}, // A2B10G10R10_UNORM | 127 | {VK_FORMAT_A2B10G10R10_UNORM_PACK32, Attachable | Storage}, // A2B10G10R10_UNORM |
| 128 | {VK_FORMAT_A2B10G10R10_UINT_PACK32, Attachable | Storage}, // A2B10G10R10_UINT | 128 | {VK_FORMAT_A2B10G10R10_UINT_PACK32, Attachable | Storage}, // A2B10G10R10_UINT |
| 129 | {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1B5G5R5_UNORM (flipped with swizzle) | 129 | {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1B5G5R5_UNORM (flipped with swizzle) |
| 130 | {VK_FORMAT_R5G5B5A1_UNORM_PACK16}, // A5B5G5R1_UNORM (specially swizzled) | ||
| 130 | {VK_FORMAT_R8_UNORM, Attachable | Storage}, // R8_UNORM | 131 | {VK_FORMAT_R8_UNORM, Attachable | Storage}, // R8_UNORM |
| 131 | {VK_FORMAT_R8_SNORM, Attachable | Storage}, // R8_SNORM | 132 | {VK_FORMAT_R8_SNORM, Attachable | Storage}, // R8_SNORM |
| 132 | {VK_FORMAT_R8_SINT, Attachable | Storage}, // R8_SINT | 133 | {VK_FORMAT_R8_SINT, Attachable | Storage}, // R8_SINT |
| @@ -184,6 +185,7 @@ struct FormatTuple { | |||
| 184 | {VK_FORMAT_BC3_SRGB_BLOCK}, // BC3_SRGB | 185 | {VK_FORMAT_BC3_SRGB_BLOCK}, // BC3_SRGB |
| 185 | {VK_FORMAT_BC7_SRGB_BLOCK}, // BC7_SRGB | 186 | {VK_FORMAT_BC7_SRGB_BLOCK}, // BC7_SRGB |
| 186 | {VK_FORMAT_R4G4B4A4_UNORM_PACK16, Attachable}, // A4B4G4R4_UNORM | 187 | {VK_FORMAT_R4G4B4A4_UNORM_PACK16, Attachable}, // A4B4G4R4_UNORM |
| 188 | {VK_FORMAT_R4G4_UNORM_PACK8}, // R4G4_UNORM | ||
| 187 | {VK_FORMAT_ASTC_4x4_SRGB_BLOCK}, // ASTC_2D_4X4_SRGB | 189 | {VK_FORMAT_ASTC_4x4_SRGB_BLOCK}, // ASTC_2D_4X4_SRGB |
| 188 | {VK_FORMAT_ASTC_8x8_SRGB_BLOCK}, // ASTC_2D_8X8_SRGB | 190 | {VK_FORMAT_ASTC_8x8_SRGB_BLOCK}, // ASTC_2D_8X8_SRGB |
| 189 | {VK_FORMAT_ASTC_8x5_SRGB_BLOCK}, // ASTC_2D_8X5_SRGB | 191 | {VK_FORMAT_ASTC_8x5_SRGB_BLOCK}, // ASTC_2D_8X5_SRGB |
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 2c2ccc7c6..49691ce0c 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp | |||
| @@ -438,6 +438,32 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) { | |||
| 438 | } | 438 | } |
| 439 | } | 439 | } |
| 440 | 440 | ||
| 441 | [[nodiscard]] SwizzleSource SwapGreenRed(SwizzleSource value) { | ||
| 442 | switch (value) { | ||
| 443 | case SwizzleSource::R: | ||
| 444 | return SwizzleSource::G; | ||
| 445 | case SwizzleSource::G: | ||
| 446 | return SwizzleSource::R; | ||
| 447 | default: | ||
| 448 | return value; | ||
| 449 | } | ||
| 450 | } | ||
| 451 | |||
| 452 | [[nodiscard]] SwizzleSource SwapSpecial(SwizzleSource value) { | ||
| 453 | switch (value) { | ||
| 454 | case SwizzleSource::A: | ||
| 455 | return SwizzleSource::R; | ||
| 456 | case SwizzleSource::R: | ||
| 457 | return SwizzleSource::A; | ||
| 458 | case SwizzleSource::G: | ||
| 459 | return SwizzleSource::B; | ||
| 460 | case SwizzleSource::B: | ||
| 461 | return SwizzleSource::G; | ||
| 462 | default: | ||
| 463 | return value; | ||
| 464 | } | ||
| 465 | } | ||
| 466 | |||
| 441 | void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage image, | 467 | void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage image, |
| 442 | VkImageAspectFlags aspect_mask, bool is_initialized, | 468 | VkImageAspectFlags aspect_mask, bool is_initialized, |
| 443 | std::span<const VkBufferImageCopy> copies) { | 469 | std::span<const VkBufferImageCopy> copies) { |
| @@ -554,14 +580,25 @@ void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage im | |||
| 554 | }; | 580 | }; |
| 555 | } | 581 | } |
| 556 | 582 | ||
| 557 | [[nodiscard]] bool IsFormatFlipped(PixelFormat format, bool emulate_bgr565) { | 583 | void TryTransformSwizzleIfNeeded(PixelFormat format, std::array<SwizzleSource, 4>& swizzle, |
| 584 | bool emulate_bgr565) { | ||
| 558 | switch (format) { | 585 | switch (format) { |
| 559 | case PixelFormat::A1B5G5R5_UNORM: | 586 | case PixelFormat::A1B5G5R5_UNORM: |
| 560 | return true; | 587 | std::ranges::transform(swizzle, swizzle.begin(), SwapBlueRed); |
| 588 | break; | ||
| 561 | case PixelFormat::B5G6R5_UNORM: | 589 | case PixelFormat::B5G6R5_UNORM: |
| 562 | return emulate_bgr565; | 590 | if (emulate_bgr565) { |
| 591 | std::ranges::transform(swizzle, swizzle.begin(), SwapBlueRed); | ||
| 592 | } | ||
| 593 | break; | ||
| 594 | case PixelFormat::A5B5G5R1_UNORM: | ||
| 595 | std::ranges::transform(swizzle, swizzle.begin(), SwapSpecial); | ||
| 596 | break; | ||
| 597 | case PixelFormat::R4G4_UNORM: | ||
| 598 | std::ranges::transform(swizzle, swizzle.begin(), SwapGreenRed); | ||
| 599 | break; | ||
| 563 | default: | 600 | default: |
| 564 | return false; | 601 | break; |
| 565 | } | 602 | } |
| 566 | } | 603 | } |
| 567 | 604 | ||
| @@ -1496,9 +1533,7 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI | |||
| 1496 | }; | 1533 | }; |
| 1497 | if (!info.IsRenderTarget()) { | 1534 | if (!info.IsRenderTarget()) { |
| 1498 | swizzle = info.Swizzle(); | 1535 | swizzle = info.Swizzle(); |
| 1499 | if (IsFormatFlipped(format, device->MustEmulateBGR565())) { | 1536 | TryTransformSwizzleIfNeeded(format, swizzle, device->MustEmulateBGR565()); |
| 1500 | std::ranges::transform(swizzle, swizzle.begin(), SwapBlueRed); | ||
| 1501 | } | ||
| 1502 | if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != 0) { | 1537 | if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != 0) { |
| 1503 | std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed); | 1538 | std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed); |
| 1504 | } | 1539 | } |