summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/renderer_vulkan')
-rw-r--r--src/video_core/renderer_vulkan/maxwell_to_vk.cpp2
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp49
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
441void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage image, 467void 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) { 583void 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 }