mesa/st: implement fallback for s3tc
authorErik Faye-Lund <erik.faye-lund@collabora.com>
Wed, 10 Aug 2022 06:45:16 +0000 (08:45 +0200)
committerMarge Bot <emma+marge@anholt.net>
Tue, 6 Sep 2022 12:55:02 +0000 (12:55 +0000)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Acked-by: Eric Engestrom <eric@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18180>

src/mesa/state_tracker/st_cb_texture.c
src/mesa/state_tracker/st_format.c

index 4ab7569..770ebc3 100644 (file)
@@ -46,6 +46,7 @@
 #include "main/texcompress_astc.h"
 #include "main/texcompress_bptc.h"
 #include "main/texcompress_etc.h"
+#include "main/texcompress_s3tc.h"
 #include "main/texgetimage.h"
 #include "main/teximage.h"
 #include "main/texobj.h"
@@ -439,6 +440,8 @@ st_compressed_format_fallback(struct st_context *st, mesa_format format)
       return !st->has_etc1;
    case MESA_FORMAT_LAYOUT_ETC2:
       return !st->has_etc2;
+   case MESA_FORMAT_LAYOUT_S3TC:
+      return !st->has_s3tc;
    case MESA_FORMAT_LAYOUT_BPTC:
       return !st->has_bptc;
    case MESA_FORMAT_LAYOUT_ASTC:
@@ -635,6 +638,12 @@ st_UnmapTextureImage(struct gl_context *ctx,
                                         itransfer->temp_stride,
                                         transfer->box.width, transfer->box.height,
                                         texImage->TexFormat);
+            } else if (_mesa_is_format_s3tc(texImage->TexFormat)) {
+               _mesa_unpack_s3tc(map, transfer->stride,
+                                 itransfer->temp_data,
+                                 itransfer->temp_stride,
+                                 transfer->box.width, transfer->box.height,
+                                 texImage->TexFormat);
             } else if (_mesa_is_format_bptc(texImage->TexFormat)) {
                _mesa_unpack_bptc(map, transfer->stride,
                                  itransfer->temp_data,
index e4bb771..89ff512 100644 (file)
@@ -119,6 +119,11 @@ st_mesa_format_to_pipe_format(const struct st_context *st,
       }
    }
 
+   if (_mesa_is_format_s3tc(mesaFormat) && !st->has_s3tc) {
+      return _mesa_is_format_srgb(mesaFormat) ? PIPE_FORMAT_R8G8B8A8_SRGB :
+                                                PIPE_FORMAT_R8G8B8A8_UNORM;
+   }
+
    if (_mesa_is_format_bptc(mesaFormat) && !st->has_bptc) {
       switch (mesaFormat) {
       case MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT: