From 8fcc3d2121cb6eeffaed9274f4f9c26375306501 Mon Sep 17 00:00:00 2001 From: Steveice10 <1269164+Steveice10@users.noreply.github.com> Date: Thu, 12 Jan 2023 03:33:12 -0800 Subject: [PATCH] rasterizer_cache: Add morton conversion for D24 <-> D32 (#19) --- .../rasterizer_cache/morton_swizzle.h | 22 ++++++++++++++++++- .../renderer_vulkan/vk_instance.cpp | 3 +-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/video_core/rasterizer_cache/morton_swizzle.h b/src/video_core/rasterizer_cache/morton_swizzle.h index 7f27c76ef..77a239c42 100644 --- a/src/video_core/rasterizer_cache/morton_swizzle.h +++ b/src/video_core/rasterizer_cache/morton_swizzle.h @@ -63,6 +63,9 @@ constexpr void DecodePixel(const std::byte* source, std::byte* dest) { const u8 ia4 = static_cast(source[0]); std::memset(dest, Common::Color::Convert4To8(ia4 >> 4), 3); dest[3] = std::byte{Common::Color::Convert4To8(ia4 & 0xF)}; + } else if constexpr (format == PixelFormat::D24 && converted) { + const auto d32 = Common::Color::DecodeD24(reinterpret_cast(source)) / 16777215.f; + std::memcpy(dest, &d32, sizeof(d32)); } else { std::memcpy(dest, source, bytes_per_pixel); } @@ -140,6 +143,10 @@ constexpr void EncodePixel(const std::byte* source, std::byte* dest) { Common::Vec4 rgba; std::memcpy(rgba.AsArray(), source, 4); Common::Color::EncodeRGBA4(rgba, reinterpret_cast(dest)); + } else if constexpr (format == PixelFormat::D24 && converted) { + float d32; + std::memcpy(&d32, source, sizeof(d32)); + Common::Color::EncodeD24(d32 * 0xFFFFFF, reinterpret_cast(dest)); } else { std::memcpy(dest, source, bytes_per_pixel); } @@ -299,7 +306,20 @@ static constexpr std::array UNSWIZZLE_TABLE_CONVERTED = { MortonCopy, // 1 MortonCopy, // 2 MortonCopy, // 3 - MortonCopy // 4 + MortonCopy, // 4 + nullptr, // 5 + nullptr, // 6 + nullptr, // 7 + nullptr, // 8 + nullptr, // 9 + nullptr, // 10 + nullptr, // 11 + nullptr, // 12 + nullptr, // 13 + nullptr, // 14 + nullptr, // 15 + MortonCopy, // 16 + nullptr, // 17 }; static constexpr std::array SWIZZLE_TABLE = { diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index b49d3e205..4b8c893a2 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -295,8 +295,7 @@ vk::ImageAspectFlags MakeAspect(VideoCore::SurfaceType type) { } FormatTraits Instance::DetermineTraits(VideoCore::PixelFormat pixel_format, vk::Format format) { - const vk::ImageAspectFlags format_aspect = - MakeAspect(VideoCore::GetFormatType(pixel_format)); + const vk::ImageAspectFlags format_aspect = MakeAspect(VideoCore::GetFormatType(pixel_format)); const vk::FormatProperties format_properties = physical_device.getFormatProperties(format); const vk::FormatFeatureFlagBits attachment_usage =