[Piglit] [PATCH 4/9] arb_direct_state_access: Added glGetTransformFeedback* tests

Laura Ekstrand laura at jlekstrand.net
Fri Feb 27 10:16:52 PST 2015


Same comments as on the previous patch, otherwise good :)

On Fri, Feb 27, 2015 at 7:31 AM, Martin Peres <martin.peres at linux.intel.com>
wrote:

> v2: review from Tapani
> - add the copyright for Intel
> - add some documentation
> - set the minimum GL version to 2.0
> - use piglit_build_simple_program_unlinked
>
> Reviewed-by: Tapani Pälli <tapani.palli at intel.com>
>
> v3:
> - rewrite the test for GL 3.1 core (Ilia)
> - delete the copyright from vmware as none of the code is left
> - improve the cleanup at the end of the test
>
> Signed-off-by: Martin Peres <martin.peres at linux.intel.com>
> ---
>  tests/all.py                                       |   1 +
>  .../spec/arb_direct_state_access/CMakeLists.gl.txt |   1 +
>  .../arb_direct_state_access/gettransformfeedback.c | 270
> +++++++++++++++++++++
>  3 files changed, 272 insertions(+)
>  create mode 100644
> tests/spec/arb_direct_state_access/gettransformfeedback.c
>
> diff --git a/tests/all.py b/tests/all.py
> index 31c65e4..2208e8c 100644
> --- a/tests/all.py
> +++ b/tests/all.py
> @@ -3999,6 +3999,7 @@ arb_shader_atomic_counters['respecify-buffer'] =
> PiglitGLTest(['arb_shader_atomi
>  spec['ARB_direct_state_access']['create-transformfeedbacks'] =
> PiglitGLTest(['arb_direct_state_access-create-transformfeedbacks'],
> run_concurrent=True)
>  spec['ARB_direct_state_access']['transformfeedback-bufferbase'] =
> PiglitGLTest(['arb_direct_state_access-transformfeedback-bufferbase'],
> run_concurrent=True)
>  spec['ARB_direct_state_access']['transformfeedback-bufferrange'] =
> PiglitGLTest(['arb_direct_state_access-transformfeedback-bufferrange'],
> run_concurrent=True)
> +spec['ARB_direct_state_access']['gettransformfeedback'] =
> PiglitGLTest(['arb_direct_state_access-gettransformfeedback'],
> run_concurrent=True)
>  spec['ARB_direct_state_access']['dsa-textures'] =
> PiglitGLTest(['arb_direct_state_access-dsa-textures'], run_concurrent=True)
>  spec['ARB_direct_state_access']['texturesubimage'] =
> PiglitGLTest(['arb_direct_state_access-texturesubimage'],
> run_concurrent=True)
>  spec['ARB_direct_state_access']['bind-texture-unit'] =
> PiglitGLTest(['arb_direct_state_access-bind-texture-unit'],
> run_concurrent=True)
> diff --git a/tests/spec/arb_direct_state_access/CMakeLists.gl.txt
> b/tests/spec/arb_direct_state_access/CMakeLists.gl.txt
> index 8ae8275..a6232e3 100644
> --- a/tests/spec/arb_direct_state_access/CMakeLists.gl.txt
> +++ b/tests/spec/arb_direct_state_access/CMakeLists.gl.txt
> @@ -12,6 +12,7 @@ link_libraries (
>  piglit_add_executable (arb_direct_state_access-create-transformfeedbacks
> create-transformfeedbacks.c)
>  piglit_add_executable
> (arb_direct_state_access-transformfeedback-bufferbase
> transformfeedback-bufferbase.c)
>  piglit_add_executable
> (arb_direct_state_access-transformfeedback-bufferrange
> transformfeedback-bufferrange.c)
> +piglit_add_executable (arb_direct_state_access-gettransformfeedback
> gettransformfeedback.c)
>  piglit_add_executable (arb_direct_state_access-dsa-textures
> dsa-textures.c dsa-utils.c)
>  piglit_add_executable (arb_direct_state_access-texturesubimage
> texturesubimage.c)
>  piglit_add_executable (arb_direct_state_access-bind-texture-unit
> bind-texture-unit.c)
> diff --git a/tests/spec/arb_direct_state_access/gettransformfeedback.c
> b/tests/spec/arb_direct_state_access/gettransformfeedback.c
> new file mode 100644
> index 0000000..dafc235
> --- /dev/null
> +++ b/tests/spec/arb_direct_state_access/gettransformfeedback.c
> @@ -0,0 +1,270 @@
> +/*
> + * Copyright © 2015 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 gettransformfeedback.c
> + * Simple transform feedback test drawing GL_POINTS and checking that all
> the
> + * state is well reported by the GetTransformFeedback*() functions.
> + *
> + * Greatly inspired from ext_transform_feedback/points.c.
> + *
> + * From OpenGL 4.5, section 22.4 "Transform Feedback State Queries", page
> 552:
> + *
> + * "void GetTransformFeedbackiv(uint xfb, enum pname, int *param);
> + * void GetTransformFeedbacki v(uint xfb, enum pname, uint index, int
> *param);
> + * void GetTransformFeedbacki64 v(uint xfb, enum pname,uint index,
> + *                                int64 *param);
> + *
> + * xfb must be zero, indicating the default transform feedback object, or
> the
> + * name of an existing transform feedback object. pname must be one of the
> + * tokens listed in table 23.48, depending on the command name as shown
> in the
> + * errors section below. For indexed state, index is the index of the
> transform
> + * feedback stream. param is the address of a variable to receive the
> result of
> + * the query.
> + *
> + * Errors
> + * An INVALID_OPERATION error is generated by GetTransformFeedback* if
> xfb is
> + *  not zero or the name of an existing transform feedback object.
> + * An INVALID_ENUM error is generated by GetTransformFeedbackiv if pname
> is not
> + *  TRANSFORM_FEEDBACK_PAUSED or TRANSFORM_FEEDBACK_ACTIVE.
> + * An INVALID_ENUM error is generated by GetTransformFeedbacki v if pname
> is
> + *  not TRANSFORM_FEEDBACK_BUFFER_BINDING.
> + * An INVALID_ENUM error is generated by GetTransformFeedbacki64 v if
> pname is
> + *  not TRANSFORM_FEEDBACK_BUFFER_START or TRANSFORM_FEEDBACK_BUFFER_SIZE.
> + * An INVALID_VALUE error is generated by GetTransformFeedbacki v and
> + *  GetTransformFeedbacki64 v if index is greater than or equal to the
> number
> + *  of binding points for transform feedback, as described in section
> 6.7.1."
> + */
> +
> +#include "piglit-util-gl.h"
> +#include "dsa-utils.h"
> +
> +PIGLIT_GL_TEST_CONFIG_BEGIN
> +       config.supports_gl_core_version = 31;
> +       config.window_visual = PIGLIT_GL_VISUAL_DOUBLE |
> PIGLIT_GL_VISUAL_RGBA;
> +PIGLIT_GL_TEST_CONFIG_END
> +
> +
> +static GLuint prog;
> +static GLuint xfb_buf[3], input_buf, vao;
> +static bool pass = true;
> +
> +static const char *vstext = {
> +       "#version 140\n"
> +       "in float valIn;"
> +       "out float valOut1;"
> +       "out float valOut2;"
> +       "void main() {"
> +       "   valOut1 = valIn + 1;"
> +       "   valOut2 = valIn * 2;"
> +       "}"
> +};
> +
> +#define NUM_INPUTS 4
> +static const GLfloat inputs[NUM_INPUTS] =   {-1.0, 0.0, 1.0, 3.0};
> +static const GLfloat out1_ret[NUM_INPUTS] = { 0.0, 1.0, 2.0, 4.0};
> +static const GLfloat out2_ret[NUM_INPUTS] = {-2.0, 0.0, 2.0, 6.0};
> +
> +struct context_t {
> +       struct tbo_state_t {
> +               GLuint binding;
> +               GLint64 start;
> +               GLint64 size;
> +       } bo_state[3];
> +       bool active;
> +       bool paused;
> +} ctx;
> +
> +void
> +check_active_paused_state(const char *test_name)
> +{
> +       GLint param;
> +
> +       glGetTransformFeedbackiv(0, GL_TRANSFORM_FEEDBACK_PAUSED, &param);
> +       piglit_check_gl_error(GL_NO_ERROR);
> +       SUBTESTCONDITION(param == ctx.paused, pass, "%s: paused state
> valid",
> +                                        test_name);
> +
> +       glGetTransformFeedbackiv(0, GL_TRANSFORM_FEEDBACK_ACTIVE, &param);
> +       piglit_check_gl_error(GL_NO_ERROR);
> +       SUBTESTCONDITION(param == ctx.active, pass, "%s: active state
> valid",
> +                                        test_name);
> +}
> +
> +void
> +check_binding_state(const char *test_name)
> +{
> +       GLint64 param64;
> +       GLint param;
> +       int i;
> +
> +       for (i = 0; i < 3; i++) {
> +               glGetTransformFeedbacki_v(0,
> +
>  GL_TRANSFORM_FEEDBACK_BUFFER_BINDING,
> +                                         i, &param);
> +               piglit_check_gl_error(GL_NO_ERROR);
> +               SUBTESTCONDITION(param == ctx.bo_state[i].binding, pass,
> +                                "%s: bound buffer %i valid", test_name,
> i);
> +
> +               glGetTransformFeedbacki64_v(0,
> +
>  GL_TRANSFORM_FEEDBACK_BUFFER_START,
> +                                           i, &param64);
> +               piglit_check_gl_error(GL_NO_ERROR);
> +               SUBTESTCONDITION(param64 ==  ctx.bo_state[i].start, pass,
> +                               "%s: bound buffer %i start valid",
> test_name,
> +                                i);
> +
> +               glGetTransformFeedbacki64_v(0,
> +
>  GL_TRANSFORM_FEEDBACK_BUFFER_SIZE,
> +                                           i, &param64);
> +               piglit_check_gl_error(GL_NO_ERROR);
> +               SUBTESTCONDITION(param64 ==  ctx.bo_state[i].size, pass,
> +                                "%s: bound buffer %i size valid",
> test_name,
> +                                i);
> +       }
> +}
> +
> +void
> +check_invalid_queries()
> +{
> +       GLint64 param64;
> +       GLint param;
> +
> +       glGetTransformFeedbackiv(0, GL_TRANSFORM_FEEDBACK_BINDING, &param);
> +       SUBTEST(GL_INVALID_ENUM, pass,
> +               "glGetTransformFeedbackiv: fetch invalid attribute");
> +
> +       glGetTransformFeedbacki_v(0, GL_TRANSFORM_FEEDBACK_ACTIVE, 0,
> &param);
> +       SUBTEST(GL_INVALID_ENUM, pass,
> +               "glGetTransformFeedbacki_v: fetch invalid attribute");
> +
> +       glGetTransformFeedbacki64_v(0,
> GL_TRANSFORM_FEEDBACK_BUFFER_BINDING,
> +                                   0, &param64);
> +       SUBTEST(GL_INVALID_ENUM, pass,
> +               "glGetTransformFeedbacki64_v: fetch invalid attribute");
> +}
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> +       static const char *varyings[] = { "valOut1", "valOut2" };
> +       GLuint size, start;
> +       GLint inAttrib;
> +       int i;
> +
> +       /* Check the driver. */
> +       piglit_require_extension("GL_ARB_transform_feedback3");
> +       piglit_require_extension("GL_ARB_direct_state_access");
> +
> +       /* Create shaders. */
> +       prog = piglit_build_simple_program_unlinked(vstext, NULL);
> +       glTransformFeedbackVaryings(prog, 2, varyings,
> +                                       GL_SEPARATE_ATTRIBS);
> +       glLinkProgram(prog);
> +       if (!piglit_link_check_status(prog)) {
> +               glDeleteProgram(prog);
> +               piglit_report_result(PIGLIT_FAIL);
> +       }
> +       glUseProgram(prog);
> +
> +       /* Set up the Vertex Array Buffer */
> +       glEnable(GL_VERTEX_ARRAY);
> +       glGenVertexArrays(1, &vao);
> +       glBindVertexArray(vao);
> +
> +       /* Set up the input data buffer */
> +       glGenBuffers(1, &input_buf);
> +       glBindBuffer(GL_ARRAY_BUFFER, input_buf);
> +       glBufferData(GL_ARRAY_BUFFER, sizeof(inputs), inputs,
> GL_STATIC_DRAW);
> +       inAttrib = glGetAttribLocation(prog, "valIn");
> +       piglit_check_gl_error(GL_NO_ERROR);
> +       glVertexAttribPointer(inAttrib, 1, GL_FLOAT, GL_FALSE, 0, 0);
> +       glEnableVertexAttribArray(inAttrib);
> +
> +       /* set the initial state */
> +       ctx.active = false;
> +       ctx.paused = false;
> +       for (i = 0; i < 3; i++) {
> +               ctx.bo_state[i].binding = 0;
> +               ctx.bo_state[i].start = 0;
> +               ctx.bo_state[i].size = 0;
> +       }
> +       check_active_paused_state("initial state");
> +       check_binding_state("initial state");
> +
> +       /* Set up the transform feedback buffer */
> +       glGenBuffers(3, xfb_buf);
> +       for (i = 0; i < 2; i++) {
> +               start = rand() & 0xFC;
> +               size = 0x100 + (rand() & 0xFFC);
> +
> +               glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, xfb_buf[i]);
> +               piglit_check_gl_error(GL_NO_ERROR);
> +               glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER,
> +                                size, NULL, GL_STREAM_READ);
> +               piglit_check_gl_error(GL_NO_ERROR);
> +               glTransformFeedbackBufferRange(0, i, xfb_buf[i], start,
> size);
> +               piglit_check_gl_error(GL_NO_ERROR);
> +
> +               ctx.bo_state[i].binding = xfb_buf[i];
> +               ctx.bo_state[i].start = start;
> +               ctx.bo_state[i].size = size;
> +       }
> +
> +       check_binding_state("post-binding state");
> +}
> +
> +enum piglit_result
> +piglit_display(void)
> +{
> +       check_invalid_queries();
> +
> +       glClear(GL_COLOR_BUFFER_BIT);
> +
> +       glBeginTransformFeedback(GL_POINTS);
> +
> +       ctx.active = true;
> +       check_active_paused_state("TransformFeedback started");
> +
> +       glPauseTransformFeedback();
> +
> +       ctx.paused = true;
> +       check_active_paused_state("TransformFeedback paused");
> +
> +       glResumeTransformFeedback();
> +
> +       ctx.paused = false;
> +       check_active_paused_state("TransformFeedback resumed");
> +
> +       glEndTransformFeedback();
> +
> +       ctx.active = false;
> +       check_active_paused_state("TransformFeedback ended");
> +
> +       /* clean-up everything */
> +       glDeleteBuffers(3, xfb_buf);
> +       glDeleteBuffers(1, &input_buf);
> +       glDeleteVertexArrays(1, &vao);
> +       glDeleteProgram(prog);
> +
> +       return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> +}
> --
> 2.3.1
>
> _______________________________________________
> 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/20150227/d6a3f119/attachment-0001.html>


More information about the Piglit mailing list