[Piglit] [PATCH 1/2] Add test to verify the functionality of glBitmap() with multisample FBO

Paul Berry stereotype441 at gmail.com
Sat Jun 16 08:39:04 PDT 2012


On 12 June 2012 12:40, Anuj Phogat <anuj.phogat at gmail.com> wrote:

> glBitmap() is expected to work exactly the same way on multisample FBO as
> it works on single sample FBO. Test assumes that MSAA accuracy test already
> passes.
>
> Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
> ---
>  tests/all.tests                                    |    6 +
>  .../ext_framebuffer_multisample/CMakeLists.gl.txt  |    1 +
>  tests/spec/ext_framebuffer_multisample/bitmap.cpp  |  185
> ++++++++++++++++++++
>  3 files changed, 192 insertions(+), 0 deletions(-)
>  create mode 100644 tests/spec/ext_framebuffer_multisample/bitmap.cpp
>
> diff --git a/tests/all.tests b/tests/all.tests
> index 129a923..10c5351 100644
> --- a/tests/all.tests
> +++ b/tests/all.tests
> @@ -1379,6 +1379,12 @@ for num_samples in (2, 4, 8, 16, 32):
>                 test_name)
>         ext_framebuffer_multisample[test_name] = PlainExecTest(executable)
>
> +for num_samples in (2, 4, 8, 16, 32):
> +        test_name = ' '.join(['bitmap', str(num_samples)])
> +        executable = 'ext_framebuffer_multisample-{0} -auto'.format(
> +                test_name)
> +        ext_framebuffer_multisample[test_name] = PlainExecTest(executable)
> +
>  ext_framebuffer_object = Group()
>  spec['EXT_framebuffer_object'] = ext_framebuffer_object
>  add_fbo_stencil_tests(ext_framebuffer_object, 'GL_STENCIL_INDEX1')
> diff --git a/tests/spec/ext_framebuffer_multisample/CMakeLists.gl.txt
> b/tests/spec/ext_framebuffer_multisample/CMakeLists.gl.txt
> index 1660067..68fed48 100644
> --- a/tests/spec/ext_framebuffer_multisample/CMakeLists.gl.txt
> +++ b/tests/spec/ext_framebuffer_multisample/CMakeLists.gl.txt
> @@ -10,6 +10,7 @@ link_libraries (
>  )
>
>  piglit_add_executable (ext_framebuffer_multisample-accuracy common.cpp
> accuracy.cpp)
> +piglit_add_executable (ext_framebuffer_multisample-bitmap common.cpp
> bitmap.cpp)
>  piglit_add_executable (ext_framebuffer_multisample-dlist dlist.c)
>  piglit_add_executable (ext_framebuffer_multisample-formats common.cpp
> formats.cpp)
>  piglit_add_executable (ext_framebuffer_multisample-line-smooth common.cpp
> line-smooth.cpp)
> diff --git a/tests/spec/ext_framebuffer_multisample/bitmap.cpp
> b/tests/spec/ext_framebuffer_multisample/bitmap.cpp
> new file mode 100644
> index 0000000..ec52471
> --- /dev/null
> +++ b/tests/spec/ext_framebuffer_multisample/bitmap.cpp
> @@ -0,0 +1,185 @@
> +/*
> + * Copyright © 2012 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.
> + */
> +
> +#include "common.h"
> +
> +/**
> + * \file bitmap.cpp
> + *
> + * This test case verifies the functionality of glBitmap() with
> multisample
> + * FBO and assumes that MSAA accuracy test already passes. glBitmap() is
> + * expected to work exactly the same way on multisample FBO as it works on
> + * single sample FBO.
> + *
> + * Test operates by drawing a test pattern in a single sample FBO which
> + * generates a reference image in right half of default framebuffer.
> + *
> + * Draw the same test pattern in multisample buffer and blit it in to a
> single
> + * sample FBO (resolve_fbo). Then blit the resolve_fbo to left half of
> window
> + * system framebuffer. This is the test image.
> + *
> + * Compare the two halves of default framebuffer.
> + */
> +
> +int piglit_width = 512; int piglit_height = 256;
> +int piglit_window_mode = GLUT_DOUBLE | GLUT_RGBA | GLUT_ALPHA ;
> +const int pattern_width = 256; const int pattern_height = 256;
> +
> +static Fbo ms_fbo, resolve_fbo;
> +static GLint num_samples;
> +
> +static GLubyte bitmap[] =
> +{
> +       0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
> +       0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
> +       0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
> +       0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
> +       0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
> +       0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
> +       0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
> +       0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
> +       0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
> +       0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
> +       0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
> +       0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
> +       0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
> +       0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
> +       0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
> +       0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
> +};
>

This is a remarkably uniform bitmap.  Can we replace it with something that
has a little more variation?  I'm worried that some possible bugs might not
be detected by this test because the bitmap is so uniform.  For example,
the rightmost two pixels of the entire bitmap are 0's.  So if we had a bug
that prevented the rightmost 2 pixels of the bitmap from being drawn, the
test wouldn't catch it.


