On Wed, May 9, 2012 at 10:25 AM, Paul Berry <[email protected]> wrote: > > This test verifies that a non-MSAA framebuffer can be accurately > blitted to an MSAA framebuffer. > --- > tests/all.tests | 7 + > .../ext_framebuffer_multisample/CMakeLists.gl.txt | 1 + > .../spec/ext_framebuffer_multisample/upsample.cpp | 191 > ++++++++++++++++++++ > 3 files changed, 199 insertions(+), 0 deletions(-) > create mode 100644 tests/spec/ext_framebuffer_multisample/upsample.cpp > > diff --git a/tests/all.tests b/tests/all.tests > index 807d36b..c943846 100644 > --- a/tests/all.tests > +++ b/tests/all.tests > @@ -1317,6 +1317,13 @@ 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): > + for buffer_type in ('color', 'depth', 'stencil'): > + test_name = ' '.join(['upsample', str(num_samples), > buffer_type]) > + 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 97be3d5..3e38342 100644 > --- a/tests/spec/ext_framebuffer_multisample/CMakeLists.gl.txt > +++ b/tests/spec/ext_framebuffer_multisample/CMakeLists.gl.txt > @@ -22,3 +22,4 @@ piglit_add_executable > (ext_framebuffer_multisample-negative-readpixels negative- > piglit_add_executable (ext_framebuffer_multisample-renderbuffer-samples > renderbuffer-samples.c) > piglit_add_executable > (ext_framebuffer_multisample-renderbufferstorage-samples > renderbufferstorage-samples.c) > piglit_add_executable (ext_framebuffer_multisample-samples samples.c) > +piglit_add_executable (ext_framebuffer_multisample-upsample common.cpp > upsample.cpp) > diff --git a/tests/spec/ext_framebuffer_multisample/upsample.cpp > b/tests/spec/ext_framebuffer_multisample/upsample.cpp > new file mode 100644 > index 0000000..9ae4c9c > --- /dev/null > +++ b/tests/spec/ext_framebuffer_multisample/upsample.cpp > @@ -0,0 +1,191 @@ > +/* > + * 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 upsample.cpp > + * > + * Verify the accuracy of upsampling from a non-MSAA buffer to an MSAA > + * buffer. > + * > + * This test operates by drawing a test image in the window system > + * framebuffer (which is non-MSAA), and then blitting it to an MSAA > + * framebuffer, forcing the implementation to upsample it. > + * > + * To verify that upsampling has properly replicated each pixel value > + * in each of its samples, we blit from the MSAA buffer back to the > + * window system framebuffer. This causes all of the samples for each > + * pixel to be blended, so if any of the pixels were not upsampled > + * correctly, we would expect the downsampled image to be different > + * from the original image. > + * > + * When testing depth and stencil buffers, we need to modify this > + * procedure slightly, since downsampling depth and stencil buffers > + * doesn't cause the pixels to be blended. So, after the first blit, > + * we execute a "manifest pass" to translate the depth or stencil > + * image into a color image. This is done independently in both the > + * MSAA and non-MSAA buffers. Then we downsample the resulting color > + * image as before. > + * > + * Note: this test relies on proper functioning of the MSAA buffer and > + * the downsample blit. These are already adequately tested by > + * accuracy.cpp. > + */ > +int piglit_width = 512; int piglit_height = 256; > +int piglit_window_mode = > + GLUT_DOUBLE | GLUT_RGBA | GLUT_ALPHA | GLUT_DEPTH | GLUT_STENCIL; > + > +const int pattern_width = 256; const int pattern_height = 256; > + > +Fbo multisample_fbo; > +TestPattern *test_pattern = NULL; > +ManifestProgram *manifest_program = NULL; > +GLbitfield buffer_to_test; > + > +void > +print_usage_and_exit(char *prog_name) > +{ > + printf("Usage: %s <num_samples> <buffer_type>\n" > + " where <buffer_type> is one of:\n" > + " color\n" > + " stencil\n" > + " depth\n", > + prog_name); > + piglit_report_result(PIGLIT_FAIL); > +} > + > +void > +piglit_init(int argc, char **argv) > +{ > + int num_samples; > + if (argc < 3) > + 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_require_GLSL_version(130); > + > + /* Skip the test if num_samples > GL_MAX_SAMPLES */ > + GLint max_samples; > + glGetIntegerv(GL_MAX_SAMPLES, &max_samples); > + if (num_samples > max_samples) > + piglit_report_result(PIGLIT_SKIP); > + > + if (strcmp(argv[2], "color") == 0) { > + test_pattern = new Triangles(); > + buffer_to_test = GL_COLOR_BUFFER_BIT; > + } else if (strcmp(argv[2], "depth") == 0) { > + test_pattern = new DepthSunburst(); > + manifest_program = new ManifestDepth(); > + buffer_to_test = GL_DEPTH_BUFFER_BIT; > + } else if (strcmp(argv[2], "stencil") == 0) { > + test_pattern = new StencilSunburst(); > + manifest_program = new ManifestStencil(); > + buffer_to_test = GL_STENCIL_BUFFER_BIT; > + } else { > + print_usage_and_exit(argv[0]); > + } > + test_pattern->compile(); > + if (manifest_program) > + manifest_program->compile(); > + > + multisample_fbo.init(num_samples, pattern_width, pattern_height, > + true /* combine_depth_stencil */, > + false /* attach_texture */); > +} > + > +enum piglit_result > +piglit_display() > +{ > + bool pass = true; > + > + /* Draw the full test pattern on the right half of the piglit > + * window, as a reference image. > + * > + * To map the full test pattern to the right half of the > + * windows, we need a projection matrix that multiplies the X > + * coordinate by 0.5 and adds 0.5. > + */ > + float proj[4][4] = { > + { 0.5, 0, 0, 0.5 }, > + { 0, 1, 0, 0 }, > + { 0, 0, 1, 0 }, > + { 0, 0, 0, 1 } > + }; > + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); > + glViewport(0, 0, piglit_width, piglit_height); > + test_pattern->draw(proj); > + > + /* Blit the test pattern to multisample_fbo, forcing the > + * implementation to upsample it. > + */ > + glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); > + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, multisample_fbo.handle); > + glBlitFramebuffer(pattern_width, 0, pattern_width*2, pattern_height, > + 0, 0, pattern_width, pattern_height, > + buffer_to_test, GL_NEAREST); > + > + if (manifest_program) { > + /* Manifest the test pattern in the main framebuffer. */ > + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); > + manifest_program->run(); > + > + /* Manifest the test pattern in the multisample > + * framebuffer. > + */ > + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, > multisample_fbo.handle); > + multisample_fbo.set_viewport(); > + manifest_program->run(); > + } > + > + /* Blit the manifested test pattern to the left half of the > + * main framebuffer, forcing the implementation to downsample > + * it. > + */ > + glBindFramebuffer(GL_READ_FRAMEBUFFER, multisample_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. > + * If they don't, then there is either a problem with > + * upsampling or downsampling. Since downsampling is already > + * tested by accuracy.cpp, we'll assume that any problem we > + * see here is due to upsampling. > + */ > + glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); > + pass = piglit_probe_rect_halves_equal_rgba(0, 0, piglit_width, > + piglit_height) && pass; > + > + pass = piglit_check_gl_error(GL_NO_ERROR) && pass; > + > + piglit_present_results(); > + > + return pass ? PIGLIT_PASS : PIGLIT_FAIL; > +} > -- > 1.7.7.6 > > _______________________________________________ > Piglit mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/piglit
LGTM. Reviewed-by: Anuj Phogat <[email protected]> _______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
