From f6ecb812cabc2c184b10a0c357b485f8efd2e3c2 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Mon, 1 Dec 2025 01:40:15 -0400 Subject: [PATCH] [vk] Sanitize Format/Component --- .../texture_cache/format_lookup_table.cpp | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/video_core/texture_cache/format_lookup_table.cpp b/src/video_core/texture_cache/format_lookup_table.cpp index 8c774f512c..cd824dc988 100644 --- a/src/video_core/texture_cache/format_lookup_table.cpp +++ b/src/video_core/texture_cache/format_lookup_table.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -21,6 +24,26 @@ constexpr auto FLOAT = ComponentType::FLOAT; constexpr bool LINEAR = false; constexpr bool SRGB = true; +constexpr TextureFormat SanitizeFormat(TextureFormat format) { + if (format == static_cast(0)) { + return TextureFormat::A8B8G8R8; + } + return format; +} + +constexpr ComponentType SanitizeComponent(ComponentType component) { + switch (component) { + case static_cast(0): + return ComponentType::UNORM; + case ComponentType::SNORM_FORCE_FP16: + return ComponentType::SNORM; + case ComponentType::UNORM_FORCE_FP16: + return ComponentType::UNORM; + default: + return component; + } +} + constexpr u32 Hash(TextureFormat format, ComponentType red_component, ComponentType green_component, ComponentType blue_component, ComponentType alpha_component, bool is_srgb) { u32 hash = is_srgb ? 1 : 0; @@ -41,6 +64,11 @@ constexpr u32 Hash(TextureFormat format, ComponentType component, bool is_srgb = PixelFormat PixelFormatFromTextureInfo(TextureFormat format, ComponentType red, ComponentType green, ComponentType blue, ComponentType alpha, bool is_srgb) noexcept { + format = SanitizeFormat(format); + red = SanitizeComponent(red); + green = SanitizeComponent(green); + blue = SanitizeComponent(blue); + alpha = SanitizeComponent(alpha); switch (Hash(format, red, green, blue, alpha, is_srgb)) { case Hash(TextureFormat::A8B8G8R8, UNORM): return PixelFormat::A8B8G8R8_UNORM;