[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, ¶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[] = { "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