mesa: make compressed-format emulation optional

There's good reasons to emulate compressed formats; mobile and desktop
HW generally have different ideas of what formats are worth the extra
silicon, so they support different formats based on the legacy they were
designed to support. This means we can get better application
compatibility by emulating these formats.

But, that comes at a price, namely that applications that supports
multiple formats don't really have a way to detect which ones are
natively supported and which ones are not. This means they might make
the wrong choice, and end up wasting memory and bandwidth when that
could have been avoided.

So let's make the emulation optional, by introducing a DRIconf variable
to disable it.

This intentionally still leaves in place transcoding support, because
that's still *probably* a win. Besides, those needs to be opted into
anyway.

Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Acked-by: David Heidelberg <david@ixit.cz>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31420>
This commit is contained in:
Erik Faye-Lund
2024-09-26 13:51:08 +02:00
committed by Marge Bot
parent 0a70207648
commit 4ae273dcf4
5 changed files with 46 additions and 38 deletions
@@ -45,6 +45,7 @@ DRI_CONF_SECTION_DEBUG
DRI_CONF_FORCE_GL_MAP_BUFFER_SYNCHRONIZED(false)
DRI_CONF_TRANSCODE_ETC(false)
DRI_CONF_TRANSCODE_ASTC(false)
DRI_CONF_ALLOW_COMPRESSED_FALLBACK(true)
DRI_CONF_FORCE_GL_VENDOR()
DRI_CONF_FORCE_GL_RENDERER()
DRI_CONF_OVERRIDE_VRAM_SIZE()
+1
View File
@@ -71,6 +71,7 @@ u_driconf_fill_st_options(struct st_config_options *options,
query_bool_option(force_gl_map_buffer_synchronized);
query_bool_option(transcode_etc);
query_bool_option(transcode_astc);
query_bool_option(allow_compressed_fallback);
query_string_option(force_gl_vendor);
query_string_option(force_gl_renderer);
query_string_option(mesa_extension_override);
+1
View File
@@ -200,6 +200,7 @@ struct st_config_options
bool force_gl_map_buffer_synchronized;
bool transcode_etc;
bool transcode_astc;
bool allow_compressed_fallback;
char *force_gl_vendor;
char *force_gl_renderer;
char *mesa_extension_override;
+40 -38
View File
@@ -988,26 +988,12 @@ void st_init_extensions(struct pipe_screen *screen,
PIPE_FORMAT_RGTC2_UNORM,
PIPE_FORMAT_RGTC2_SNORM } },
/* RGTC software fallback support. */
{ { o(ARB_texture_compression_rgtc) },
{ PIPE_FORMAT_R8_UNORM,
PIPE_FORMAT_R8_SNORM,
PIPE_FORMAT_R8G8_UNORM,
PIPE_FORMAT_R8G8_SNORM } },
{ { o(EXT_texture_compression_latc) },
{ PIPE_FORMAT_LATC1_UNORM,
PIPE_FORMAT_LATC1_SNORM,
PIPE_FORMAT_LATC2_UNORM,
PIPE_FORMAT_LATC2_SNORM } },
/* LATC software fallback support. */
{ { o(EXT_texture_compression_latc) },
{ PIPE_FORMAT_L8_UNORM,
PIPE_FORMAT_L8_SNORM,
PIPE_FORMAT_L8A8_UNORM,
PIPE_FORMAT_L8A8_SNORM } },
{ { o(EXT_texture_compression_s3tc),
o(ANGLE_texture_compression_dxt) },
{ PIPE_FORMAT_DXT1_RGB,
@@ -1015,33 +1001,18 @@ void st_init_extensions(struct pipe_screen *screen,
PIPE_FORMAT_DXT3_RGBA,
PIPE_FORMAT_DXT5_RGBA } },
/* S3TC software fallback support. */
{ { o(EXT_texture_compression_s3tc),
o(ANGLE_texture_compression_dxt) },
{ PIPE_FORMAT_R8G8B8A8_UNORM } },
{ { o(EXT_texture_compression_s3tc_srgb) },
{ PIPE_FORMAT_DXT1_SRGB,
PIPE_FORMAT_DXT1_SRGBA,
PIPE_FORMAT_DXT3_SRGBA,
PIPE_FORMAT_DXT5_SRGBA } },
/* S3TC SRGB software fallback support. */
{ { o(EXT_texture_compression_s3tc_srgb) },
{ PIPE_FORMAT_R8G8B8A8_SRGB } },
{ { o(ARB_texture_compression_bptc) },
{ PIPE_FORMAT_BPTC_RGBA_UNORM,
PIPE_FORMAT_BPTC_SRGBA,
PIPE_FORMAT_BPTC_RGB_FLOAT,
PIPE_FORMAT_BPTC_RGB_UFLOAT } },
/* BPTC software fallback support. */
{ { o(ARB_texture_compression_bptc) },
{ PIPE_FORMAT_R8G8B8A8_UNORM,
PIPE_FORMAT_R8G8B8A8_SRGB,
PIPE_FORMAT_R16G16B16X16_FLOAT } },
{ { o(TDFX_texture_compression_FXT1) },
{ PIPE_FORMAT_FXT1_RGB,
PIPE_FORMAT_FXT1_RGBA } },
@@ -1077,12 +1048,6 @@ void st_init_extensions(struct pipe_screen *screen,
PIPE_FORMAT_ASTC_12x10_SRGB,
PIPE_FORMAT_ASTC_12x12_SRGB } },
/* ASTC software fallback support. */
{ { o(KHR_texture_compression_astc_ldr),
o(KHR_texture_compression_astc_sliced_3d) },
{ PIPE_FORMAT_R8G8B8A8_UNORM,
PIPE_FORMAT_R8G8B8A8_SRGB } },
{ { o(EXT_texture_shared_exponent) },
{ PIPE_FORMAT_R9G9B9E5_FLOAT } },
@@ -1111,9 +1076,6 @@ void st_init_extensions(struct pipe_screen *screen,
{ { o(ATI_texture_compression_3dc) },
{ PIPE_FORMAT_LATC2_UNORM } },
{ { o(ATI_texture_compression_3dc) },
{ PIPE_FORMAT_L8A8_UNORM } },
{ { o(MESA_ycbcr_texture) },
{ PIPE_FORMAT_UYVY,
PIPE_FORMAT_YUYV },
@@ -1136,6 +1098,41 @@ void st_init_extensions(struct pipe_screen *screen,
PIPE_FORMAT_ATC_RGBA_INTERPOLATED } },
};
/* Required: sampler support */
static const struct st_extension_format_mapping texture_mapping_compressed_fallback[] = {
{ { o(KHR_texture_compression_astc_ldr),
o(KHR_texture_compression_astc_sliced_3d) },
{ PIPE_FORMAT_R8G8B8A8_UNORM,
PIPE_FORMAT_R8G8B8A8_SRGB } },
{ { o(ARB_texture_compression_rgtc) },
{ PIPE_FORMAT_R8_UNORM,
PIPE_FORMAT_R8_SNORM,
PIPE_FORMAT_R8G8_UNORM,
PIPE_FORMAT_R8G8_SNORM } },
{ { o(EXT_texture_compression_latc) },
{ PIPE_FORMAT_L8_UNORM,
PIPE_FORMAT_L8_SNORM,
PIPE_FORMAT_L8A8_UNORM,
PIPE_FORMAT_L8A8_SNORM } },
{ { o(EXT_texture_compression_s3tc),
o(ANGLE_texture_compression_dxt) },
{ PIPE_FORMAT_R8G8B8A8_UNORM } },
{ { o(EXT_texture_compression_s3tc_srgb) },
{ PIPE_FORMAT_R8G8B8A8_SRGB } },
{ { o(ARB_texture_compression_bptc) },
{ PIPE_FORMAT_R8G8B8A8_UNORM,
PIPE_FORMAT_R8G8B8A8_SRGB,
PIPE_FORMAT_R16G16B16X16_FLOAT } },
{ { o(ATI_texture_compression_3dc) },
{ PIPE_FORMAT_L8A8_UNORM } },
};
/* Required: vertex fetch support. */
static const struct st_extension_format_mapping vertex_mapping[] = {
{ { o(EXT_vertex_array_bgra) },
@@ -1186,6 +1183,11 @@ void st_init_extensions(struct pipe_screen *screen,
init_format_extensions(screen, extensions, texture_mapping,
ARRAY_SIZE(texture_mapping), PIPE_TEXTURE_2D,
PIPE_BIND_SAMPLER_VIEW);
if (options->allow_compressed_fallback)
init_format_extensions(screen, extensions,
texture_mapping_compressed_fallback,
ARRAY_SIZE(texture_mapping_compressed_fallback),
PIPE_TEXTURE_2D, PIPE_BIND_SAMPLER_VIEW);
init_format_extensions(screen, extensions, vertex_mapping,
ARRAY_SIZE(vertex_mapping), PIPE_BUFFER,
PIPE_BIND_VERTEX_BUFFER);
+3
View File
@@ -281,6 +281,9 @@
#define DRI_CONF_TRANSCODE_ASTC(def) \
DRI_CONF_OPT_B(transcode_astc, def, "Transcode ASTC formats to DXTC if unsupported")
#define DRI_CONF_ALLOW_COMPRESSED_FALLBACK(def) \
DRI_CONF_OPT_B(allow_compressed_fallback, def, "Allow fallback to uncompressed formats for unsupported compressed formats")
#define DRI_CONF_MESA_EXTENSION_OVERRIDE() \
DRI_CONF_OPT_S_NODEF(mesa_extension_override, \
"Allow enabling/disabling a list of extensions")