[Piglit] [PATCH 4/4] arb_copy_image-formats: add code to test GL_DEPTH32F_STENCIL8

Ilia Mirkin imirkin at alum.mit.edu
Fri Sep 11 15:57:03 PDT 2015


On Fri, Sep 11, 2015 at 6:50 PM, Brian Paul <brianp at vmware.com> wrote:
> This internal depth/stencil format was added in GL 3.0
> We need to handle a few things specially for this format:
> 1. The random float data must be in the range [0,1].
> 2. When we compare pixels, we must skip the 3 unused bytes in the pixel.
>
> This patch also simplifies the array indexing code in check_texture().
>
> Note: This format fails with NVIDIA's 352.21 driver (at least).
> It passes with Mesa softpipe with the proposed GL_ARB_copy_image patch
> series.
> ---
>  tests/spec/arb_copy_image/formats.c | 59 +++++++++++++++++++++++++++++++++----
>  1 file changed, 54 insertions(+), 5 deletions(-)
>
> diff --git a/tests/spec/arb_copy_image/formats.c b/tests/spec/arb_copy_image/formats.c
> index eb0f314..1ecc411 100644
> --- a/tests/spec/arb_copy_image/formats.c
> +++ b/tests/spec/arb_copy_image/formats.c
> @@ -172,6 +172,10 @@ struct texture_format formats[] = {
>         FORMAT(GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT, GL_RGB, GL_BYTE, true, 16, 4, 4),
>  #endif
>
> +#ifdef GL_DEPTH32F_STENCIL8
> +        FORMAT(GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, false, 8, 1, 1),
> +#endif
> +
>  #undef FORMAT
>  };
>
> @@ -256,6 +260,8 @@ is_format_supported(struct texture_format *format)
>  #endif
>         case GL_STENCIL_INDEX8:
>                 return piglit_is_extension_supported("GL_ARB_texture_stencil8");
> +       case GL_DEPTH32F_STENCIL8:
> +               return piglit_get_gl_version() >= 30;

Actually GL_ARB_depth_buffer_float added the format, AFAIK. Although
it'll be precious few drivers that support ARB_copy_image and
ARB_depth_buffer_float but not GL3... Although freedreno currently
lacks GL3 support...

>         }
>
>         return true;
> @@ -409,6 +415,24 @@ setup_test_data(struct texture_format *src_format,
>                 rand_int = (int *)(rand_data + data_size);
>                 for (i = 0; i < data_size / sizeof(float); ++i)
>                         dst_float[i] = rand_int[i] / (float)INT16_MAX;
> +       }
> +       else if (src_format->data_type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV ||
> +                dst_format->data_type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV) {
> +               /* Use float values in [0,1].  The stencil values will
> +                * be the least significant 8 bits in the dwords at odd
> +                * offsets. */
> +               float *src_float = (float *)src_data;
> +               float *dst_float = (float *)dst_data;
> +               rand_int = (int *)rand_data;
> +               for (i = 0; i < data_size / sizeof(float); ++i) {
> +                       src_float[i] = (rand_int[i] & 0xffff) / 65535.0f;
> +                       assert(src_float[i] <= 1.0f);
> +               }
> +               rand_int = (int *)(rand_data + data_size);
> +               for (i = 0; i < data_size / sizeof(float); ++i) {
> +                       dst_float[i] = (rand_int[i] & 0xffff) / 65535.0f;
> +                       assert(dst_float[i] <= 1.0f);
> +               }
>         } else {
>                 memcpy(src_data, rand_data, data_size);
>                 memcpy(dst_data, rand_data + data_size, data_size);
> @@ -708,6 +732,32 @@ run_multisample_test(struct texture_format *src_format,
>         return pass ? PIGLIT_PASS : PIGLIT_FAIL;
>  }
>
> +
> +/** test if two pixels are equal, according to the format */
> +static bool
> +pixels_equal(const void *p1, const void *p2,
> +            const struct texture_format *format)
> +{
> +       if (format->data_type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV) {
> +               /* don't compare the 3 unused bytes which pad the
> +                * stencil value.
> +                */
> +               const float *f1 = (const float *) p1;
> +               const float *f2 = (const float *) p2;
> +               const GLuint *b1 = (const GLuint *) p1;
> +               const GLuint *b2 = (const GLuint *) p2;
> +               if (f1[0] != f2[0])
> +                       return false;
> +               if ((b1[1] & 0xff) != (b2[1] & 0xff))
> +                       return false;
> +               return true;
> +       }
> +       else {
> +               return memcmp(p1, p2, format->bytes) == 0;
> +       }
> +}
> +
> +
>  static bool
>  check_texture(GLuint texture, unsigned level,
>               const struct texture_format *format, const unsigned char *data)
> @@ -731,19 +781,18 @@ check_texture(GLuint texture, unsigned level,
>         passrate = 0;
>         for (j = 0; j < TEX_SIZE; ++j) {
>                 for (i = 0; i < TEX_SIZE; ++i) {
> -                       if (memcmp(tex_data + ((j * TEX_SIZE) + i) * format->bytes,
> -                                  data + ((j * TEX_SIZE) + i) * format->bytes,
> -                                  format->bytes) == 0) {
> +                       int pos = ((j * TEX_SIZE) + i) * format->bytes;
> +                       if (pixels_equal(tex_data + pos, data + pos, format)) {
>                                 passrate += 1;
>                         } else {
>                                 fprintf(stdout, "texel mismatch at (%d, %d); expected 0x",
>                                         i, j);
>                                 for (k = format->bytes - 1; k >= 0; --k)
> -                                       fprintf(stdout, "%02x", data[((j * TEX_SIZE) + i) * format->bytes + k]);
> +                                       fprintf(stdout, "%02x", data[pos + k]);
>
>                                 fprintf(stdout, ", received 0x");
>                                 for (k = format->bytes - 1; k >= 0; --k)
> -                                       fprintf(stdout, "%02x", tex_data[((j * TEX_SIZE) + i) * format->bytes + k]);
> +                                       fprintf(stdout, "%02x", tex_data[pos + k]);
>                                 fprintf(stdout, ".\n");
>
>                                 pass = false;
> --
> 1.9.1
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit


More information about the Piglit mailing list