|
|
@@ -438,6 +438,32 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+[[nodiscard]] SwizzleSource SwapGreenRed(SwizzleSource value) {
|
|
|
+ switch (value) {
|
|
|
+ case SwizzleSource::R:
|
|
|
+ return SwizzleSource::G;
|
|
|
+ case SwizzleSource::G:
|
|
|
+ return SwizzleSource::R;
|
|
|
+ default:
|
|
|
+ return value;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+[[nodiscard]] SwizzleSource SwapSpecial(SwizzleSource value) {
|
|
|
+ switch (value) {
|
|
|
+ case SwizzleSource::A:
|
|
|
+ return SwizzleSource::R;
|
|
|
+ case SwizzleSource::R:
|
|
|
+ return SwizzleSource::A;
|
|
|
+ case SwizzleSource::G:
|
|
|
+ return SwizzleSource::B;
|
|
|
+ case SwizzleSource::B:
|
|
|
+ return SwizzleSource::G;
|
|
|
+ default:
|
|
|
+ return value;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage image,
|
|
|
VkImageAspectFlags aspect_mask, bool is_initialized,
|
|
|
std::span<const VkBufferImageCopy> copies) {
|
|
|
@@ -554,14 +580,25 @@ void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage im
|
|
|
};
|
|
|
}
|
|
|
|
|
|
-[[nodiscard]] bool IsFormatFlipped(PixelFormat format, bool emulate_bgr565) {
|
|
|
+void TryTransformSwizzleIfNeeded(PixelFormat format, std::array<SwizzleSource, 4>& swizzle,
|
|
|
+ bool emulate_bgr565) {
|
|
|
switch (format) {
|
|
|
case PixelFormat::A1B5G5R5_UNORM:
|
|
|
- return true;
|
|
|
+ std::ranges::transform(swizzle, swizzle.begin(), SwapBlueRed);
|
|
|
+ break;
|
|
|
case PixelFormat::B5G6R5_UNORM:
|
|
|
- return emulate_bgr565;
|
|
|
+ if (emulate_bgr565) {
|
|
|
+ std::ranges::transform(swizzle, swizzle.begin(), SwapBlueRed);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case PixelFormat::A5B5G5R1_UNORM:
|
|
|
+ std::ranges::transform(swizzle, swizzle.begin(), SwapSpecial);
|
|
|
+ break;
|
|
|
+ case PixelFormat::R4G4_UNORM:
|
|
|
+ std::ranges::transform(swizzle, swizzle.begin(), SwapGreenRed);
|
|
|
+ break;
|
|
|
default:
|
|
|
- return false;
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -1496,9 +1533,7 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI
|
|
|
};
|
|
|
if (!info.IsRenderTarget()) {
|
|
|
swizzle = info.Swizzle();
|
|
|
- if (IsFormatFlipped(format, device->MustEmulateBGR565())) {
|
|
|
- std::ranges::transform(swizzle, swizzle.begin(), SwapBlueRed);
|
|
|
- }
|
|
|
+ TryTransformSwizzleIfNeeded(format, swizzle, device->MustEmulateBGR565());
|
|
|
if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != 0) {
|
|
|
std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed);
|
|
|
}
|