Mesa (master): gallium: Add a transcode_astc driconf option

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Apr 27 19:41:03 UTC 2021


Module: Mesa
Branch: master
Commit: 91cbe8d855c19d5e252fe4b29adf2a424c46a23d
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=91cbe8d855c19d5e252fe4b29adf2a424c46a23d

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Mon Apr 26 18:01:16 2021 -0500

gallium: Add a transcode_astc driconf option

This is similar to the transcode_etc flag in that it changes the ASTC
fallback (when present) to use DXT5 instead of RGBA8888.  This reduces
the memory footprint of the app at the expense of a bit of correctness.
Because it's not quite correct, it's hidden behind a driconf option.

Reviewed-by: Eric Anholt <eric at anholt.net>
Acked-by: Nanley Chery <nanley.g.chery at intel.com>
Reviewed-by: Marek Olšák <maraeo at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10476>

---

 .../auxiliary/pipe-loader/driinfo_gallium.h        |  1 +
 src/gallium/frontends/dri/dri_screen.c             |  2 ++
 src/gallium/include/frontend/api.h                 |  1 +
 src/mesa/state_tracker/st_cb_texture.c             |  8 +++++++-
 src/mesa/state_tracker/st_context.c                |  4 ++++
 src/mesa/state_tracker/st_context.h                |  1 +
 src/mesa/state_tracker/st_format.c                 | 22 ++++++++++++++++++----
 src/util/driconf.h                                 |  3 +++
 8 files changed, 37 insertions(+), 5 deletions(-)

diff --git a/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h b/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h
index 9c5cdfba5f0..2fa2a37f6d9 100644
--- a/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h
+++ b/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h
@@ -34,6 +34,7 @@ DRI_CONF_SECTION_DEBUG
    DRI_CONF_FORCE_COMPAT_PROFILE(false)
    DRI_CONF_FORCE_GL_NAMES_REUSE(false)
    DRI_CONF_TRANSCODE_ETC(false)
+   DRI_CONF_TRANSCODE_ASTC(false)
    DRI_CONF_FORCE_GL_VENDOR()
    DRI_CONF_OVERRIDE_VRAM_SIZE()
    DRI_CONF_GLX_EXTENSION_OVERRIDE()
diff --git a/src/gallium/frontends/dri/dri_screen.c b/src/gallium/frontends/dri/dri_screen.c
index c5c62e59330..7c239241527 100644
--- a/src/gallium/frontends/dri/dri_screen.c
+++ b/src/gallium/frontends/dri/dri_screen.c
@@ -105,6 +105,8 @@ dri_fill_st_options(struct dri_screen *screen)
       driQueryOptionb(optionCache, "force_gl_names_reuse");
    options->transcode_etc =
       driQueryOptionb(optionCache, "transcode_etc");
+   options->transcode_astc =
+      driQueryOptionb(optionCache, "transcode_astc");
 
    char *vendor_str = driQueryOptionstr(optionCache, "force_gl_vendor");
    /* not an empty string */
diff --git a/src/gallium/include/frontend/api.h b/src/gallium/include/frontend/api.h
index 936b09227f4..dacabc06ddb 100644
--- a/src/gallium/include/frontend/api.h
+++ b/src/gallium/include/frontend/api.h
@@ -242,6 +242,7 @@ struct st_config_options
    bool force_integer_tex_nearest;
    bool force_gl_names_reuse;
    bool transcode_etc;
+   bool transcode_astc;
    char *force_gl_vendor;
    unsigned char config_options_sha1[20];
 };
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
index 6b269196167..bf98d21b554 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -407,8 +407,14 @@ st_UnmapTextureImage(struct gl_context *ctx,
                                         transfer->box.height,
                                         texImage->TexFormat,
                                         bgra);
