On Sunday, October 27, 2013 04:31:21 PM Ian Romanick wrote:
> On 10/18/2013 10:54 AM, Dylan Baker wrote:
> > On Friday, October 04, 2013 06:11:01 PM Ian Romanick wrote:
> >> From: Ian Romanick <ian.d.roman...@intel.com>
> >> 
> >> This covers most of the errors mentioned in the spec that aren't
> >> already covered in cannot-bind-when-active.c and
> >> gen-names-only.c. Most of the other errors should be covered by
> >> existing EXT_transform_feedback tests.
> >> 
> >> Mesa currently passes all of these tests.
> >> 
> >> NVIDIA (304.64 on GTX 260) fails several subtests.
> >> 
> >> Pause active feedback only: Incorrectly generates error in
> >> glEndTransformFeedback.
> >> 
> >> TransformFeedbackVaryings only when inactive: Doesn't generate
> >> any errors when it should.
> >> 
> >> Draw only from "ended" object: Generates GL_INVALID_VALUE
> >> instead of GL_INVALID_OPERATION.
> >> 
> >> AMD has not been tested.
> >> 
> >> v2: Convert to use piglit subtest reporting.  Fix fs_only_prog
> >> to actually only have a fragment shader attached.
> >> 
> >> v3: Quite significant re-write.  Per Paul's suggestion, each of
> >> the tests is no a subtest that can be individually selected from
> >> the command line.  This uses infrastructure in
> >> piglit-framework-gl to handle the subtests.  This also eliminates
> >> the work-around for NVIDIA's glEndTransformFeedback-while-paused
> >> bug.
> >> 
> >> The code currently in all.tests for getting the list of subtests
> >> is just a place holder.  We'll want to refactor this out
> >> somewhere else before pushing.
> >> 
> >> Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> Cc:
> >> Kenneth Graunke <kenn...@whitecape.org> Cc: Paul Berry
> >> <stereotype...@gmail.com> Cc: Dylan Baker
> >> <baker.dyla...@gmail.com> --- tests/all.tests
> >> 
> >> |   9 + .../spec/arb_transform_feedback2/CMakeLists.gl.txt |   1
> >> 
> >> + tests/spec/arb_transform_feedback2/api-errors.c    | 626
> >> +++++++++++++++++++++ 3 files changed, 636 insertions(+) create
> >> mode 100644 tests/spec/arb_transform_feedback2/api-errors.c
> >> 
> >> diff --git a/tests/all.tests b/tests/all.tests index
> >> ac95e7a..60128ec 100644 --- a/tests/all.tests +++
> >> b/tests/all.tests @@ -6,6 +6,7 @@ import os import os.path as
> >> path import platform import shlex +import subprocess
> >> 
> >> from framework.core import Group, TestProfile from
> >> framework.exectest import PlainExecTest @@ -2306,6 +2307,14 @@
> >> arb_transform_feedback2['draw-auto'] =
> >> PlainExecTest(['arb_transform_feedback2-d
> >> arb_transform_feedback2['istranformfeedback'] =
> >> PlainExecTest(['arb_transform_feedback2-istransformfeedback',
> >> '-auto']) arb_transform_feedback2['glGenTransformFeedbacks names
> >> only'] =
> >> concurrent_test('arb_transform_feedback2-gen-names-only')
> >> arb_transform_feedback2['cannot bind when another object is
> >> active'] =
> >> concurrent_test('arb_transform_feedback2-cannot-bind-when-active')
> >> + +process = subprocess.Popen([path.join(testBinDir,
> >> 'arb_transform_feedback2-api-errors'), '-list-subtests'],
> >> stdout=subprocess.PIPE) + +arb_transform_feedback2['misc. API
> >> error checks'] = {}
> > 
> > You shoudl probably use Group() instead of {} here, since that's
> > what is done in the rest of all.tests
> 
> Okay.  I didn't know that you could have a Group that contained other
> Groups, but I guess that makes sense.

Actually, all.tests is just a bunch of nested Groups. Which are in turn 
flattened before run, but that's another story...

> 
> >> +for line in process.stdout: +    [option, name] =
> >> line.split(":") +    arb_transform_feedback2['misc. API error
> >> checks'][name.strip()] =
> >> concurrent_test('arb_transform_feedback2-api-errors -subtest
> >> {0}'.format(option.strip())) + arb_transform_feedback2['misc. API
> >> queries'] =
> > 
> > If you want this to be a standard interface you should use helper
> > functions. I've split this into two functions, so that the
> > add_subtests could be used by tests that don't use the
> > -list-subtests option
> 
> That makes sense.  I like it.  Any suggestion where these functions
> should live?

We already have some helpers that live at the top of the all.tests file. That 
seems fine to me

> 
> > Here's an example:
> > 
> > def get_subtests(binary): """ Return a list of subtests """ #
> > Universal_newlines causes python to return \n for newlines
> > regardless of # the platform output =
> > subprocess.check_output([path.join(testBinDir, binary),
> > '-list-subtests'], universal_newlines=True)
> > 
> > # Strip the last newline so element[-1] != [''] return [l.split(":
> > ") for l in output.strip().split('\n')]
> > 
> > 
> > def add_subtests(group, binary, subtests,
> > test_type=concurrent_test): """ helper for adding tests with
> > subtests
> > 
> > group: a group object to store the tests in binary: The name of the
> > test binary subtests: An iterable contains iterable pairs in the
> > form: (<subtest argument>, <subtest name), such as provided by
> > get_subtests() test_type: a callable that adds a test. default:
> > concurrent_test
> > 
> > """ for value in subtests: group[value[1]] = test_type("{0}
> > -subtest {1}".format(binary, value[0]))
> > 
> > Usage would be something like this: arb_transform_feedback2['misc.
> > API error checks'] = Group()
> > add_subtests(arb_transform_feedback2['misc. API error checks'],
> > 'arb_transform_feedback2-api-errors',
> > get_subtests('arb_transform_feedback2-api-errors'))
> > 
> > I think these work, I get the same output using these helpers and
> > using your original code, which is a single test that skips.
> 
> Hmm... there should have been a bunch of tests that skip.  With
> GL_ARB_transform_feedback2 enabled (via
> 'MESA_EXTENSION_OVERRIDE=+GL_ARB_transform_feedback2'), I get a bunch
> of tests in a "misc. API queries" group and a single, dangling "misc.
> API queries" test.  Do you think the problem is that the tests report
> as subtests (using piglit_report_subtest_result) with the same name
> that add_subtests adds them as?
> 
> I haven't looked at the actual json output yet...

If they are subtests ideally the parent would skip, and none of the subtests 
would be run.

> 
> >> concurrent_test('arb_transform_feedback2-api-queries')
> >> arb_transform_feedback2['counting with pause'] =
> >> concurrent_test('arb_transform_feedback2-pause-counting')
> >> 
> >> diff --git
> >> a/tests/spec/arb_transform_feedback2/CMakeLists.gl.txt
> >> b/tests/spec/arb_transform_feedback2/CMakeLists.gl.txt index
> >> c6287a1..3d74f91 100644 ---
> >> a/tests/spec/arb_transform_feedback2/CMakeLists.gl.txt +++
> >> b/tests/spec/arb_transform_feedback2/CMakeLists.gl.txt @@ -9,6
> >> +9,7 @@ link_libraries ( ${OPENGL_glu_LIBRARY} )
> >> 
> >> +piglit_add_executable (arb_transform_feedback2-api-errors
> >> api-errors.c) piglit_add_executable
> >> (arb_transform_feedback2-api-queries api-queries.c)
> >> piglit_add_executable
> >> (arb_transform_feedback2-cannot-bind-when-active
> >> cannot-bind-when-active.c) piglit_add_executable
> >> (arb_transform_feedback2-change-objects-while-paused
> >> change-objects-while-paused.c) diff --git
> >> a/tests/spec/arb_transform_feedback2/api-errors.c
> >> b/tests/spec/arb_transform_feedback2/api-errors.c new file mode
> >> 100644 index 0000000..4858899 --- /dev/null +++
> >> b/tests/spec/arb_transform_feedback2/api-errors.c @@ -0,0 +1,626
> >> @@ +/* + * Copyright © 2012 Intel Corporation
> > 
> > It's 2013 for a few more weeks...
> 
> I've been sitting on this test since 2012. :(  git-log says:
> 
> commit 311697d49492624ab55d948a3cd289d70f693341
> Author: Ian Romanick <ian.d.roman...@intel.com>
> Date:   Sun Jul 8 01:34:47 2012 -0700
> 
> >> + * + * 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 + * Verify a handful of error
> >> conditions required by the spec. + * + * None of these subtests
> >> is large enough to warrant a separate test case. + */ + +#define
> >> PIGLIT_SUBTEST_LIST subtests + +#include
> >> "piglit-util-gl-common.h" + +static enum piglit_result
> >> delete_inactive_only(void); +static enum piglit_result
> >> paired_begin_end(void); +static enum piglit_result
> >> pause_active_only(void); +static enum piglit_result
> >> resume_paused_only(void); +static enum piglit_result
> >> vertex_shader_required(void); +static enum piglit_result
> >> change_varyings_inactive_only(void); +static enum piglit_result
> >> change_program_inactive_or_paused(void); +static enum
> >> piglit_result link_program_inactive_only(void); +static enum
> >> piglit_result resume_same_program_only(void); +static enum
> >> piglit_result draw_from_valid_object_only(void); +static enum
> >> piglit_result draw_from_ended_object_only(void); + +static const
> >> struct piglit_gl_subtest subtests[] = { +  { +             "Cannot delete
> >> while active", +           "delete-inactive-only", +
> >> delete_inactive_only +     }, +    { +             "Paired begin and end", 
> >> +
> >> "paired-begin-end", +              paired_begin_end +      }, +    { +     
> >>         "Pause active
> >> feedback only", +          "pause-active-only", +          
> >> pause_active_only +
> >> }, +       { +             "Resume paused feedback only", +
> >> "resume-paused-only", +            resume_paused_only +    }, +    { +     
> >>         
"Vertex
> >> shader required", +                "vertex-shader-required", +
> >> vertex_shader_required +   }, +    { +             
> >> "TransformFeedbackVaryings
> >> only when inactive", +             "change-varyings-inactive-only", +
> >> change_varyings_inactive_only +    }, +    { +             "Change program 
> >> only
> >> when inactive or paused", +
> >> "change-program-inactive-or-paused", +
> >> change_program_inactive_or_paused +        }, +    { +             "Link 
> >> program only
> >> when inactive", +          "link-program-inactive-only", +
> >> link_program_inactive_only +       }, +    { +             "Resume with 
> >> the same
> >> program only", +           "resume-same-program-only", +
> >> resume_same_program_only + }, +    { +             "Draw only from valid
> >> object", +         "draw-from-valid-object-only", +
> >> draw_from_valid_object_only +      }, +    { +             /* Do this one 
> >> last.  If
> >> it fails, it will delete the object +               * and cause all of the
> >> othere subtests to fail. +          */ +           "Draw only from 
> >> \"ended\"
> >> object", +         "draw-from-ended-object-only", +
> >> draw_from_ended_object_only +      }, +    { +             NULL, +         
> >> NULL, +         
NULL +
> >> } +}; + +PIGLIT_GL_TEST_CONFIG_BEGIN + +
> >> config.supports_gl_compat_version = 10; +  config.window_visual =
> >> PIGLIT_GL_VISUAL_RGB; + +PIGLIT_GL_TEST_CONFIG_END + +enum
> >> piglit_result +piglit_display(void) +{ +   return PIGLIT_FAIL; +}
> >> + +static const char vstext[] = +  "varying vec4 x;\n" +   "varying
> >> vec4 y;\n" +       "void main()\n" +       "{\n" + "    gl_Position =
> >> vec4(0);\n" +      "    x = vec4(0);\n" +  "    y = vec4(0);\n" +  "}" +
> >> ; + +static const char fstext[] = +        "void main() { gl_FragColor =
> >> vec4(0); }"; + +static const char *varyings[] = {"x"}; +static
> >> GLuint id; +static GLuint prog; +static GLuint fs_only_prog;
> >> +static GLuint buf; + +enum piglit_result
> >> delete_inactive_only(void) +{ +    bool pass = true; + +   /* The
> >> ARB_transform_feedback2 spec says: +        * +     *     "The error
> >> INVALID_OPERATION is generated by +         *
> >> DeleteTransformFeedbacks if the transform feedback operation +      *
> >> for any object named by <ids> is currently active." +       * +     *
> >> However, shortly before that it also says, +        * +     *     "If an
> >> active transform feedback object is deleted its name +      *
> >> immediately becomes unused, but the underlying object is not +      *
> >> deleted until it is no longer active." +    * +     * So, that seems a
> >> bit contradictory. +        */ +
> >> glBeginTransformFeedback(GL_TRIANGLES); +  pass =
> >> piglit_check_gl_error(0) && pass; + +
> >> glDeleteTransformFeedbacks(1, &id); +      pass =
> >> piglit_check_gl_error(GL_INVALID_OPERATION) && pass; + +
> >> glEndTransformFeedback(); +        pass = piglit_check_gl_error(0) &&
> >> pass; + +  return pass ? PIGLIT_PASS : PIGLIT_FAIL; +} + +enum
> >> piglit_result paired_begin_end(void) +{ +  bool pass = true; + +
> >> /* The ARB_transform_feedback2 spec says: +         * +     *
> >> "Transform feedback commands must be paired; the error +    *
> >> INVALID_OPERATION is generated by BeginTransformFeedback if +       *
> >> transform feedback is active, and by EndTransformFeedback if +      *
> >> transform feedback is inactive. Transform feedback is initially +
> >> *     inactive." +  * +     * The first case is already tested by
> >> the cannot-bind-when-active +       * test. +       */ +
> >> glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, id); + +
> >> glEndTransformFeedback(); +        pass =
> >> piglit_check_gl_error(GL_INVALID_OPERATION) && pass; + +
> >> glBeginTransformFeedback(GL_TRIANGLES); +  pass =
> >> piglit_check_gl_error(0) && pass; + +      glEndTransformFeedback(); +
> >> pass = piglit_check_gl_error(0) && pass; + +
> >> glEndTransformFeedback(); +        pass =
> >> piglit_check_gl_error(GL_INVALID_OPERATION) && pass; + +   return
> >> pass ? PIGLIT_PASS : PIGLIT_FAIL; +} + +enum piglit_result
> >> pause_active_only(void) +{ +       bool pass = true; + +   /* The
> >> ARB_transform_feedback2 spec says: +        * +     *     "The error
> >> INVALID_OPERATION is generated by +         *     PauseTransformFeedback
> >> if the currently bound transform +  *     feedback is not active
> >> or is paused." +    */ +   glPauseTransformFeedback(); +   pass =
> >> piglit_check_gl_error(GL_INVALID_OPERATION) && pass; + +
> >> glBeginTransformFeedback(GL_TRIANGLES); +  pass =
> >> piglit_check_gl_error(0) && pass; + +
> >> glPauseTransformFeedback(); +      pass = piglit_check_gl_error(0) &&
> >> pass; + +  glPauseTransformFeedback(); +   pass =
> >> piglit_check_gl_error(GL_INVALID_OPERATION) && pass; + +   /* There
> >> is no need for an explicit resume here.  Section 13.2.2 +   *
> >> (Transform Feedback Primitive Capture) of the OpenGL 4.3 spec
> >> says: +     * +     *     "EndTransformFeedback first performs an
> >> implicit +  *     ResumeTransformFeedback (see below) if
> >> transform feedback is +     *     paused." +        * +     * NOTE: 
> >> Previous
> >> versions of the spec had an error in this section +         * that was
> >> corrected in 4.3. +         */ +   glEndTransformFeedback(); +     pass =
> >> piglit_check_gl_error(0) && pass; + +      return pass ? PIGLIT_PASS :
> >> PIGLIT_FAIL; +} + +enum piglit_result resume_paused_only(void)
> >> +{ +       bool pass = true; + +   /* The ARB_transform_feedback2 spec
> >> says: +     * +     *     "The error INVALID_OPERATION is generated by
> >> +   *     ResumeTransformFeedback if the currently bound
> >> transform +         *     feedback is not active or is not paused." +
> >> */ +       glResumeTransformFeedback(); +  pass =
> >> piglit_check_gl_error(GL_INVALID_OPERATION) && pass; + +
> >> glBeginTransformFeedback(GL_TRIANGLES); +  pass =
> >> piglit_check_gl_error(0) && pass; + +
> >> glResumeTransformFeedback(); +     pass =
> >> piglit_check_gl_error(GL_INVALID_OPERATION) && pass; + +
> >> glPauseTransformFeedback(); +      pass = piglit_check_gl_error(0) &&
> >> pass; + +  glResumeTransformFeedback(); +  pass =
> >> piglit_check_gl_error(0) && pass; + +      glEndTransformFeedback(); +
> >> pass = piglit_check_gl_error(0) && pass; + +       return pass ?
> >> PIGLIT_PASS : PIGLIT_FAIL; +} + +enum piglit_result
> >> vertex_shader_required(void) +{ +  bool pass = true; + +   if
> >> (piglit_is_extension_supported("GL_NV_transform_feedback2")) { +
> >> piglit_report_subtest_result(PIGLIT_SKIP, +                                
> >>              "Vertex
> >> shader required"); +               return true; +  } + +   /* The
> >> ARB_transform_feedback2 spec says: +        * +     *     "The error
> >> INVALID_OPERATION is generated by +         *     BeginTransformFeedback
> >> if no vertex or geometry shader is +        *     active." +        */ +
> >> glUseProgram(fs_only_prog); + +
> >> glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, id); +      pass =
> >> piglit_check_gl_error(0) && pass; + +
> >> glBeginTransformFeedback(GL_TRIANGLES); +  pass =
> >> piglit_check_gl_error(GL_INVALID_OPERATION) && pass; + +
> >> glUseProgram(prog); + +    return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> >> +} + +enum piglit_result change_varyings_inactive_only(void) +{ +
> >> bool pass = true; + +      /* The ARB_transform_feedback2 spec says: +
> >> * +         *     "The error INVALID_OPERATION is generated: +      * +    
> >>  *
> >> * by TransformFeedbackVaryings if the current transform +   *
> >> feedback object is active, even if paused;" +       */ +
> >> glBeginTransformFeedback(GL_TRIANGLES); +  pass =
> >> piglit_check_gl_error(0) && pass; + +
> >> glTransformFeedbackVaryings(prog, 1, varyings, +
> >> GL_INTERLEAVED_ATTRIBS); + pass =
> >> piglit_check_gl_error(GL_INVALID_OPERATION) && pass; + +
> >> glPauseTransformFeedback(); +      pass = piglit_check_gl_error(0) &&
> >> pass; + +  glTransformFeedbackVaryings(prog, 1, varyings, +
> >> GL_INTERLEAVED_ATTRIBS); + pass =
> >> piglit_check_gl_error(GL_INVALID_OPERATION) && pass; + +
> >> glResumeTransformFeedback(); +     pass = piglit_check_gl_error(0) &&
> >> pass; + +  glEndTransformFeedback(); +     pass =
> >> piglit_check_gl_error(0) && pass; + +      return pass ? PIGLIT_PASS :
> >> PIGLIT_FAIL; +} + +enum piglit_result
> >> change_program_inactive_or_paused(void) +{ +       bool pass = true; +
> >> +  /* The ARB_transform_feedback2 spec says: +      * +     *     "The
> >> error INVALID_OPERATION is generated: +     * +     *         * by
> >> UseProgram if the current transform feedback object is +    *
> >> active and not paused;" +   */ +
> >> glBeginTransformFeedback(GL_TRIANGLES); +  pass =
> >> piglit_check_gl_error(0) && pass; + +
> >> glUseProgram(fs_only_prog); +      pass =
> >> piglit_check_gl_error(GL_INVALID_OPERATION) && pass; + +
> >> glPauseTransformFeedback(); +      pass = piglit_check_gl_error(0) &&
> >> pass; + +  glUseProgram(fs_only_prog); +   pass =
> >> piglit_check_gl_error(0) && pass; + +      /* Restore the program or
> >> glResumeTransformFeedback will generate an +        * error. +      */ +
> >> glUseProgram(prog); +      pass = piglit_check_gl_error(0) && pass; +
> >> +  /* Work-around drivers with glEndTransformFeedback bugs.  See +
> >> * pause_active_only above. +        */ +   glResumeTransformFeedback(); +
> >> pass = piglit_check_gl_error(0) && pass; + +
> >> glEndTransformFeedback(); +        pass = piglit_check_gl_error(0) &&
> >> pass; + +  glUseProgram(prog); +   pass = piglit_check_gl_error(0)
> >> && pass; + +       return pass ? PIGLIT_PASS : PIGLIT_FAIL; +} + +enum
> >> piglit_result link_program_inactive_only(void) +{ +        bool pass =
> >> true; + +  /* The ARB_transform_feedback2 spec says: +      * +     *
> >> "The error INVALID_OPERATION is generated: +        * +     *         * by
> >> LinkProgram if <program> is the name of a program +         *
> >> being used by one or more transform feedback objects, +     *
> >> even if the objects are not currently bound or are +        *
> >> paused;" +  */ +   glBeginTransformFeedback(GL_TRIANGLES); +       pass =
> >> piglit_check_gl_error(0) && pass; + +      glLinkProgram(prog); +  pass
> >> = piglit_check_gl_error(GL_INVALID_OPERATION) && pass; + +
> >> glPauseTransformFeedback(); +      pass = piglit_check_gl_error(0) &&
> >> pass; + +  glLinkProgram(prog); +  pass =
> >> piglit_check_gl_error(GL_INVALID_OPERATION) && pass; + +
> >> glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0); +       pass =
> >> piglit_check_gl_error(0) && pass; + +      glLinkProgram(prog); +  pass
> >> = piglit_check_gl_error(GL_INVALID_OPERATION) && pass; + +
> >> glUseProgram(0); + pass = piglit_check_gl_error(0) && pass; + +
> >> glLinkProgram(prog); +     pass =
> >> piglit_check_gl_error(GL_INVALID_OPERATION) && pass; + +
> >> glUseProgram(prog); +      pass = piglit_check_gl_error(0) && pass; +
> >> +  glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, id); +   pass =
> >> piglit_check_gl_error(0) && pass; + +      /* Work-around drivers with
> >> glEndTransformFeedback bugs.  See +         * pause_active_only above. +
> >> */ +       glResumeTransformFeedback(); +  pass =
> >> piglit_check_gl_error(0) && pass; + +      glEndTransformFeedback(); +
> >> pass = piglit_check_gl_error(0) && pass; + +       return pass ?
> >> PIGLIT_PASS : PIGLIT_FAIL; +} + +enum piglit_result
> >> resume_same_program_only(void) +{ +        bool pass = true; + +   /* The
> >> ARB_transform_feedback2 spec says: +        * +     *     "The error
> >> INVALID_OPERATION is generated: +   * +     *         * by
> >> ResumeTransformFeedback if the program object being +       *
> >> used by the current transform feedback object is not +      *
> >> active." +  */ +   glBeginTransformFeedback(GL_TRIANGLES); +       pass =
> >> piglit_check_gl_error(0) && pass; + +
> >> glPauseTransformFeedback(); +      pass = piglit_check_gl_error(0) &&
> >> pass; + +  glUseProgram(0); +      pass = piglit_check_gl_error(0) &&
> >> pass; + +  glResumeTransformFeedback(); +  pass =
> >> piglit_check_gl_error(GL_INVALID_OPERATION) && pass; + +
> >> glUseProgram(prog); +      pass = piglit_check_gl_error(0) && pass; +
> >> +  /* Work-around drivers with glEndTransformFeedback bugs.  See +
> >> * pause_active_only above. +        */ +   glResumeTransformFeedback(); +
> >> pass = piglit_check_gl_error(0) && pass; + +
> >> glEndTransformFeedback(); +        pass = piglit_check_gl_error(0) &&
> >> pass; + +  return pass ? PIGLIT_PASS : PIGLIT_FAIL; +} + +enum
> >> piglit_result draw_from_valid_object_only(void) +{ +       bool pass =
> >> true; +    GLuint bad_id; + +      /* The ARB_transform_feedback2 spec
> >> says: +     * +     *     "The error INVALID_VALUE is generated if <id>
> >> is not the name +   *     of a transform feedback object." +        */ +
> >> glGenTransformFeedbacks(1, &bad_id); + +
> >> glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, bad_id); +
> >> glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf); + +
> >> glBeginTransformFeedback(GL_TRIANGLES); +  pass =
> >> piglit_check_gl_error(0) && pass; + +      glEndTransformFeedback(); +
> >> pass = piglit_check_gl_error(0) && pass; + +
> >> glDeleteTransformFeedbacks(1, &bad_id); +  pass =
> >> piglit_check_gl_error(0) && pass; + +
> >> glDrawTransformFeedback(GL_TRIANGLES, bad_id); +   pass =
> >> piglit_check_gl_error(GL_INVALID_VALUE) && pass; + +
> >> glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, id); + +    return
> >> pass ? PIGLIT_PASS : PIGLIT_FAIL; +} + +enum piglit_result
> >> draw_from_ended_object_only(void) +{ +     bool pass = true; +     GLuint
> >> bad_id; + +        /* The ARB_transform_feedback2 spec says: +      * +    
> >>  *
> >> "The error INVALID_OPERATION is generated if +      *
> >> EndTransformFeedback has never been called while the object +       *
> >> named by <id> was bound." +         */ +   glGenTransformFeedbacks(1,
> >> &bad_id); + +      glDrawTransformFeedback(GL_TRIANGLES, bad_id); +
> >> pass = piglit_check_gl_error(GL_INVALID_OPERATION) && pass; + +
> >> glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, bad_id); +
> >> glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf); + +
> >> glBeginTransformFeedback(GL_TRIANGLES); +  pass =
> >> piglit_check_gl_error(0) && pass; + +
> >> glPauseTransformFeedback(); +      pass = piglit_check_gl_error(0) &&
> >> pass; + +  glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0); +
> >> pass = piglit_check_gl_error(0) && pass; + +
> >> glDrawTransformFeedback(GL_TRIANGLES, bad_id); +   pass =
> >> piglit_check_gl_error(GL_INVALID_OPERATION) && pass; + +
> >> glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, bad_id); +  pass =
> >> piglit_check_gl_error(0) && pass; + +      /* Work-around drivers with
> >> glEndTransformFeedback bugs.  See +         * pause_active_only above. +
> >> */ +       glResumeTransformFeedback(); +  pass =
> >> piglit_check_gl_error(0) && pass; + +      glEndTransformFeedback(); +
> >> pass = piglit_check_gl_error(0) && pass; + +
> >> glDeleteTransformFeedbacks(1, &bad_id); +  pass =
> >> piglit_check_gl_error(0) && pass; + +
> >> glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, id); + +    return
> >> pass ? PIGLIT_PASS : PIGLIT_FAIL; +} + +void piglit_init(int
> >> argc, char **argv) +{ +    GLuint vs; +    GLuint fs; +    enum
> >> piglit_result result; + +  piglit_require_transform_feedback(); +
> >> piglit_require_GLSL(); +
> >> piglit_require_extension("GL_ARB_transform_feedback2"); + +        /*
> >> This is all just the boot-strap work for the test. +        */ +
> >> glGenBuffers(1, &buf); +
> >> glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf); +
> >> glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 1024, NULL,
> >> GL_STREAM_READ); + +       vs =
> >> piglit_compile_shader_text(GL_VERTEX_SHADER, vstext); +    fs =
> >> piglit_compile_shader_text(GL_FRAGMENT_SHADER, fstext); +  prog =
> >> glCreateProgram(); +       glAttachShader(prog, vs); +
> >> glAttachShader(prog, fs); + +      glTransformFeedbackVaryings(prog,
> >> 1, varyings, +                                 GL_INTERLEAVED_ATTRIBS); +
> >> glLinkProgram(prog); +     if (!piglit_link_check_status(prog)) { +
> >> result = PIGLIT_FAIL; +            goto done; +    } + +   fs_only_prog =
> >> piglit_link_simple_program(fs, 0); +       if (fs_only_prog == 0) { +
> >> result = PIGLIT_FAIL; +            goto done; +    } + +   
> >> glUseProgram(prog);
> >> + +        glGenTransformFeedbacks(1, &id); + +
> >> glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, id); +
> >> glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf); + +
> >> glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0); + +     result =
> >> piglit_run_selected_subtests(subtests, +
> >> config.selected_subtests, +
> >> config.num_selected_subtests, +                                          
> >> PIGLIT_SKIP); + +
> >> glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0); + +done: +
> >> glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0); +
> >> glDeleteBuffers(1, &buf); + +      glDeleteTransformFeedbacks(1,
> >> &id); + +  glUseProgram(0); +      glDeleteShader(vs); +
> >> glDeleteShader(fs); +      glDeleteProgram(prog); +
> >> glDeleteProgram(fs_only_prog); + + piglit_report_result(result);
> >> +}

Attachment: signature.asc
Description: This is a digitally signed message part.

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

Reply via email to