[Piglit] [PATCH 2/2] arb_direct_state_access: New test for GetCompressedTextureImage.

Ilia Mirkin imirkin at alum.mit.edu
Fri Feb 13 11:45:10 PST 2015


You need to check for EXT_texture_array and ARB_texture_cube_map_array
for the relevant subtests. (And maybe ARB_cubemap or something? Not
sure if there's anything out there that wouldn't support it.)

And also check for the s3tc extension for all of them.

On Fri, Feb 13, 2015 at 2:36 PM, Laura Ekstrand <laura at jlekstrand.net> wrote:
> ---
>  .../getcompressedtextureimage.c                    | 198 +++++++++++++++++++++
>  1 file changed, 198 insertions(+)
>  create mode 100644 tests/spec/arb_direct_state_access/getcompressedtextureimage.c
>
> diff --git a/tests/spec/arb_direct_state_access/getcompressedtextureimage.c b/tests/spec/arb_direct_state_access/getcompressedtextureimage.c
> new file mode 100644
> index 0000000..e4f15d7
> --- /dev/null
> +++ b/tests/spec/arb_direct_state_access/getcompressedtextureimage.c
> @@ -0,0 +1,198 @@
> +/*
> + * Copyright 2015 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> + * DEALINGS IN THE SOFTWARE.
> + */
> +
> +/** @file getcompressedtextureimage.c
> + *
> + * Tests to make sure that glGetCompressedTextureImage works correctly.
> + * The basic idea is to create some fake compressed data, upload it to the
> + * driver with the traditional commands, download it with DSA, and compare.
> + * Of course, this assumes that the traditional commands are correct, which
> + * may not actually be the case.
> + */
> +
> +#include "piglit-util-gl.h"
> +
> +PIGLIT_GL_TEST_CONFIG_BEGIN
> +
> +       config.supports_gl_compat_version = 10;
> +
> +       config.window_visual = PIGLIT_GL_VISUAL_RGBA |
> +               PIGLIT_GL_VISUAL_DOUBLE;
> +
> +PIGLIT_GL_TEST_CONFIG_END
> +
> +/* Copied from Mesa src/mesa/main/formats.csv:
> + * MESA_FORMAT_RGBA_DXT5, s3tc, 4, 4, x128
> + */
> +#define FORMAT GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
> +#define WIDTH 32
> +#define HEIGHT 32
> +#define WIDTH_IN_BLOCKS 8
> +#define HEIGHT_IN_BLOCKS 8
> +#define BLOCK_BYTES 16
> +#define IMAGE_SIZE (WIDTH_IN_BLOCKS * HEIGHT_IN_BLOCKS * BLOCK_BYTES)
> +#define CHAR_LIMIT 100
> +
> +static GLubyte *expected;
> +static GLboolean pass = GL_TRUE;
> +
> +static void
> +subtest(GLboolean local_result, const char *test_name)
> +{
> +       pass = local_result && pass;
> +       piglit_report_subtest_result(local_result ? PIGLIT_PASS : PIGLIT_FAIL,
> +                                    test_name);
> +}
> +
> +static void
> +init_random_data(void)
> +{
> +       int i;
> +
> +       expected = malloc(18 * IMAGE_SIZE);
> +       for (i = 0; i < 18 * IMAGE_SIZE; ++i) {
> +               expected[i] = (GLubyte) rand();
> +       }
> +}
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> +       piglit_require_extension("GL_ARB_direct_state_access");
> +       srand(0);
> +       init_random_data();
> +}
> +
> +static bool
> +compare_to_expected(const GLubyte *data, int num_layers)
> +{
> +       return memcmp(expected, data, num_layers * IMAGE_SIZE) == 0;
> +}
> +
> +static void
> +upload_subtest(GLenum target, bool use_pbo)
> +{
> +       GLuint tex, pbo;
> +       int num_layers;
> +       char test_name [CHAR_LIMIT];
> +       int i;
> +
> +       /* Prepare to read data from expected */
> +       GLubyte *data = expected;
> +       if (use_pbo) {
> +               glGenBuffers(1, &pbo);
> +               glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
> +               glBufferData(GL_PIXEL_UNPACK_BUFFER, 18 * IMAGE_SIZE,
> +                            expected, GL_STATIC_DRAW);
> +               data = NULL;
> +       }
> +
> +       /* Upload it using traditional path */
> +       glGenTextures(1, &tex);
> +       glBindTexture(target, tex);
> +
> +       switch (target) {
> +
> +       case GL_TEXTURE_2D:
> +               num_layers = 1;
> +               glTexStorage2D(target, 1, FORMAT, WIDTH, HEIGHT);
> +               glCompressedTexSubImage2D(target, 0, 0, 0, WIDTH, HEIGHT,
> +                                         FORMAT, num_layers * IMAGE_SIZE,
> +                                         data);
> +               break;
> +       case GL_TEXTURE_2D_ARRAY:
> +               num_layers = 3;
> +               glTexStorage3D(target, 1, FORMAT, WIDTH, HEIGHT, num_layers);
> +               glCompressedTexSubImage3D(target, 0, 0, 0, 0, WIDTH, HEIGHT,
> +                                         num_layers, FORMAT,
> +                                         num_layers * IMAGE_SIZE, data);
> +               break;
> +       case GL_TEXTURE_CUBE_MAP:
> +               num_layers = 6;
> +               glTexStorage2D(target, 1, FORMAT, WIDTH, HEIGHT);
> +               for (i = 0; i < num_layers; ++i) {
> +                       glCompressedTexSubImage2D(
> +                               GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0,
> +                               WIDTH, HEIGHT, FORMAT, IMAGE_SIZE,
> +                               data + i * IMAGE_SIZE);
> +               }
> +               break;
> +       case GL_TEXTURE_CUBE_MAP_ARRAY:
> +               num_layers = 18;
> +               glTexStorage3D(target, 1, FORMAT, WIDTH, HEIGHT, num_layers);
> +               glCompressedTexSubImage3D(target, 0, 0, 0, 0, WIDTH, HEIGHT,
> +                                         num_layers, FORMAT,
> +                                         num_layers * IMAGE_SIZE, data);
> +               break;
> +       default:
> +               printf("Bad texture target.\n");
> +               piglit_report_result(PIGLIT_FAIL);
> +
> +       }
> +
> +       /* Prepare to download into data. */
> +       if (use_pbo) {
> +               glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
> +               glBufferData(GL_PIXEL_PACK_BUFFER, 18 * IMAGE_SIZE,
> +                            NULL, GL_STATIC_READ);
> +               /* data = NULL from above */
> +       }
> +       else
> +               data = malloc(18 * IMAGE_SIZE);
> +
> +       /* Download it using DSA */
> +       glBindTexture(target, 0);
> +       glGetCompressedTextureImage(tex, 0, num_layers * IMAGE_SIZE, data);
> +
> +       if (use_pbo)
> +               data = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
> +
> +       /* Perform comparison and report the results. */
> +       snprintf(test_name, CHAR_LIMIT, "upload %s%s",
> +                piglit_get_gl_enum_name(target), use_pbo ? " PBO" : "");
> +       subtest(compare_to_expected(data, num_layers), test_name);
> +
> +       /* Clean up */
> +       if (use_pbo)
> +               glDeleteBuffers(1, &pbo);
> +       else
> +               free(data);
> +}
> +
> +enum piglit_result
> +piglit_display(void)
> +{
> +       /* Non-PBO tests */
> +       upload_subtest(GL_TEXTURE_2D, false);
> +       upload_subtest(GL_TEXTURE_2D_ARRAY, false);
> +       upload_subtest(GL_TEXTURE_CUBE_MAP, false);
> +       upload_subtest(GL_TEXTURE_CUBE_MAP_ARRAY, false);
> +
> +       /* PBO tests */
> +       upload_subtest(GL_TEXTURE_2D, true);
> +       upload_subtest(GL_TEXTURE_2D_ARRAY, true);
> +       upload_subtest(GL_TEXTURE_CUBE_MAP, true);
> +       upload_subtest(GL_TEXTURE_CUBE_MAP_ARRAY, true);
> +
> +       return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> +}
> --
> 2.1.0
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit


More information about the Piglit mailing list