[Piglit] [PATCH 2/3] ext_transform_feedback: test immediate uniform buffer reuse

Brian Paul brianp at vmware.com
Fri Jan 2 07:16:25 PST 2015


Minor nits below (which also apply to patch 1/3.)

For the series:  Reviewed-by: Brian Paul <brianp at vmware.com>

On 01/01/2015 07:17 AM, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> ---
>   tests/all.py                                       |   1 +
>   .../spec/ext_transform_feedback/CMakeLists.gl.txt  |   1 +
>   .../immediate-reuse-uniform-buffer.c               | 144 +++++++++++++++++++++
>   3 files changed, 146 insertions(+)
>   create mode 100644 tests/spec/ext_transform_feedback/immediate-reuse-uniform-buffer.c
>
> diff --git a/tests/all.py b/tests/all.py
> index 072cd23..28404b5 100644
> --- a/tests/all.py
> +++ b/tests/all.py
> @@ -3129,6 +3129,7 @@ for mode in ['main_binding', 'indexed_binding', 'buffer_start', 'buffer_size']:
>           'ext_transform_feedback-{0}'.format(test_name), run_concurrent=True)
>   ext_transform_feedback['immediate-reuse'] = PiglitGLTest('ext_transform_feedback-immediate-reuse', run_concurrent=True)
>   ext_transform_feedback['immediate-reuse-index-buffer'] = PiglitGLTest('ext_transform_feedback-immediate-reuse-index-buffer', run_concurrent=True)
> +ext_transform_feedback['immediate-reuse-uniform-buffer'] = PiglitGLTest('ext_transform_feedback-immediate-reuse-uniform-buffer', run_concurrent=True)
>   for mode in ['output', 'prims_generated', 'prims_written']:
>       for use_gs in ['', ' use_gs']:
>           test_name = 'intervening-read {0}{1}'.format(mode, use_gs)
> diff --git a/tests/spec/ext_transform_feedback/CMakeLists.gl.txt b/tests/spec/ext_transform_feedback/CMakeLists.gl.txt
> index b9ea32a..755a893 100644
> --- a/tests/spec/ext_transform_feedback/CMakeLists.gl.txt
> +++ b/tests/spec/ext_transform_feedback/CMakeLists.gl.txt
> @@ -27,6 +27,7 @@ piglit_add_executable (ext_transform_feedback-position position.c)
>   piglit_add_executable (ext_transform_feedback-points points.c)
>   piglit_add_executable (ext_transform_feedback-immediate-reuse immediate-reuse.c)
>   piglit_add_executable (ext_transform_feedback-immediate-reuse-index-buffer immediate-reuse-index-buffer.c)
> +piglit_add_executable (ext_transform_feedback-immediate-reuse-uniform-buffer immediate-reuse-uniform-buffer.c)
>   piglit_add_executable (ext_transform_feedback-interleaved interleaved.c)
>   piglit_add_executable (ext_transform_feedback-intervening-read intervening-read.c)
>   piglit_add_executable (ext_transform_feedback-max-varyings max-varyings.c)
> diff --git a/tests/spec/ext_transform_feedback/immediate-reuse-uniform-buffer.c b/tests/spec/ext_transform_feedback/immediate-reuse-uniform-buffer.c
> new file mode 100644
> index 0000000..4b93049
> --- /dev/null
> +++ b/tests/spec/ext_transform_feedback/immediate-reuse-uniform-buffer.c
> @@ -0,0 +1,144 @@
> +/*
> + * Copyright © 2011 Intel Corporation
> + * Copyright © 2014 Advanced Micro Devices, Inc.
> + *
> + * 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 immediate-reuse-uniform-buffer.c
> + *
> + * Verify that if a transform feedback output buffer is immediately re-used
> + * as an uniform buffer (changing no GL settings except for buffer bindings),
> + * rendering is correct.
> + *
> + * The test operates by using a uniform buffer <-> transform feedback loop
> + * that increments a uniform in each draw call. The test starts
> + * with value 0 and transform feedback writes (value+1). Then it uses
> + * the output as an input again and the value should be 1.
> + */
> +
> +#include "piglit-util-gl.h"
> +
> +PIGLIT_GL_TEST_CONFIG_BEGIN
> +
> +	config.supports_gl_compat_version = 10;
> +
> +	config.window_width = 256;
> +	config.window_height = 16;
> +	config.window_visual = PIGLIT_GL_VISUAL_DOUBLE | PIGLIT_GL_VISUAL_RGB;
> +
> +PIGLIT_GL_TEST_CONFIG_END
> +
> +static const char *vstext =
> +	"#version 130\n"
> +	"#extension GL_ARB_uniform_buffer_object : require\n"
> +	"varying vec4 out_color;\n"
> +	"varying int index;\n"
> +	"uniform u { int u_const; };"
> +	"\n"
> +	"void main()\n"
> +	"{\n"
> +	"  int x = 8 + 16 * u_const;\n"
> +	"  gl_Position = vec4(x / 128.0 - 1.0, 0, 0, 1);\n"
> +	"  out_color = vec4(float(u_const) / 16.0, \n"
> +	"                   float(16 - u_const) / 16.0, \n"
> +	"                   float(u_const) / 16.0, 1.0);\n"
> +	"  index = u_const + 1;\n"
> +	"}\n";
> +
> +static const char *fstext =
> +	"#version 130\n"
> +	"varying vec4 out_color;\n"
> +	"\n"
> +	"void main()\n"
> +	"{\n"
> +	"  gl_FragColor = out_color;\n"
> +	"}\n";
> +
> +static const char *varyings[] = { "index" };
> +
> +static GLuint bufs[2];
> +static GLuint prog;
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> +	GLuint vs, fs;
> +
> +	piglit_require_gl_version(30);
> +	piglit_require_extension("GL_ARB_uniform_buffer_object");
> +
> +	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);

You can simplify this code with piglit_build_simple_program_unlinked().


> +	glTransformFeedbackVaryings(prog, 1, varyings, GL_INTERLEAVED_ATTRIBS);
> +	glLinkProgram(prog);
> +	if (!piglit_link_check_status(prog)) {
> +		glDeleteProgram(prog);
> +		piglit_report_result(PIGLIT_FAIL);
> +	}
> +
> +	glGenBuffers(2, bufs);
> +}
> +
> +enum piglit_result
> +piglit_display(void)
> +{
> +	int i;
> +	GLboolean pass = GL_TRUE;

We're usually using bool/true/false in code like this now.


> +	unsigned zero = 0;
> +
> +	/* Setup program and initial buffer contents */
> +	glBindBuffer(GL_ARRAY_BUFFER, bufs[0]);
> +	glBufferData(GL_ARRAY_BUFFER, 4, &zero, GL_STREAM_COPY);
> +	glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, bufs[1]);
> +	glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 4, &zero, GL_STREAM_COPY);
> +
> +	glUseProgram(prog);
> +	glClear(GL_COLOR_BUFFER_BIT);
> +	glPointSize(16);
> +
> +	/* Draw 16 times, swapping transform feedback and uniform data
> +	 * so that transform feedback output is fed back to uniform
> +	 * input.
> +	 */
> +	for (i = 0; i < 16; ++i) {
> +		glBindBufferBase(GL_UNIFORM_BUFFER, 0, bufs[i % 2]);
> +		glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0,
> +				 bufs[(i + 1) % 2]);
> +		glBeginTransformFeedback(GL_POINTS);
> +		glDrawArrays(GL_POINTS, 0, 1);
> +		glEndTransformFeedback();
> +	}
> +
> +	/* Check that the proper gradient was drawn */
> +	for (i = 0; i < 16; ++i) {
> +		float expected_color[3] = {i/16.0, (16 - i)/16.0, i/16.0 };
> +		pass = piglit_probe_rect_rgb(16 * i, 0, 16, 16,
> +					     expected_color) && pass;
> +	}
> +
> +	piglit_present_results();
> +
> +	return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> +}
>



More information about the Piglit mailing list