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:
parent
4c8c5ad1b6
commit
ae758a236f
|
@ -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) {
|
switch (value) {
|
||||||
case SwizzleSource::G:
|
case SwizzleSource::G:
|
||||||
return SwizzleSource::R;
|
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,
|
void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage image,
|
||||||
VkImageAspectFlags aspect_mask, bool is_initialized,
|
VkImageAspectFlags aspect_mask, bool is_initialized,
|
||||||
std::span<const VkBufferImageCopy> copies) {
|
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 {
|
struct RangedBarrierRange {
|
||||||
u32 min_mip = std::numeric_limits<u32>::max();
|
u32 min_mip = std::numeric_limits<u32>::max();
|
||||||
u32 max_mip = std::numeric_limits<u32>::min();
|
u32 max_mip = std::numeric_limits<u32>::min();
|
||||||
|
@ -948,6 +968,9 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI
|
||||||
};
|
};
|
||||||
if (!info.IsRenderTarget()) {
|
if (!info.IsRenderTarget()) {
|
||||||
swizzle = info.Swizzle();
|
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) {
|
if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != 0) {
|
||||||
std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed);
|
std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed);
|
||||||
}
|
}
|
||||||
|
|
Reference in New Issue