From 43622f463db2a750b3148884e35dcaa5635e691d Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Wed, 16 Sep 2026 16:59:20 -0400 Subject: [PATCH] A test for a corrupted unswizzled textures --- src/video_core/host_shaders/astc_decoder.comp | 26 +++++++------------ .../renderer_vulkan/vk_texture_cache.cpp | 6 ++++- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/video_core/host_shaders/astc_decoder.comp b/src/video_core/host_shaders/astc_decoder.comp index 58dccb545f..9a3954ca21 100644 --- a/src/video_core/host_shaders/astc_decoder.comp +++ b/src/video_core/host_shaders/astc_decoder.comp @@ -164,27 +164,19 @@ uint FastReplicateTo8(uint value, uint num_bits) { return ReplicateBits(value, num_bits, 8); } +const uint REPLICATE_TO_6_ODD_HALVES = ((63u >> 1u) << 5u) | ((21u >> 1u) << 10u) | + ((9u >> 1u) << 15u) | ((17u >> 1u) << 20u) | + ((33u >> 1u) << 25u); +const uint REPLICATE_TO_6_SHIFTS = (2u << 16u) | (4u << 20u); + uint FastReplicateTo6(uint value, uint num_bits) { - if (num_bits == 0) { - return 0; - } - if (num_bits >= 6) { + if (num_bits >= 6u) { return value; } const uint v = value & ((1u << num_bits) - 1u); - if (num_bits == 1) { - return v * 63u; - } - if (num_bits == 2) { - return v * 21u; - } - if (num_bits == 3) { - return v * 9u; - } - if (num_bits == 4) { - return (v << 2u) | (v >> 2u); - } - return (v << 1u) | (v >> 4u); + const uint c = ((REPLICATE_TO_6_ODD_HALVES >> (num_bits * 5u)) & 0x1fu) * 2u + 1u; + const uint s = (REPLICATE_TO_6_SHIFTS >> (num_bits * 4u)) & 0xfu; + return (v * c) >> s; } uint Div3Floor(uint v) { diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index caff739187..ff1ab0bf2c 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -57,7 +57,8 @@ using VideoCore::Surface::SurfaceType; namespace { constexpr bool ENABLE_MSAA_TILER_RESOLVE = true; constexpr bool ENABLE_MSAA_RESOLVE_CONSUME = true; -constexpr bool ENABLE_ACCELERATED_UNSWIZZLE = false; +constexpr bool ENABLE_ACCELERATED_UNSWIZZLE = true; +constexpr bool ENABLE_ACCELERATED_UNSWIZZLE_DISPATCH = false; constexpr bool ENABLE_MSAA_COLOR_DISCARD = true; constexpr bool ENABLE_MSAA_DEPTH_STENCIL_DISCARD = true; @@ -207,6 +208,9 @@ constexpr VkBorderColor ConvertBorderColor(const std::array& color) { } [[nodiscard]] bool WillUseAcceleratedUnswizzle(const Device& device, const ImageInfo& info) { + if (!ENABLE_ACCELERATED_UNSWIZZLE_DISPATCH) { + return false; + } switch (info.type) { case ImageType::e2D: case ImageType::e3D: