[Piglit] [PATCH 4/9] arb_direct_state_access: Added glGetTransformFeedback* tests
Martin Peres
martin.peres at linux.intel.com
Fri Feb 27 05:59:44 PST 2015
On 27/02/15 07:49, Laura Ekstrand wrote:
>
>
> On Thu, Feb 26, 2015 at 7:41 AM, Martin Peres
> <martin.peres at linux.intel.com <mailto: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
>
> Signed-off-by: Martin Peres <martin.peres at linux.intel.com
> <mailto: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 | 265
> +++++++++++++++++++++
> 3 files changed, 267 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..1e8ba96
> --- /dev/null
> +++ b/tests/spec/arb_direct_state_access/gettransformfeedback.c
> @@ -0,0 +1,265 @@
> +/*
> + * Copyright © 2014 VMware, Inc.
> + * 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_compat_version = 20;
> + config.window_visual = PIGLIT_GL_VISUAL_DOUBLE |
> PIGLIT_GL_VISUAL_RGBA;
> +PIGLIT_GL_TEST_CONFIG_END
> +
> +
> +static GLuint prog;
> +static GLuint xfb_buf[3], vert_buf;
> +static bool pass = true;
> +
> +static const char *vstext = {
> + "void main() {"
> + " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;"
> + " gl_FrontColor = vec4(0.9, 0.8, 0.7, 0.6);"
> + "}"
> +};
> +
> +#define NUM_VERTS 3
> +static const GLfloat verts[NUM_VERTS][3] =
> +{
> + {-1.0, 0.2, 0},
> + {0, 0.2, 0},
> + {1, 0.2, 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,
> ¶m);
> + piglit_check_gl_error(GL_NO_ERROR);
> + SUBTESTCONDITION(param == ctx.paused, pass, "%s: paused
> state valid",
> + test_name);
> +
> + glGetTransformFeedbackiv(0, GL_TRANSFORM_FEEDBACK_ACTIVE,
> ¶m);
> + 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, ¶m);
> + 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, ¶m64);
> + 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, ¶m64);
> + 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,
> ¶m);
> + SUBTEST(GL_INVALID_ENUM, pass,
> + "glGetTransformFeedbackiv: fetch invalid attribute");
> +
> + glGetTransformFeedbacki_v(0, GL_TRANSFORM_FEEDBACK_ACTIVE,
> 0, ¶m);
> + SUBTEST(GL_INVALID_ENUM, pass,
> + "glGetTransformFeedbacki_v: fetch invalid attribute");
> +
> + glGetTransformFeedbacki64_v(0,
> GL_TRANSFORM_FEEDBACK_BUFFER_BINDING,
> + 0, ¶m64);
> + SUBTEST(GL_INVALID_ENUM, pass,
> + "glGetTransformFeedbacki64_v: fetch invalid
> attribute");
> +}
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> + static const char *varyings[] = { "gl_Position",
> "gl_FrontColor" };
> + GLuint size, start;
> + int i;
> +
> + glMatrixMode(GL_MODELVIEW);
> + glLoadIdentity();
> + glScalef(0.5, 0.5, 1.0);
> +
> + /* Check the driver. */
> + piglit_require_gl_version(20);
> + 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 data buffer */
> + glGenBuffers(1, &vert_buf);
> + glBindBuffer(GL_ARRAY_BUFFER, vert_buf);
> + glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts,
> GL_STATIC_DRAW);
> +
> + /* 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 */
> + glCreateTransformFeedbacks(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");
> +
> + glClearColor(0.2, 0.2, 0.2, 1.0);
> +}
> +
> +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");
> +
>
> I know you copied this test from your previous one, but the actual
> transform feedback commands seem extraneous in this test. Do they do
> something that you are testing here? It's not a big deal, but it
> might make the test run faster if you take out the draw calls.
Agreed, I left it out in the new version.
> + glBindBuffer(GL_ARRAY_BUFFER, vert_buf);
> + glVertexPointer(3, GL_FLOAT, 0, 0);
> + glEnable(GL_VERTEX_ARRAY);
> + glDrawArrays(GL_POINTS, 0, 3);
> + glEndTransformFeedback();
> +
> + ctx.active = false;
> + check_active_paused_state("TransformFeedback ended");
> +
> + return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> +}
> --
> 2.3.0
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org <mailto:Piglit at lists.freedesktop.org>
> http://lists.freedesktop.org/mailman/listinfo/piglit
>
>
More information about the Piglit
mailing list