[Piglit] [PATCH 2/2] Transform feedback: Test error conditions.

Shuang He shuang.he at intel.com
Fri Jan 6 20:10:48 PST 2012


On 2012/1/5 6:47, Paul Berry wrote:
> On 4 January 2012 13:36, Ian Romanick <idr at freedesktop.org 
> <mailto:idr at freedesktop.org>> wrote:
>
>     On 01/02/2012 02:32 PM, Paul Berry wrote:
>
>         This test verifies that the implementation correctly detects
>         all of
>         the errors specified in the "Errors" section of the
>         EXT_transform_feedback spec, with the following exceptions
>         (which seem
>         like they should be handled in separate tests):
>
>         - Errors related to BeginQuery and EndQuery.
>
>         - Error due to mismatch of transform feedback mode and drawing
>         mode
>           (e.g. drawing GL_LINES when transform feedback is expecting
>           GL_TRIANGLES).
>
>         - Errors due to exceeding
>         MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTIBS in
>           a call to TransformFeedbackVaryings,
>         GetTransformFeedbackVarying,
>           or
>          
>         Get{Integer,Boolean}Indexedv(GL_TRANSFORM_FEEDBACK_BUFFER_BINDING).
>
>
>     Aside from one comment in the code below, the series is
>
>     Reviewed-by: Ian Romanick <ian.d.romanick at intel.com
>     <mailto:ian.d.romanick at intel.com>>
>
>     For future tests, I think we should structure them differently.
>      Tests like this can be hard to follow because you have to look in
>     N places to see what each subtest actually does.  I'm not sure
>     what the right answer is, or I'd suggest using it for this test. :)
>
>
> Yeah, I know where you're coming from.  The difficulty seems to be 
> that the tests need to all do nearly the same thing, each with a 
> special exception.  How do we avoid duplicating all the stuff that's 
> nearly the same, while at the same time making it easy to understand 
> each subtest?
>
> I'll try to experiment with other designs; let me know if you have any 
> ideas.
>
>
>
>         ---
>          tests/all.tests                                    |   18 +
>          .../spec/ext_transform_feedback/CMakeLists.gl.txt  |    1 +
>          tests/spec/ext_transform_feedback/api-errors.c     |  377
>         ++++++++++++++++++++
>          3 files changed, 396 insertions(+), 0 deletions(-)
>          create mode 100644 tests/spec/ext_transform_feedback/api-errors.c
>
>         diff --git a/tests/all.tests b/tests/all.tests
>         index 9002ada..0290f4c 100644
>         --- a/tests/all.tests
>         +++ b/tests/all.tests
>         @@ -1392,6 +1392,24 @@ ext_timer_query['time-elapsed'] =
>         concurrent_test('ext_timer_query-time-elapsed'
>
>          ext_transform_feedback = Group()
>          spec['EXT_transform_feedback'] = ext_transform_feedback
>         +for mode in ['interleaved_ok_base', 'interleaved_ok_range',
>         +             'interleaved_ok_offset', 'interleaved_unbound',
>         +             'interleaved_no_varyings', 'separate_ok_1',
>         +             'separate_unbound_0_1', 'separate_ok_2',
>         'separate_unbound_0_2',
>         +             'separate_unbound_1_2', 'separate_no_varyings',
>         'no_prog_active',
>         +             'begin_active', 'useprog_active',
>         'link_current_active',
>         +             'link_other_active', 'bind_base_active',
>         'bind_range_active',
>         +             'bind_offset_active', 'end_inactive',
>         'bind_base_max',
>         +             'bind_range_max', 'bind_offset_max',
>         'bind_range_size_m4',
>         +             'bind_range_size_0', 'bind_range_size_1',
>         'bind_range_size_2',
>         +             'bind_range_size_3', 'bind_range_size_5',
>         'bind_range_offset_1',
>         +             'bind_range_offset_2', 'bind_range_offset_3',
>         +             'bind_range_offset_5', 'bind_offset_offset_1',
>         +             'bind_offset_offset_2', 'bind_offset_offset_3',
>         +             'bind_offset_offset_5', 'not_a_program']:
>         +        test_name = 'api-errors {0}'.format(mode)
>         +        ext_transform_feedback[test_name] = PlainExecTest(
>         +                'ext_transform_feedback-{0}
>         -auto'.format(test_name))
>          for varying in ['gl_Color', 'gl_SecondaryColor', 'gl_TexCoord',
>                          'gl_FogFragCoord', 'gl_Position', 'gl_PointSize',
>                          'gl_ClipVertex', 'gl_ClipDistance']:
>         diff --git
>         a/tests/spec/ext_transform_feedback/CMakeLists.gl.txt
>         b/tests/spec/ext_transform_feedback/CMakeLists.gl.txt
>         index 8073a70..305f589 100644
>         --- a/tests/spec/ext_transform_feedback/CMakeLists.gl.txt
>         +++ b/tests/spec/ext_transform_feedback/CMakeLists.gl.txt
>         @@ -13,6 +13,7 @@ link_libraries (
>          )
>
>          add_executable (ext_transform_feedback-alignment alignment.c)
>         +add_executable (ext_transform_feedback-api-errors api-errors.c)
>          add_executable (ext_transform_feedback-builtin-varyings
>         builtin-varyings.c)
>          add_executable (ext_transform_feedback-discard-api discard-api.c)
>          add_executable (ext_transform_feedback-discard-bitmap
>         discard-bitmap.c)
>         diff --git a/tests/spec/ext_transform_feedback/api-errors.c
>         b/tests/spec/ext_transform_feedback/api-errors.c
>         new file mode 100644
>         index 0000000..486f5f4
>         --- /dev/null
>         +++ b/tests/spec/ext_transform_feedback/api-errors.c
>         @@ -0,0 +1,377 @@
>         +/*
>         + * Copyright © 2011 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 api-errors.c
>         + *
>         + * Test that the implementation flags various
>         + * transform-feedback-related error conditions.
>         + *
>         + * This test covers all of the error conditions as specified
>         in the
>         + * "Errors" section of the EXT_transform_feedback spec, with the
>         + * following exceptions:
>         + *
>         + * - Errors related to BeginQuery and EndQuery.
>         + *
>         + * - Error due to mismatch of transform feedback mode and
>         drawing mode
>         + *   (e.g. drawing GL_LINES when transform feedback is expecting
>         + *   GL_TRIANGLES).
>         + *
>         + * - Errors due to exceeding
>         MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTIBS in
>         + *   a call to TransformFeedbackVaryings,
>         GetTransformFeedbackVarying,
>         + *   or
>         + *  
>         Get{Integer,Boolean}Indexedv(GL_TRANSFORM_FEEDBACK_BUFFER_BINDING).
>         + *
>         + * In addition, there are a few tests which verify that
>         errors do not
>         + * occur during normal operation ("interleaved_ok_*",
>         "separate_ok_*",
>         + * and "link_other_active").  These tests help to verify that the
>         + * implementation is not overly aggressive in flagging errors.
>         + */
>         +
>         +#include "piglit-util.h"
>         +
>         +int piglit_width = 16;
>         +int piglit_height = 16;
>         +int piglit_window_mode = GLUT_DOUBLE | GLUT_RGB;
>         +
>         +#define XFB_BUFFER_SIZE 12
>         +#define NUM_BUFFERS 2
>         +
>         +enum test_mode {
>         +       NORMAL,
>         +       NO_VARYINGS,
>         +       UNBOUND_BUFFER,
>         +       SKIP_USE_PROGRAM,
>         +       BEGIN_ACTIVE,
>         +       USEPROG_ACTIVE,
>         +       LINK_CURRENT_ACTIVE,
>         +       LINK_OTHER_ACTIVE,
>         +       BIND_ACTIVE,
>         +       END_INACTIVE,
>         +       BIND_MAX,
>         +       BIND_BAD_SIZE,
>         +       BIND_BAD_OFFSET,
>         +       NOT_A_PROGRAM,
>         +};
>         +
>         +enum bind_mode {
>         +       BASE,
>         +       RANGE,
>         +       OFFSET,
>         +};
>         +
>         +static const char *vstext =
>         +       "varying vec4 foo;\n"
>         +       "varying vec4 bar;\n"
>         +       "\n"
>         +       "void main()\n"
>         +       "{\n"
>         +       "  foo = vec4(1.0);\n"
>         +       "  bar = vec4(1.0);\n"
>         +       "  gl_Position = vec4(1.0);\n"
>         +       "}\n";
>         +
>         +static const char *varyings[] = { "foo", "bar" };
>         +
>         +static struct test_desc
>         +{
>         +       const char *name;
>         +       enum test_mode mode;
>         +       int param;
>         +       enum bind_mode bind_mode;
>         +       GLenum buffer_mode;
>         +       int num_buffers;
>         +       GLboolean skip_use_program;
>         +} tests[] = {
>         +       /* name                      mode                
>         param                               num_buffers
>         +        *                                                  
>          bind_mode
>         +        *                                                    
>                buffer_mode
>         +        */
>         +       { "interleaved_ok_base",     NORMAL,               0,
>         BASE,   GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "interleaved_ok_range",    NORMAL,               0,
>         RANGE,  GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "interleaved_ok_offset",   NORMAL,               0,
>         OFFSET, GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "interleaved_unbound",     UNBOUND_BUFFER,       0,
>         BASE,   GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "interleaved_no_varyings", NO_VARYINGS,          0,
>         BASE,   GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "separate_ok_1",           NORMAL,               0,
>         BASE,   GL_SEPARATE_ATTRIBS,    1 },
>         +       { "separate_unbound_0_1",    UNBOUND_BUFFER,       0,
>         BASE,   GL_SEPARATE_ATTRIBS,    1 },
>         +       { "separate_ok_2",           NORMAL,               0,
>         BASE,   GL_SEPARATE_ATTRIBS,    2 },
>         +       { "separate_unbound_0_2",    UNBOUND_BUFFER,       0,
>         BASE,   GL_SEPARATE_ATTRIBS,    2 },
>         +       { "separate_unbound_1_2",    UNBOUND_BUFFER,       1,
>         BASE,   GL_SEPARATE_ATTRIBS,    2 },
>         +       { "separate_no_varyings",    NO_VARYINGS,          0,
>         BASE,   GL_SEPARATE_ATTRIBS,    1 },
>         +       { "no_prog_active",          SKIP_USE_PROGRAM,     0,
>         BASE,   GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "begin_active",            BEGIN_ACTIVE,         0,
>         BASE,   GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "useprog_active",          USEPROG_ACTIVE,       0,
>         BASE,   GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "link_current_active",     LINK_CURRENT_ACTIVE,  0,
>         BASE,   GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "link_other_active",       LINK_OTHER_ACTIVE,    0,
>         BASE,   GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "bind_base_active",        BIND_ACTIVE,          0,
>         BASE,   GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "bind_range_active",       BIND_ACTIVE,          0,
>         RANGE,  GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "bind_offset_active",      BIND_ACTIVE,          0,
>         OFFSET, GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "end_inactive",            END_INACTIVE,         0,
>         BASE,   GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "bind_base_max",           BIND_MAX,             0,
>         BASE,   GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "bind_range_max",          BIND_MAX,             0,
>         RANGE,  GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "bind_offset_max",         BIND_MAX,             0,
>         OFFSET, GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "bind_range_size_m4",      BIND_BAD_SIZE,       -4,
>         RANGE,  GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "bind_range_size_0",       BIND_BAD_SIZE,        0,
>         RANGE,  GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "bind_range_size_1",       BIND_BAD_SIZE,        1,
>         RANGE,  GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "bind_range_size_2",       BIND_BAD_SIZE,        2,
>         RANGE,  GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "bind_range_size_3",       BIND_BAD_SIZE,        3,
>         RANGE,  GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "bind_range_size_5",       BIND_BAD_SIZE,        5,
>         RANGE,  GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "bind_range_offset_1",     BIND_BAD_OFFSET,      1,
>         RANGE,  GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "bind_range_offset_2",     BIND_BAD_OFFSET,      2,
>         RANGE,  GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "bind_range_offset_3",     BIND_BAD_OFFSET,      3,
>         RANGE,  GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "bind_range_offset_5",     BIND_BAD_OFFSET,      5,
>         RANGE,  GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "bind_offset_offset_1",    BIND_BAD_OFFSET,      1,
>         OFFSET, GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "bind_offset_offset_2",    BIND_BAD_OFFSET,      2,
>         OFFSET, GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "bind_offset_offset_3",    BIND_BAD_OFFSET,      3,
>         OFFSET, GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "bind_offset_offset_5",    BIND_BAD_OFFSET,      5,
>         OFFSET, GL_INTERLEAVED_ATTRIBS, 1 },
>         +       { "not_a_program",           NOT_A_PROGRAM,        0,
>         BASE,   GL_INTERLEAVED_ATTRIBS, 1 },
>         +};
>         +
>         +static void
>         +do_bind(const struct test_desc *test, GLuint buf, int i)
>         +{
>         +       int size = test->mode == BIND_BAD_SIZE
>         +               ? test->param : sizeof(float[XFB_BUFFER_SIZE]);
>         +       int offset = test->mode == BIND_BAD_OFFSET
>         +               ? test->param : 0;
>         +
>         +       switch (test->bind_mode) {
>         +       case BASE:
>         +               printf("BindBufferBase(buffer %i)\n", i);
>         +              
>         piglit_BindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, i, buf);
>         +               break;
>         +       case RANGE:
>         +               printf("BindBufferRange(buffer %i, offset=%i,
>         size=%i)\n", i,
>         +                      offset, size);
>         +              
>         piglit_BindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, i, buf,
>         +                                      offset, size);
>         +               break;
>         +       case OFFSET:
>         +               printf("BindBufferOffsetEXT(buffer %i,
>         offset=%i)\n", i,
>         +                      offset);
>         +              
>         glBindBufferOffsetEXT(GL_TRANSFORM_FEEDBACK_BUFFER, i, buf,
>         +                                     offset);
>         +               break;
>         +       }
>         +}
>         +
>         +static GLboolean
>         +do_test(const struct test_desc *test)
>         +{
>         +       GLuint vs;
>         +       GLuint progs[2];
>         +       GLuint bufs[NUM_BUFFERS];
>         +       float initial_xfb_buffer_contents[XFB_BUFFER_SIZE];
>         +       GLboolean pass = GL_TRUE;
>         +       int i;
>         +       int num_varyings = test->mode == NO_VARYINGS ? 0 :
>         test->num_buffers;
>         +       GLint max_separate_attribs;
>         +
>         +       glGetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS,
>         + &max_separate_attribs);
>         +       printf("MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTIBS=%i\n",
>         +              max_separate_attribs);
>         +
>         +       printf("Compile vertex shader\n");
>         +       vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vstext);
>         +       if (test->mode == NOT_A_PROGRAM) {
>         +               printf("Create a buffer to use instead of a
>         program\n");
>         +               glGenBuffers(1, progs);
>         +       } else {
>         +               progs[0] = piglit_CreateProgram();
>         +               piglit_AttachShader(progs[0], vs);
>         +       }
>
>
>     This may work, but it's a bit sketchy.  Each kind of object from a
>     Gen function or Create function is in a separate namespace.  It is
>     conceivable that the name from GenBuffers and the handle from
>     CreateProgram could have the same value.  It should work in this
>     case because no program has ever been created.
>
>     A better approach is to create a program and immediately delete
>     it. Since the program was never used, the delete will take effect
>     immediately.  As long as there are no intervening CreateProgram
>     calls, you can be sure the deleted program will be invalid.
>
>
> Ah, I didn't realize that.  I'll make the fix and retest on both Mesa 
> and nVidia before pushing the patch.

Oh, didn't notice you have been working on writing such a test, while 
I'm trying to reproduce the segmentation fault triggered by Oglconform 
case (GL30)transform_feedback(negative.noShaders)
Please ignore my little case just sent (Also that oglconform case passed 
now)

Thanks
     --Shuang


>
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/piglit/attachments/20120107/2ff5be9c/attachment-0001.html>


More information about the Piglit mailing list