From 4ae273dcf492ff8b746a2b74e40b60c779c39573 Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Thu, 26 Sep 2024 13:51:08 +0200 Subject: [PATCH] mesa: make compressed-format emulation optional MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Marek Olšák Acked-by: David Heidelberg Part-of: --- .../auxiliary/pipe-loader/driinfo_gallium.h | 1 + src/gallium/auxiliary/util/u_driconf.c | 1 + src/gallium/include/frontend/api.h | 1 + src/mesa/state_tracker/st_extensions.c | 78 ++++++++++--------- src/util/driconf.h | 3 + 5 files changed, 46 insertions(+), 38 deletions(-) diff --git a/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h b/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h index f764916b630..3b0ab726e8f 100644 --- a/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h +++ b/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h @@ -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() diff --git a/src/gallium/auxiliary/util/u_driconf.c b/src/gallium/auxiliary/util/u_driconf.c index 165de18b131..5be5e9d17dc 100644 --- a/src/gallium/auxiliary/util/u_driconf.c +++ b/src/gallium/auxiliary/util/u_driconf.c @@ -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); diff --git a/src/gallium/include/frontend/api.h b/src/gallium/include/frontend/api.h index 712cbe9e47e..25d6b39a67c 100644 --- a/src/gallium/include/frontend/api.h +++ b/src/gallium/include/frontend/api.h @@ -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; diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 650c831f992..c256d186a15 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -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); diff --git a/src/util/driconf.h b/src/util/driconf.h index 37107a11aef..a5d5086c8af 100644 --- a/src/util/driconf.h +++ b/src/util/driconf.h @@ -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")