From dc1f740860097fa8502a8d7d80d6c617f81750ca Mon Sep 17 00:00:00 2001 From: IndecisiveTurtle <47210458+raphaelthegreat@users.noreply.github.com> Date: Thu, 17 Jul 2025 22:39:34 +0300 Subject: [PATCH] renderer_vulkan: Emulate B5G6R5 with swizzle --- src/video_core/amdgpu/pixel_format.h | 9 +++++++++ src/video_core/renderer_vulkan/liverpool_to_vk.cpp | 2 +- src/video_core/renderer_vulkan/vk_instance.cpp | 6 ------ src/video_core/texture_cache/texture_cache.cpp | 2 +- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/video_core/amdgpu/pixel_format.h b/src/video_core/amdgpu/pixel_format.h index bd0f778f4..45c688e57 100644 --- a/src/video_core/amdgpu/pixel_format.h +++ b/src/video_core/amdgpu/pixel_format.h @@ -248,6 +248,15 @@ constexpr CompMapping RemapSwizzle(const DataFormat format, const CompMapping sw result.a = swizzle.r; return result; } + case DataFormat::Format5_6_5: { + // Remap to a more supported component order. + CompMapping result; + result.r = swizzle.b; + result.g = swizzle.g; + result.b = swizzle.r; + result.a = swizzle.a; + return result; + } default: return swizzle; } diff --git a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp index cd597e16c..51411be7f 100644 --- a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp +++ b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp @@ -671,7 +671,7 @@ std::span SurfaceFormats() { vk::Format::eR32G32B32A32Sfloat), // 5_6_5 CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format5_6_5, AmdGpu::NumberFormat::Unorm, - vk::Format::eB5G6R5UnormPack16), + vk::Format::eR5G6B5UnormPack16), // 1_5_5_5 CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format1_5_5_5, AmdGpu::NumberFormat::Unorm, vk::Format::eA1R5G5B5UnormPack16), diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index 43b92d632..6e5351ddd 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -70,7 +70,6 @@ std::unordered_map GetFormatProperties( vk::Format::eB8G8R8A8Unorm, vk::Format::eB8G8R8A8Srgb, vk::Format::eD24UnormS8Uint, - vk::Format::eR5G6B5UnormPack16, }; for (const auto& format : misc_formats) { if (!format_properties.contains(format)) { @@ -676,11 +675,6 @@ vk::Format Instance::GetSupportedFormat(const vk::Format format, return vk::Format::eR8Unorm; } break; - case vk::Format::eB5G6R5UnormPack16: - if (IsFormatSupported(vk::Format::eR5G6B5UnormPack16, flags)) { - return vk::Format::eR5G6B5UnormPack16; - } - break; default: break; } diff --git a/src/video_core/texture_cache/texture_cache.cpp b/src/video_core/texture_cache/texture_cache.cpp index a6657d8d9..a9c65e7ad 100644 --- a/src/video_core/texture_cache/texture_cache.cpp +++ b/src/video_core/texture_cache/texture_cache.cpp @@ -626,7 +626,7 @@ void TextureCache::RefreshImage(Image& image, Vulkan::Scheduler* custom_schedule image_copy.push_back({ .bufferOffset = mip.offset, .bufferRowLength = mip_pitch, - .bufferImageHeight = mip_height, + .bufferImageHeight = mip_height ? std::max(mip_height, 8U) : mip_height, .imageSubresource{ .aspectMask = image.aspect_mask & ~vk::ImageAspectFlagBits::eStencil, .mipLevel = m,