[Piglit] [PATCH 1/3] arb_internalformat_query2: use CompressedTexImage*D for specific compressed formats

Antia Puentes apuentes at igalia.com
Tue May 8 12:33:42 UTC 2018


On 06/05/18 11:42, Alejandro PiƱeiro wrote:

> Until right now we were using glTexImage*D for any compressed
> internalformat. That would only work always if the driver support
> online compression for specific compressed internalformats.
s/support/supports
> As it is not really easy to check which internalformats the driver
> support online compression, it is safer to use glCompressedTexImage*D
Again s/support/supports. It sounds better to me rephrasing it as
"easy to check which internalformats the driver supports online 
compression for"

> for any specific internalformat, keeping glTexImage*D for the generic
> ones.
> ---
>   tests/spec/arb_internalformat_query2/common.c | 126 ++++++++++++++++++++++++--
>   1 file changed, 117 insertions(+), 9 deletions(-)
>
> diff --git a/tests/spec/arb_internalformat_query2/common.c b/tests/spec/arb_internalformat_query2/common.c
> index 68f33a4a0..204149936 100644
> --- a/tests/spec/arb_internalformat_query2/common.c
> +++ b/tests/spec/arb_internalformat_query2/common.c
> @@ -186,6 +186,47 @@ test_data_check_supported(const test_data *data,
>           return result;
>   }
>   
> +
> +/*
> + * Spec 4.6, Table 8.14
> + */
> +static const GLenum specific_compressed_internalformats[] = {
> +        GL_COMPRESSED_SIGNED_RED_RGTC1,
> +        GL_COMPRESSED_RG_RGTC2,
> +        GL_COMPRESSED_SIGNED_RG_RGTC2,
> +        GL_COMPRESSED_RGBA_BPTC_UNORM,
> +        GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM,
> +        GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT,
> +        GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT,
> +        GL_COMPRESSED_RGB8_ETC2,
> +        GL_COMPRESSED_SRGB8_ETC2,
> +        GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,
> +        GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,
> +        GL_COMPRESSED_RGBA8_ETC2_EAC,
> +        GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,
> +        GL_COMPRESSED_R11_EAC,
> +        GL_COMPRESSED_SIGNED_R11_EAC,
> +        GL_COMPRESSED_RG11_EAC,
> +        GL_COMPRESSED_SIGNED_RG11_EAC,
> +};
GL_COMPRESSED_RED_RGTC1 is missing from the list.