+            } else if (_mesa_is_format_astc_2d(texImage->TexFormat)) {
+               _mesa_unpack_astc_2d_ldr(tmp, transfer->box.width * 4,
+                                        itransfer->temp_data,
+                                        itransfer->temp_stride,
+                                        transfer->box.width,
+                                        transfer->box.height,
+                                        texImage->TexFormat);
             } else {
-               /* TODO: We could transcode ASTC too. */
                unreachable("unexpected format for a compressed format fallback");
             }
 
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
index 5876a37e89d..63f8c84c300 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -681,6 +681,10 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe,
                        screen->is_format_supported(screen, PIPE_FORMAT_DXT1_SRGBA,
                                                    PIPE_TEXTURE_2D, 0, 0,
                                                    PIPE_BIND_SAMPLER_VIEW);
+   st->transcode_astc = options->transcode_astc &&
+                        screen->is_format_supported(screen, PIPE_FORMAT_DXT5_SRGBA,
+                                                    PIPE_TEXTURE_2D, 0, 0,
+                                                    PIPE_BIND_SAMPLER_VIEW);
    st->has_astc_2d_ldr =
       screen->is_format_supported(screen, PIPE_FORMAT_ASTC_4x4_SRGB,
                                   PIPE_TEXTURE_2D, 0, 0, PIPE_BIND_SAMPLER_VIEW);
diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
index 867a882c3e7..ae260bb9e61 100644
--- a/src/mesa/state_tracker/st_context.h
+++ b/src/mesa/state_tracker/st_context.h
@@ -143,6 +143,7 @@ struct st_context
    boolean has_etc1;
    boolean has_etc2;
    boolean transcode_etc;
+   boolean transcode_astc;
    boolean has_astc_2d_ldr;
    boolean has_astc_5x5_ldr;
    boolean prefer_blit_based_texture_transfer;
diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c
index 3bd8e161996..d21e916808c 100644
--- a/src/mesa/state_tracker/st_format.c
+++ b/src/mesa/state_tracker/st_format.c
@@ -110,10 +110,24 @@ st_mesa_format_to_pipe_format(const struct st_context *st,
    }
 
    if (st_astc_format_fallback(st, mesaFormat)) {
-      if (_mesa_is_format_srgb(mesaFormat))
-         return PIPE_FORMAT_R8G8B8A8_SRGB;
-      else
-         return PIPE_FORMAT_R8G8B8A8_UNORM;
+      const struct util_format_description *desc =
+         util_format_description(mesaFormat);
+
+      if (_mesa_is_format_srgb(mesaFormat)) {
+         if (!st->transcode_astc)
+            return PIPE_FORMAT_R8G8B8A8_SRGB;
+         else if (desc->block.width * desc->block.height < 32)
+            return PIPE_FORMAT_DXT5_SRGBA;
+         else
+            return PIPE_FORMAT_DXT1_SRGBA;
+      } else {
+         if (!st->transcode_astc)
+            return PIPE_FORMAT_R8G8B8A8_UNORM;
+         else if (desc->block.width * desc->block.height < 32)
+            return PIPE_FORMAT_DXT5_RGBA;
+         else
+            return PIPE_FORMAT_DXT1_RGBA;
+      }
    }
 
    return mesaFormat;
diff --git a/src/util/driconf.h b/src/util/driconf.h
index 7cb15354570..cfd95fa8abf 100644
--- a/src/util/driconf.h
+++ b/src/util/driconf.h
@@ -233,6 +233,9 @@
 #define DRI_CONF_TRANSCODE_ETC(def) \
    DRI_CONF_OPT_B(transcode_etc, def, "Transcode ETC formats to DXTC if unsupported")
 
+#define DRI_CONF_TRANSCODE_ASTC(def) \
+   DRI_CONF_OPT_B(transcode_astc, def, "Transcode ASTC formats to DXTC if unsupported")
+
 #define DRI_CONF_GLX_EXTENSION_OVERRIDE() \
    DRI_CONF_OPT_S_NODEF(glx_extension_override, \
                   "Allow enabling/disabling a list of GLX extensions")



More information about the mesa-commit mailing list