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")