[Piglit] [PATCH] arb_texture_multisample: add new fetch-texel test

Ilia Mirkin imirkin at alum.mit.edu
Tue Jul 8 15:36:35 PDT 2014


On Tue, Jul 8, 2014 at 6:32 PM, Brian Paul <brianp at vmware.com> wrote:
> A simple test to check that using fetchTexel() to get individual
> samples from a MSAA texture really works.

How is this different than texelFetch (in
tests/texturing/shaders/texelFetch.c) with sampler2DMS?

Also, assuming it is different, probably should do
s/fetchTexel/texelFetch/ everywhere...

> ---
>  tests/all.py                                       |    3 +
>  .../spec/arb_texture_multisample/CMakeLists.gl.txt |    1 +
>  tests/spec/arb_texture_multisample/fetch-texel.c   |  315 ++++++++++++++++++++
>  3 files changed, 319 insertions(+)
>  create mode 100644 tests/spec/arb_texture_multisample/fetch-texel.c
>
> diff --git a/tests/all.py b/tests/all.py
> index 7ce90d8..53d4ddf 100644
> --- a/tests/all.py
> +++ b/tests/all.py
> @@ -1382,6 +1382,9 @@ add_concurrent_test(arb_texture_multisample, 'texelFetch fs sampler2DMSArray 4 9
>  add_concurrent_test(arb_texture_multisample, 'texelFetch fs sampler2DMSArray 4 98x129x1-98x129x9')
>  add_concurrent_test(arb_texture_multisample, 'arb_texture_multisample-texstate')
>  add_concurrent_test(arb_texture_multisample, 'arb_texture_multisample-errors')
> +add_concurrent_test(arb_texture_multisample, 'arb_texture_multisample-fetch-texel 2')
> +add_concurrent_test(arb_texture_multisample, 'arb_texture_multisample-fetch-texel 4')
> +add_concurrent_test(arb_texture_multisample, 'arb_texture_multisample-fetch-texel 8')
>  add_concurrent_test(arb_texture_multisample, 'arb_texture_multisample-sample-mask')
>  add_concurrent_test(arb_texture_multisample, 'arb_texture_multisample-sample-mask-value')
>  add_concurrent_test(arb_texture_multisample, 'arb_texture_multisample-sample-mask-execution')
> diff --git a/tests/spec/arb_texture_multisample/CMakeLists.gl.txt b/tests/spec/arb_texture_multisample/CMakeLists.gl.txt
> index 0f00e72..57db067 100644
> --- a/tests/spec/arb_texture_multisample/CMakeLists.gl.txt
> +++ b/tests/spec/arb_texture_multisample/CMakeLists.gl.txt
> @@ -13,6 +13,7 @@ link_libraries (
>  piglit_add_executable (arb_texture_multisample-minmax minmax.c)
>  piglit_add_executable (arb_texture_multisample-errors errors.c)
>  piglit_add_executable (arb_texture_multisample-fb-completeness fb-completeness.c)
> +piglit_add_executable (arb_texture_multisample-fetch-texel fetch-texel.c)
>  piglit_add_executable (arb_texture_multisample-texstate texstate.c)
>  piglit_add_executable (arb_texture_multisample-sample-mask sample-mask.c)
>  piglit_add_executable (arb_texture_multisample-sample-mask-value sample-mask-value.c)
> diff --git a/tests/spec/arb_texture_multisample/fetch-texel.c b/tests/spec/arb_texture_multisample/fetch-texel.c
> new file mode 100644
> index 0000000..ce85c0a
> --- /dev/null
> +++ b/tests/spec/arb_texture_multisample/fetch-texel.c
> @@ -0,0 +1,315 @@
> +/*
> + * Copyright 2014 VMware, Inc.
> + *
> + * 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: fetch-texel.c
> + *
> + * Tests that fetchTexel() really gets samples from different sample positions.
> + * First, we draw a triangle into a MSAA texture/FBO.
> + * Then, for each sample location, we draw a texture quad, using fetchTexel()
> + * to grab a particular sample.  We read back the colors to a temporary image.
> + * Finally, we check that the colors in the temp images are different for at
> + * least some of the pixels/samples.
> + *
> + * Brian Paul
> + * July 2014
> + */
> +
> +
> +#include "piglit-util-gl-common.h"
> +
> +PIGLIT_GL_TEST_CONFIG_BEGIN
> +
> +    config.supports_gl_compat_version = 30;
> +    config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DOUBLE;
> +
> +PIGLIT_GL_TEST_CONFIG_END
> +
> +/* Debug helpers */
> +#define MSAA 1
> +#define DEBUG_WITH_BLIT 0
> +#define DISPLAY_AVERAGE 0
> +
> +#define MAX_SAMPLES 32
> +
> +static const char *vs_src_draw =
> +       "#version 130 \n"
> +       "in vec4 pos;\n"
> +       "void main() { \n"
> +       "   gl_Position = pos; \n"
> +       "} \n";
> +
> +static const char *fs_src_draw =
> +       "#version 130 \n"
> +       "out vec4 frag_color; \n"
> +       "void main() { \n"
> +       "   frag_color = vec4(0.9, 0.8, 0, 1); \n"
> +       "} \n";
> +
> +static const char *vs_src_readback =
> +       "#version 130 \n"
> +       "in vec4 pos; \n"
> +       "in vec2 coord_vs;\n"
> +       "out vec2 coord_fs;\n"
> +       "void main() { \n"
> +       "   gl_Position = pos; \n"
> +       "   coord_fs = coord_vs; \n"
> +       "} \n";
> +
> +static const char *fs_src_readback =
> +       "#version 130 \n"
> +       "#extension GL_ARB_texture_multisample : require\n"
> +#if MSAA
> +       "uniform sampler2DMS tex; \n"
> +#else
> +       "uniform sampler2D tex; \n"
> +#endif
> +       "uniform int samplePos; \n"
> +       "in vec2 coord_fs; \n"
> +       "out vec4 frag_color; \n"
> +       "void main() { \n"
> +#if MSAA
> +       "   frag_color = texelFetch(tex, ivec2(coord_fs), samplePos); \n"
> +#else
> +       "   frag_color = texture2D(tex, coord_fs / 31.0); \n"
> +#endif
> +       "} \n";
> +
> +static GLuint tex;
> +static GLuint fbo;
> +static GLuint readback_prog, draw_prog;
> +static GLint sample_pos_uniform;
> +static GLint draw_pos_attr, readback_pos_attr, readback_texcoord_attr;
> +static int num_samples = 0;
> +
> +
> +enum piglit_result
> +piglit_display(void)
> +{
> +       static const GLfloat tri_verts[3][2] = {
> +               { -0.8, -1 },
> +               { 0.8, -0.9 },
> +               { 0.1, 1}
> +       };
> +       static const GLfloat quad_verts[4][2] = {
> +               { -1, -1 },
> +               {  1, -1 },
> +               {  1,  1 },
> +               { -1,  1 }
> +       };
> +       static const GLfloat quad_texcoords[4][2] = {
> +               { 0, 0 },
> +               { 31, 0 },
> +               { 31, 31 },
> +               { 0, 31 }
> +       };
> +       unsigned i, j, num_diffs;
> +       GLfloat *images[MAX_SAMPLES], *average;
> +
> +       for (i = 0; i < num_samples; i++) {
> +               images[i] = malloc(32 * 32 * 4 * sizeof(GLfloat));
> +       }
> +       average = malloc(32 * 32 * 4 * sizeof(GLfloat));
> +
> +       glViewport(0, 0, 32, 32);
> +
> +       /* Draw triangle into MSAA texture */
> +       glBindFramebuffer(GL_FRAMEBUFFER, fbo);
> +       glClearColor(0.5f, 0.5f, 0.5f, 0.0f);
> +       glClear(GL_COLOR_BUFFER_BIT);
> +       piglit_check_gl_error(GL_NO_ERROR);
> +
> +       glUseProgram(draw_prog);
> +       glVertexAttribPointer(draw_pos_attr, 2, GL_FLOAT,
> +                             GL_FALSE, 0, tri_verts);
> +       glEnableVertexAttribArray(draw_pos_attr);
> +       glDrawArrays(GL_TRIANGLES, 0, 3);
> +       glDisableVertexAttribArray(draw_pos_attr);
> +
> +       piglit_check_gl_error(GL_NO_ERROR);
> +
> +       /* Read back samples:
> +        * Draw textured quad into main framebuffer using texture samples
> +        * from the MSAA texture.  Then use glReadPixels to get the samples.
> +        */
> +       glBindFramebuffer(GL_FRAMEBUFFER, 0);
> +       glClearColor(0.25, 0.25, 0.25, 0);
> +       glClear(GL_COLOR_BUFFER_BIT);
> +       glUseProgram(readback_prog);
> +
> +#if DEBUG_WITH_BLIT
> +       /* Blit from MSAA texture/FBO to window */
> +       glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
> +       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
> +       glBlitFramebuffer(0, 0, 31, 31,
> +                         0, 0, 31, 31,
> +                         GL_COLOR_BUFFER_BIT, GL_NEAREST);
> +#else
> +       for (i = 0; i < num_samples; i++) {
> +               /* fetch the i-th sample */
> +               glUniform1i(sample_pos_uniform, i);
> +
> +               glVertexAttribPointer(readback_pos_attr, 2, GL_FLOAT,
> +                                     GL_FALSE, 0, quad_verts);
> +               glVertexAttribPointer(readback_texcoord_attr, 2, GL_FLOAT,
> +                                     GL_FALSE, 0, quad_texcoords);
> +               glEnableVertexAttribArray(readback_pos_attr);
> +               glEnableVertexAttribArray(readback_texcoord_attr);
> +               glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
> +               glDisableVertexAttribArray(readback_pos_attr);
> +               glDisableVertexAttribArray(readback_texcoord_attr);
> +
> +               glReadPixels(0, 0, 32, 32, GL_RGBA, GL_FLOAT, images[i]);
> +       }
> +#endif
> +
> +       piglit_check_gl_error(GL_NO_ERROR);
> +
> +       /* compare sample images.
> +        * There should be some differences.
> +        */
> +       num_diffs = 0;
> +       for (j = 0; j < 32 * 32; j++) {
> +               for (i = 1; i < num_samples; i++) {
> +                       /* compare samples at [j] */
> +                       if (images[i][j*4+0] != images[0][j*4+0]) {
> +                               num_diffs++;
> +                               if (0)
> +                               printf("diff at pixel %u: sample[%u]=%g vs"
> +                                      " sample[%d]=%g\n",
> +                                      j,
> +                                      i, images[i][j*4+0],
> +                                      0, images[0][j*4+0]);
> +                       }
> +               }
> +       }
> +
> +       if (num_diffs == 0) {
> +               fprintf(stderr,
> +                       "There was no difference among the %d samples\n",
> +                       num_samples);
> +               fflush(stderr);
> +       }
> +
> +#if DISPLAY_AVERAGE
> +       /* "Resolve" the msaa image by computing the average of the samples. */
> +       for (j = 0; j < 32 * 32 * 4; j++) {
> +               float sum = 0.0f;
> +               for (i = 0; i < num_samples; i++) {
> +                       sum += images[i][j];
> +               }
> +               average[j] = sum / num_samples;
> +       }
> +
> +       glUseProgram(0);
> +       glDrawPixels(32, 32, GL_RGBA, GL_FLOAT, average);
> +#endif
> +
> +       piglit_present_results();
> +
> +       /* clean up */
> +       for (i = 0; i < num_samples; i++) {
> +               free(images[i]);
> +       }
> +       free(average);
> +
> +       return num_diffs ? PIGLIT_PASS : PIGLIT_FAIL;
> +}
> +
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> +       GLuint max_samples;
> +       GLint tex_uniform;
> +
> +#if MSAA
> +       piglit_require_extension("GL_ARB_texture_multisample");
> +#endif
> +
> +       if (argc < 2) {
> +               fprintf(stderr, "%s <sample_count>\n", argv[0]);
> +               piglit_report_result(PIGLIT_FAIL);
> +       }
> +#if MSAA
> +       num_samples = strtoul(argv[1], NULL, 0);
> +       glGetIntegerv(GL_MAX_SAMPLES, (GLint *)&max_samples);
> +       if (num_samples > max_samples)
> +               piglit_report_result(PIGLIT_SKIP);
> +#else
> +       num_samples = 1;
> +#endif
> +
> +       assert(num_samples <= MAX_SAMPLES);
> +
> +       piglit_check_gl_error(GL_NO_ERROR);
> +
> +       /* create MSAA tex and fbo */
> +       glGenTextures(1, &tex);
> +#if MSAA
> +       glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex);
> +       glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, num_samples,
> +                               GL_RGBA8,
> +                               32, 32, GL_TRUE);
> +#else
> +       glBindTexture(GL_TEXTURE_2D, tex);
> +       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
> +       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
> +       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,
> +                    32, 32, 0,
> +                    GL_RGBA, GL_FLOAT, NULL);
> +#endif
> +
> +       glGenFramebuffers(1, &fbo);
> +       glBindFramebuffer(GL_FRAMEBUFFER, fbo);
> +       glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
> +#if MSAA
> +                              GL_TEXTURE_2D_MULTISAMPLE,
> +#else
> +                              GL_TEXTURE_2D,
> +#endif
> +                              tex, 0);
> +       glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
> +
> +       assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) ==
> +              GL_FRAMEBUFFER_COMPLETE);
> +
> +       /* create sample readback shader */
> +       readback_prog = piglit_build_simple_program(vs_src_readback,
> +                                                   fs_src_readback);
> +       glUseProgram(readback_prog);
> +       tex_uniform = glGetUniformLocation(readback_prog, "tex");
> +       glUniform1i(tex_uniform, 0); /* unit 0 */
> +       sample_pos_uniform = glGetUniformLocation(readback_prog, "samplePos");
> +       readback_pos_attr = glGetAttribLocation(readback_prog, "pos");
> +       readback_texcoord_attr = glGetAttribLocation(readback_prog, "coord_vs");
> +
> +       /* create triangle drawing shader */
> +       draw_prog = piglit_build_simple_program(vs_src_draw, fs_src_draw);
> +       glUseProgram(draw_prog);
> +       draw_pos_attr = glGetAttribLocation(draw_prog, "pos");
> +
> +       if (!piglit_check_gl_error(GL_NO_ERROR))
> +               piglit_report_result(PIGLIT_FAIL);
> +
> +       glEnable(GL_MULTISAMPLE);
> +}
> --
> 1.7.10.4
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit


More information about the Piglit mailing list