> +
> +void
> +draw_pattern(void)
> +{
> +       const int w  = 32, h = 32;
> +
> +       glClear(GL_COLOR_BUFFER_BIT);
> +
> +       glRasterPos2i (0, 0);
> +       glColor3f(1.0, 1.0 , 1.0);
> +       for (int i = 0; i < pattern_width / w; i++)
> +               glBitmap(w, h, 0.0, 0.0, w, h, bitmap);
> +
> +       glRasterPos2i (0, pattern_height - h);
> +       for (int i = 0; i < pattern_width / w; i++)
> +               glBitmap(w, h, 0.0, 0.0, w, -h, bitmap);
> +}
> +
> +void
> +print_usage_and_exit(char *prog_name)
> +{
> +       printf("Usage: %s <num_samples>\n", prog_name);
> +       piglit_report_result(PIGLIT_FAIL);
> +}
> +
> +bool
> +test_multisample_bitmap()
> +{
> +       bool result = true;
> +
> +       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, ms_fbo.handle);
> +       draw_pattern();
> +
> +       /* Blit ms_fbo to resolve_fbo to resolve multisample buffer */
> +       glBindFramebuffer(GL_READ_FRAMEBUFFER, ms_fbo.handle);
> +       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolve_fbo.handle);
> +       glBlitFramebuffer(0, 0, pattern_width, pattern_height,
> +                         0, 0, pattern_width, pattern_height,
> +                         GL_COLOR_BUFFER_BIT, GL_NEAREST);
> +
> +       /* Blit resolve_fbo to the left half of window system framebuffer.
> +        * This is the test image.
> +        */
> +       glBindFramebuffer(GL_READ_FRAMEBUFFER, resolve_fbo.handle);
> +       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
> +       glBlitFramebuffer(0, 0, pattern_width, pattern_height,
> +                         0, 0, pattern_width, pattern_height,
> +                         GL_COLOR_BUFFER_BIT, GL_NEAREST);
> +
> +       /* Check that the left and right halves of the screen match */
> +       glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
> +       result = piglit_probe_rect_halves_equal_rgba(0, 0, piglit_width,
> +                                                    piglit_height)
> +                && result;
> +
> +       result = piglit_check_gl_error(GL_NO_ERROR) && result;
> +       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
> +       return result;
> +}
> +
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> +       if (argc < 2)
> +               print_usage_and_exit(argv[0]);
> +       {
> +               char *endptr = NULL;
> +               num_samples = strtol(argv[1], &endptr, 0);
> +               if (endptr != argv[1] + strlen(argv[1]))
> +                       print_usage_and_exit(argv[0]);
> +       }
> +
> +       piglit_require_gl_version(30);
> +       piglit_ortho_projection(pattern_width, pattern_height, GL_TRUE);
> +
> +       /* Skip the test if num_samples > GL_MAX_SAMPLES or num_samples =
> 0 */
> +       GLint max_samples;
> +       glGetIntegerv(GL_MAX_SAMPLES, &max_samples);
> +       if (num_samples > max_samples ||
> +           num_samples == 0)
>

I think we should drop the "num_samples == 0" check from this and the other
tests.  When debugging MSAA problems, it's really useful to be able to
manually run an MSAA test with num_samples==0.  (Of course, all.tests
should only run the tests with non-zero sample counts).


> +               piglit_report_result(PIGLIT_SKIP);
> +
> +       ms_fbo.setup(FboConfig(num_samples, pattern_width,
> pattern_height));
> +       resolve_fbo.setup(FboConfig(0, pattern_width, pattern_height));
> +}
> +
> +enum piglit_result
> +piglit_display()
> +{
> +       bool pass = true;
> +       glClearColor(0.0, 0.0, 0.0, 1.0);
> +       glClear(GL_COLOR_BUFFER_BIT);
> +
> +       /* Draw test pattern in single sample resolve_fbo */
> +       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolve_fbo.handle);
> +       resolve_fbo.set_viewport();
> +       draw_pattern();
> +
> +       /* Blit resolve_fbo to the right half of window system
> framebuffer. This
> +        * is a reference image.
> +        */
> +       glBindFramebuffer(GL_READ_FRAMEBUFFER, resolve_fbo.handle);
> +       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
> +       glBlitFramebuffer(0, 0, pattern_width, pattern_height,
> +                         pattern_width, 0, 2 * pattern_width,
> pattern_height,
> +                         GL_COLOR_BUFFER_BIT, GL_NEAREST);
> +
> +       /* Test drawing bitmap in multisample FBO */
> +       pass = test_multisample_bitmap() && pass;
> +
> +       if (!piglit_automatic)
> +               piglit_present_results();
> +
> +       return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> +}
> --
> 1.7.7.6
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit
>

Assuming those two minor comments are addressed, this patch is:

Reviewed-by: Paul Berry <stereotype441 at gmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/piglit/attachments/20120616/deb88c08/attachment.html>


More information about the Piglit mailing list