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