> +
> +/*
> + * Returns if @internalformat is a specific compressed internalformat.
> + *
> + * This is needed because specific compressed internalformats that
> + * doesn't support online compression can't be used with glTexImage*D,
> + * and glCompressedTexImage*D should be used instead. In general, for
> + * specific compressed internalformats, it is better to use
> + * glCompressedTexImage*D
> + */
> +static bool
> +internalformat_is_specific_compressed(const GLenum internalformat)
> +{
> +        return value_on_set((const GLint*) specific_compressed_internalformats,
> +                            ARRAY_SIZE(specific_compressed_internalformats),
> +                            (GLint) internalformat);
> +}
> +
>   /* Returns if @value is one of the values among @set */
>   bool
>   value_on_set(const GLint *set,
> @@ -336,8 +377,8 @@ try_basic(const GLenum *targets, unsigned num_targets,
>   }
>   
>   /* Returns a valid format for @internalformat, so it would be possible
> - * to create a texture using glTexImageXD with that
> - * format/internalformat combination */
> + * to create a texture using glTexImageXD/glCompressedTexImageXD with
> + * that format/internalformat combination */
>   static GLenum
>   format_for_internalformat(const GLenum internalformat)
>   {
> @@ -432,6 +473,51 @@ create_texture(const GLenum target,
>           int width = 16;
>           int depth = 16;
>           unsigned i;
> +        bool is_specific_compressed = internalformat_is_specific_compressed(internalformat);
> +        int image_size = 0;
> +
> +        /*
> +         * From OpenGL 4.6 spec, Section 8.5, Texture Image
> +         * Specification:
> +         *
> +         *    "An INVALID_ENUM error is generated by
> +         *     CompressedTexImage1D if in- ternalformat is one of the
> +         *     specific compressed formats. OpenGL defines no specific
> +         *     one-dimensional compressed formats, but such formats
> +         *     may be pro- vided by extensions."
> +         *
s/in- ternalformat/internalformat
s/pro- vided/provided

> +         * From OpenGL 4.6 spec, Section 8.7, Compressed Texture
> +         * Images:
> +         *
> +         *    "An INVALID_ENUM error is generated if the target
> +         *     parameter to any of the CompressedTexImagenD commands
> +         *     is TEXTURE_RECTANGLE or PROXY_TEXTURE_RECTANGLE ."
> +         */
> +        if (is_specific_compressed &&
> +            (target == GL_TEXTURE_1D || target == GL_TEXTURE_RECTANGLE))
> +                return false;
> +
> +        /*
> +         * From ARB_texture_multisample:
> +         *
> +         *   "(2) What commands may be used on multisample textures?
> +         *
> +         *    RESOLVED: Multisample textures can be bound for
> +         *    rendering and texturing, but they cannot be loaded/read
> +         *    with SubImage commands (TexSubImage, CopyTexSubImage,
> +         *    GetTexImage), they don't support compressed formats, and
> +         *    they don't need TexParameters since they can only be
> +         *    fetched with texelFetchMultisample."
> +         */
> +        if (is_specific_compressed &&
> +            (target == GL_TEXTURE_2D_MULTISAMPLE ||
> +             target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)) {
> +                return false;
> +        }
> +
> +        if (is_specific_compressed) {
> +                image_size = piglit_compressed_image_size(internalformat, width, height);
> +        }

You may want to extract the common condition (is_specific_compressed) 
and put the remaining code inside an "if (is_specific_compressed)" block.
Anyway, if you prefer to leave it as it is and avoid another level of 
nesting, that is also fine by me:

Reviewed-by: Antia Puentes <apuentes at igalia.com>

>           glGenTextures(1, &tex);
>           glBindTexture(target, tex);
> @@ -444,14 +530,29 @@ create_texture(const GLenum target,
>           case GL_TEXTURE_1D_ARRAY:
>           case GL_TEXTURE_2D:
>           case GL_TEXTURE_RECTANGLE:
> -                glTexImage2D(target, 0, internalformat, width, height, 0,
> -                             format, type, NULL);
> +                if (is_specific_compressed) {
> +                        glCompressedTexImage2D(target, 0, internalformat,
> +                                               width, height, 0,
> +                                               image_size, NULL);
> +                } else {
> +                        glTexImage2D(target, 0, internalformat,
> +                                     width, height, 0,
> +                                     format, type, NULL);
> +                }
>                   break;
>           case GL_TEXTURE_CUBE_MAP:
>                   for (i = 0; i < 6; i++) {
> -                        glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,
> -                                     internalformat, width, height, 0, format, type,
> -                                     NULL);
> +                        if (is_specific_compressed) {
> +                                glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,
> +                                                       internalformat,
> +                                                       width, height, 0,
> +                                                       image_size, NULL);
> +                        } else {
> +                                glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,
> +                                             internalformat,
> +                                             width, height, 0,
> +                                             format, type, NULL);
> +                        }
>                   }
>                   break;
>   
> @@ -462,8 +563,15 @@ create_texture(const GLenum target,
>                   /* fall through */
>           case GL_TEXTURE_2D_ARRAY:
>           case GL_TEXTURE_3D:
> -                glTexImage3D(target, 0, internalformat, width, height, depth, 0,
> -                             format, type, NULL);
> +                image_size = image_size * depth;
> +                if (is_specific_compressed) {
> +                        glCompressedTexImage3D(target, 0, internalformat,
> +                                               width, height, depth, 0,
> +                                               image_size, NULL);
> +                } else {
> +                        glTexImage3D(target, 0, internalformat, width, height, depth, 0,
> +                                     format, type, NULL);
> +                }
>                   break;
>           case GL_TEXTURE_2D_MULTISAMPLE:
>   		glTexImage2DMultisample(target, 1, internalformat, width, height,



More information about the Piglit mailing list