[Mesa-dev] [PATCH 1/2] mesa: simplify _mesa_get_compressed_formats()
Eric Engestrom
eric.engestrom at imgtec.com
Tue Feb 6 17:14:46 UTC 2018
On Tuesday, 2018-02-06 09:59:32 -0700, Brian Paul wrote:
> Instead of testing for formats==NULL everywhere, just point formats at
> a dummy array which will be discarded.
> ---
> src/mesa/main/texcompress.c | 200 ++++++++++++++++++--------------------------
> 1 file changed, 83 insertions(+), 117 deletions(-)
>
> diff --git a/src/mesa/main/texcompress.c b/src/mesa/main/texcompress.c
> index 15970a7..1cc13a5 100644
> --- a/src/mesa/main/texcompress.c
> +++ b/src/mesa/main/texcompress.c
> @@ -263,27 +263,23 @@ _mesa_gl_compressed_format_base_format(GLenum format)
> GLuint
> _mesa_get_compressed_formats(struct gl_context *ctx, GLint *formats)
> {
> + GLint discard_formats[100];
Current max size is 75, so that's big enough.
> GLuint n = 0;
> +
> + if (!formats) {
> + formats = discard_formats;
> + }
> +
> if (_mesa_is_desktop_gl(ctx) &&
> ctx->Extensions.TDFX_texture_compression_FXT1) {
> - if (formats) {
> - formats[n++] = GL_COMPRESSED_RGB_FXT1_3DFX;
> - formats[n++] = GL_COMPRESSED_RGBA_FXT1_3DFX;
> - }
> - else {
> - n += 2;
> - }
> + formats[n++] = GL_COMPRESSED_RGB_FXT1_3DFX;
> + formats[n++] = GL_COMPRESSED_RGBA_FXT1_3DFX;
> }
>
> if (ctx->Extensions.EXT_texture_compression_s3tc) {
> - if (formats) {
> - formats[n++] = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
> - formats[n++] = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
> - formats[n++] = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
> - }
> - else {
> - n += 3;
> - }
> + formats[n++] = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
> + formats[n++] = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
> + formats[n++] = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
>
> /* The ES and desktop GL specs diverge here.
> *
> @@ -315,11 +311,7 @@ _mesa_get_compressed_formats(struct gl_context *ctx, GLint *formats)
> * Note that the addition is only to the OpenGL ES specification!
> */
> if (_mesa_is_gles(ctx)) {
> - if (formats) {
> - formats[n++] = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
> - } else {
> - n += 1;
> - }
> + formats[n++] = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
> }
> }
>
> @@ -332,54 +324,36 @@ _mesa_get_compressed_formats(struct gl_context *ctx, GLint *formats)
> */
> if (_mesa_is_gles(ctx)
> && ctx->Extensions.OES_compressed_ETC1_RGB8_texture) {
> - if (formats) {
> - formats[n++] = GL_ETC1_RGB8_OES;
> - }
> - else {
> - n += 1;
> - }
> + formats[n++] = GL_ETC1_RGB8_OES;
> }
>
> if (ctx->API == API_OPENGLES) {
> - if (formats) {
> - formats[n++] = GL_PALETTE4_RGB8_OES;
> - formats[n++] = GL_PALETTE4_RGBA8_OES;
> - formats[n++] = GL_PALETTE4_R5_G6_B5_OES;
> - formats[n++] = GL_PALETTE4_RGBA4_OES;
> - formats[n++] = GL_PALETTE4_RGB5_A1_OES;
> - formats[n++] = GL_PALETTE8_RGB8_OES;
> - formats[n++] = GL_PALETTE8_RGBA8_OES;
> - formats[n++] = GL_PALETTE8_R5_G6_B5_OES;
> - formats[n++] = GL_PALETTE8_RGBA4_OES;
> - formats[n++] = GL_PALETTE8_RGB5_A1_OES;
> - }
> - else {
> - n += 10;
> - }
> + formats[n++] = GL_PALETTE4_RGB8_OES;
> + formats[n++] = GL_PALETTE4_RGBA8_OES;
> + formats[n++] = GL_PALETTE4_R5_G6_B5_OES;
> + formats[n++] = GL_PALETTE4_RGBA4_OES;
> + formats[n++] = GL_PALETTE4_RGB5_A1_OES;
> + formats[n++] = GL_PALETTE8_RGB8_OES;
> + formats[n++] = GL_PALETTE8_RGBA8_OES;
> + formats[n++] = GL_PALETTE8_R5_G6_B5_OES;
> + formats[n++] = GL_PALETTE8_RGBA4_OES;
> + formats[n++] = GL_PALETTE8_RGB5_A1_OES;
> }
>
> if (_mesa_is_gles3(ctx) || ctx->Extensions.ARB_ES3_compatibility) {
> - if (formats) {
> - formats[n++] = GL_COMPRESSED_RGB8_ETC2;
> - formats[n++] = GL_COMPRESSED_RGBA8_ETC2_EAC;
> - formats[n++] = GL_COMPRESSED_R11_EAC;
> - formats[n++] = GL_COMPRESSED_RG11_EAC;
> - formats[n++] = GL_COMPRESSED_SIGNED_R11_EAC;
> - formats[n++] = GL_COMPRESSED_SIGNED_RG11_EAC;
> - formats[n++] = GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
> - } else {
> - n += 7;
> - }
> + formats[n++] = GL_COMPRESSED_RGB8_ETC2;
> + formats[n++] = GL_COMPRESSED_RGBA8_ETC2_EAC;
> + formats[n++] = GL_COMPRESSED_R11_EAC;
> + formats[n++] = GL_COMPRESSED_RG11_EAC;
> + formats[n++] = GL_COMPRESSED_SIGNED_R11_EAC;
> + formats[n++] = GL_COMPRESSED_SIGNED_RG11_EAC;
> + formats[n++] = GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
> }
>
> if (_mesa_is_gles3(ctx)) {
> - if (formats) {
> - formats[n++] = GL_COMPRESSED_SRGB8_ETC2;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;
> - formats[n++] = GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;
> - } else {
> - n += 3;
> - }
> + formats[n++] = GL_COMPRESSED_SRGB8_ETC2;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;
> + formats[n++] = GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;
> }
>
> /* The KHR_texture_compression_astc_hdr spec says:
> @@ -409,70 +383,62 @@ _mesa_get_compressed_formats(struct gl_context *ctx, GLint *formats)
> */
> if (ctx->API == API_OPENGLES2 &&
> ctx->Extensions.KHR_texture_compression_astc_ldr) {
> - if (formats) {
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_4x4_KHR;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_5x4_KHR;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_5x5_KHR;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_6x5_KHR;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_6x6_KHR;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_8x5_KHR;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_8x6_KHR;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_8x8_KHR;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_10x5_KHR;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_10x6_KHR;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_10x8_KHR;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_10x10_KHR;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_12x10_KHR;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_12x12_KHR;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR;
> - }
> - else {
> - n += 28;
> - }
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_4x4_KHR;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_5x4_KHR;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_5x5_KHR;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_6x5_KHR;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_6x6_KHR;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_8x5_KHR;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_8x6_KHR;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_8x8_KHR;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_10x5_KHR;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_10x6_KHR;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_10x8_KHR;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_10x10_KHR;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_12x10_KHR;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_12x12_KHR;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR;
> }
>
> if (_mesa_is_gles3(ctx) &&
> ctx->Extensions.OES_texture_compression_astc) {
> - if (formats) {
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_3x3x3_OES;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_4x3x3_OES;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_4x4x3_OES;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_4x4x4_OES;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_5x4x4_OES;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_5x5x4_OES;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_5x5x5_OES;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_6x5x5_OES;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_6x6x5_OES;
> - formats[n++] = GL_COMPRESSED_RGBA_ASTC_6x6x6_OES;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES;
> - formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES;
> - }
> - else {
> - n += 20;
> - }
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_3x3x3_OES;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_4x3x3_OES;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_4x4x3_OES;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_4x4x4_OES;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_5x4x4_OES;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_5x5x4_OES;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_5x5x5_OES;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_6x5x5_OES;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_6x6x5_OES;
> + formats[n++] = GL_COMPRESSED_RGBA_ASTC_6x6x6_OES;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES;
> + formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES;
> }
>
> + assert(n <= ARRAY_SIZE(discard_formats));
I got thrown off by this and thought it should be `n < ARRAY_SIZE()`,
but `n` is post-incremented, which means it will be one above what's
actually used by the time it's checked here, so it's all fine :)
Series is
Reviewed-by: Eric Engestrom <eric.engestrom at imgtec.com>
> +
> return n;
> }
>
> --
> 2.7.4
>
More information about the mesa-dev
mailing list