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:
committed by
Marge Bot
parent
0a70207648
commit
4ae273dcf4
@@ -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()
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user