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 <[email protected]> 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 <[email protected]> --- 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 [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
