diff --git a/src/video_core/compatible_formats.cpp b/src/video_core/compatible_formats.cpp index 87d69ebc53..7ef3b64b34 100644 --- a/src/video_core/compatible_formats.cpp +++ b/src/video_core/compatible_formats.cpp @@ -42,7 +42,7 @@ constexpr std::array VIEW_CLASS_32_BITS{ PixelFormat::A2B10G10R10_UNORM, PixelFormat::R16G16_UINT, PixelFormat::R32_UINT, PixelFormat::R16G16_SINT, PixelFormat::R32_SINT, PixelFormat::A8B8G8R8_UNORM, PixelFormat::R16G16_UNORM, PixelFormat::A8B8G8R8_SNORM, PixelFormat::R16G16_SNORM, - PixelFormat::A8B8G8R8_SRGB, PixelFormat::E5B9G9R9_FLOAT, PixelFormat::B8G8R8A8_UNORM, + PixelFormat::A8B8G8R8_SRGB, PixelFormat::B8G8R8A8_UNORM, PixelFormat::B8G8R8A8_SRGB, PixelFormat::A8B8G8R8_UINT, PixelFormat::A8B8G8R8_SINT, PixelFormat::A2B10G10R10_UINT, }; @@ -52,7 +52,7 @@ constexpr std::array VIEW_CLASS_32_BITS_NO_BGR{ PixelFormat::A2B10G10R10_UNORM, PixelFormat::R16G16_UINT, PixelFormat::R32_UINT, PixelFormat::R16G16_SINT, PixelFormat::R32_SINT, PixelFormat::A8B8G8R8_UNORM, PixelFormat::R16G16_UNORM, PixelFormat::A8B8G8R8_SNORM, PixelFormat::R16G16_SNORM, - PixelFormat::A8B8G8R8_SRGB, PixelFormat::E5B9G9R9_FLOAT, PixelFormat::A8B8G8R8_UINT, + PixelFormat::A8B8G8R8_SRGB, PixelFormat::A8B8G8R8_UINT, PixelFormat::A8B8G8R8_SINT, PixelFormat::A2B10G10R10_UINT, }; diff --git a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp index 24da3591ec..45bbc93d5d 100644 --- a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp +++ b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp @@ -214,7 +214,7 @@ struct FormatTuple { {VK_FORMAT_ASTC_8x6_SRGB_BLOCK}, // ASTC_2D_8X6_SRGB {VK_FORMAT_ASTC_6x5_UNORM_BLOCK}, // ASTC_2D_6X5_UNORM {VK_FORMAT_ASTC_6x5_SRGB_BLOCK}, // ASTC_2D_6X5_SRGB - {VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, Attachable | Storage}, // E5B9G9R9_FLOAT + {VK_FORMAT_E5B9G9R9_UFLOAT_PACK32}, // E5B9G9R9_FLOAT (SAMPLED_IMAGE only, no COLOR_ATTACHMENT) // Depth formats {VK_FORMAT_D32_SFLOAT, Attachable}, // D32_FLOAT diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 672a67424b..068258e379 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -168,8 +168,7 @@ constexpr VkBorderColor ConvertBorderColor(const std::array& color) { const auto vk_format = MaxwellToVK::SurfaceFormat(device, FormatType::Optimal, false, info.format).format; - const bool is_hdr_format = vk_format == VK_FORMAT_B10G11R11_UFLOAT_PACK32 || - vk_format == VK_FORMAT_E5B9G9R9_UFLOAT_PACK32; + const bool is_hdr_format = vk_format == VK_FORMAT_B10G11R11_UFLOAT_PACK32; if (!is_hdr_format) { return info; @@ -1361,7 +1360,6 @@ void TextureCacheRuntime::ConvertImage(Framebuffer* dst, ImageView& dst_view, Im case PixelFormat::ASTC_2D_8X6_SRGB: case PixelFormat::ASTC_2D_6X5_UNORM: case PixelFormat::ASTC_2D_6X5_SRGB: - case PixelFormat::E5B9G9R9_FLOAT: case PixelFormat::D32_FLOAT: case PixelFormat::D16_UNORM: case PixelFormat::X8_D24_UNORM: diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index b36bf65486..80dd162382 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -105,6 +105,17 @@ constexpr std::array B10G11R11_UFLOAT_PACK32{ VK_FORMAT_UNDEFINED, }; +// E5B9G9R9_UFLOAT (RGB9E5) - INVALID for COLOR_ATTACHMENT on Nintendo Switch +// Nintendo Switch hardware validation: NO COLOR_ATTACHMENT_BIT (only SAMPLED_IMAGE) +// Reference: vp_gpuinfo_nintendo_switch_v2_495_0_0_0 - Missing required attachment bits +// This format should NEVER be used as render target, only for texture sampling +constexpr std::array E5B9G9R9_UFLOAT_PACK32{ + VK_FORMAT_B10G11R11_UFLOAT_PACK32, // Upgrade to proper HDR format with attachment support + VK_FORMAT_A8B8G8R8_UNORM_PACK32, // Fallback: RGBA8 LDR + VK_FORMAT_R16G16B16A16_SFLOAT, // Last resort: RGBA16F + VK_FORMAT_UNDEFINED, +}; + } // namespace Alternatives template @@ -139,6 +150,8 @@ constexpr const VkFormat* GetFormatAlternatives(VkFormat format) { return Alternatives::VK_FORMAT_A4B4G4R4_UNORM_PACK16.data(); case VK_FORMAT_B10G11R11_UFLOAT_PACK32: return Alternatives::B10G11R11_UFLOAT_PACK32.data(); + case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: + return Alternatives::E5B9G9R9_UFLOAT_PACK32.data(); default: return nullptr; } @@ -974,7 +987,7 @@ VkFormat Device::GetSupportedFormat(VkFormat wanted_format, VkFormatFeatureFlags if (wanted_format == VK_FORMAT_B10G11R11_UFLOAT_PACK32) { LOG_WARNING(Render_Vulkan, "B10G11R11_UFLOAT_PACK32 (R11G11B10F HDR format) not fully supported. " - "Falling back to {} on {}. Expect 4x memory usage and reduced performance.", + "Falling back to {} on {}", alternative, properties.properties.deviceName); } else { LOG_DEBUG(Render_Vulkan,