From 8a214e5530311e9809030e2c55d2d1784169d5e7 Mon Sep 17 00:00:00 2001
From: Fernando Sahmkow <fsahmkow27@gmail.com>
Date: Mon, 8 May 2023 23:16:57 +0200
Subject: [PATCH] Texture Cache: Fix ASTC textures

---
 src/video_core/renderer_opengl/gl_texture_cache.cpp |  2 +-
 src/video_core/renderer_vulkan/vk_texture_cache.cpp |  2 +-
 src/video_core/texture_cache/util.cpp               | 10 +++++-----
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp
index 052456f61..31118886f 100644
--- a/src/video_core/renderer_opengl/gl_texture_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp
@@ -231,7 +231,7 @@ void ApplySwizzle(GLuint handle, PixelFormat format, std::array<SwizzleSource, 4
 
 [[nodiscard]] bool CanBeAccelerated(const TextureCacheRuntime& runtime,
                                     const VideoCommon::ImageInfo& info) {
-    if (IsPixelFormatASTC(info.format) && !runtime.HasNativeASTC()) {
+    if (IsPixelFormatASTC(info.format) && info.size.depth == 1 && !runtime.HasNativeASTC()) {
         return Settings::values.accelerate_astc.GetValue() &&
                !Settings::values.async_astc.GetValue();
     }
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
index 99dd1260a..9ca7751c5 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
@@ -1268,7 +1268,7 @@ Image::Image(TextureCacheRuntime& runtime_, const ImageInfo& info_, GPUVAddr gpu
     if (IsPixelFormatASTC(info.format) && !runtime->device.IsOptimalAstcSupported()) {
         if (Settings::values.async_astc.GetValue()) {
             flags |= VideoCommon::ImageFlagBits::AsynchronousDecode;
-        } else if (Settings::values.accelerate_astc.GetValue()) {
+        } else if (Settings::values.accelerate_astc.GetValue() && info.size.depth == 1) {
             flags |= VideoCommon::ImageFlagBits::AcceleratedUpload;
         }
         flags |= VideoCommon::ImageFlagBits::Converted;
diff --git a/src/video_core/texture_cache/util.cpp b/src/video_core/texture_cache/util.cpp
index de37db684..f1071aa23 100644
--- a/src/video_core/texture_cache/util.cpp
+++ b/src/video_core/texture_cache/util.cpp
@@ -896,11 +896,11 @@ void ConvertImage(std::span<const u8> input, const ImageInfo& info, std::span<u8
         ASSERT(copy.buffer_row_length == Common::AlignUp(mip_size.width, tile_size.width));
         ASSERT(copy.buffer_image_height == Common::AlignUp(mip_size.height, tile_size.height));
         if (IsPixelFormatASTC(info.format)) {
-            ASSERT(copy.image_extent.depth == 1);
-            Tegra::Texture::ASTC::Decompress(input.subspan(copy.buffer_offset),
-                                             copy.image_extent.width, copy.image_extent.height,
-                                             copy.image_subresource.num_layers, tile_size.width,
-                                             tile_size.height, output.subspan(output_offset));
+            Tegra::Texture::ASTC::Decompress(
+                input.subspan(copy.buffer_offset), copy.image_extent.width,
+                copy.image_extent.height,
+                copy.image_subresource.num_layers * copy.image_extent.depth, tile_size.width,
+                tile_size.height, output.subspan(output_offset));
         } else {
             DecompressBC4(input.subspan(copy.buffer_offset), copy.image_extent,
                           output.subspan(output_offset));