vk_texture_cache: Swap R and B channels of color flipped format
Swaps the Red and Blue channels of the A1B5G5R5_UNORM texture format, which was being incorrectly rendered.
This commit is contained in:
		@@ -417,7 +417,7 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) {
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[[nodiscard]] constexpr SwizzleSource ConvertGreenRed(SwizzleSource value) {
 | 
			
		||||
[[nodiscard]] SwizzleSource ConvertGreenRed(SwizzleSource value) {
 | 
			
		||||
    switch (value) {
 | 
			
		||||
    case SwizzleSource::G:
 | 
			
		||||
        return SwizzleSource::R;
 | 
			
		||||
@@ -426,6 +426,17 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[[nodiscard]] SwizzleSource SwapBlueRed(SwizzleSource value) {
 | 
			
		||||
    switch (value) {
 | 
			
		||||
    case SwizzleSource::R:
 | 
			
		||||
        return SwizzleSource::B;
 | 
			
		||||
    case SwizzleSource::B:
 | 
			
		||||
        return SwizzleSource::R;
 | 
			
		||||
    default:
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage image,
 | 
			
		||||
                       VkImageAspectFlags aspect_mask, bool is_initialized,
 | 
			
		||||
                       std::span<const VkBufferImageCopy> copies) {
 | 
			
		||||
@@ -543,6 +554,15 @@ void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage im
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[[nodiscard]] bool IsFormatFlipped(PixelFormat format) {
 | 
			
		||||
    switch (format) {
 | 
			
		||||
    case PixelFormat::A1B5G5R5_UNORM:
 | 
			
		||||
        return true;
 | 
			
		||||
    default:
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct RangedBarrierRange {
 | 
			
		||||
    u32 min_mip = std::numeric_limits<u32>::max();
 | 
			
		||||
    u32 max_mip = std::numeric_limits<u32>::min();
 | 
			
		||||
@@ -948,6 +968,9 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI
 | 
			
		||||
    };
 | 
			
		||||
    if (!info.IsRenderTarget()) {
 | 
			
		||||
        swizzle = info.Swizzle();
 | 
			
		||||
        if (IsFormatFlipped(format)) {
 | 
			
		||||
            std::ranges::transform(swizzle, swizzle.begin(), SwapBlueRed);
 | 
			
		||||
        }
 | 
			
		||||
        if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != 0) {
 | 
			
		||||
            std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user