[Piglit] [PATCH V2] Add test to verify 'centroid' qualifier is ignored in case of persample shading

Anuj Phogat anuj.phogat at gmail.com
Thu Jan 23 15:56:27 PST 2014


Here is what it tests:
Enable sample shading for the whole fragment shader using OpenGL API
glEnable(GL_SAMPLE_SHADING);
glMinSampleShading(1.0);

fragment shader:
centroid in vec4 b;
main()
{
  ...
}

Variable 'b' should be interpolated at sample's location.

V2: Use just one 'in' variable with the 'centroid' qualifier.
Another test already covers the interpolation of 'in' variable
without any 'qualifier'. This change also captures the mesa bug
reported on i965 driver:
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=73915

Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
Cc: Chris Forbes <chrisf at ijw.co.nz>
---
 tests/all.py                                       |   5 +
 .../arb_sample_shading/execution/CMakeLists.gl.txt |   1 +
 .../execution/ignore-centroid-qualifier.cpp        | 193 +++++++++++++++++++++
 3 files changed, 199 insertions(+)
 create mode 100644 tests/spec/arb_sample_shading/execution/ignore-centroid-qualifier.cpp

diff --git a/tests/all.py b/tests/all.py
index 459bcca..5fceff9 100644
--- a/tests/all.py
+++ b/tests/all.py
@@ -1789,6 +1789,11 @@ for num_samples in MSAA_SAMPLE_COUNTS:
     executable = 'arb_sample_shading-{0} -auto'.format(test_name)
     arb_sample_shading[test_name] = PlainExecTest(executable)
 
+for num_samples in MSAA_SAMPLE_COUNTS:
+    test_name = 'ignore-centroid-qualifier {0}'.format(num_samples)
+    executable = 'arb_sample_shading-{0} -auto'.format(test_name)
+    arb_sample_shading[test_name] = PlainExecTest(executable)
+
 import_glsl_parser_tests(spec['ARB_sample_shading'],
                          os.path.join(testsDir, 'spec', 'arb_sample_shading'),
                          ['compiler'])
diff --git a/tests/spec/arb_sample_shading/execution/CMakeLists.gl.txt b/tests/spec/arb_sample_shading/execution/CMakeLists.gl.txt
index 9a72439..c3690e9 100644
--- a/tests/spec/arb_sample_shading/execution/CMakeLists.gl.txt
+++ b/tests/spec/arb_sample_shading/execution/CMakeLists.gl.txt
@@ -16,4 +16,5 @@ piglit_add_executable (arb_sample_shading-builtin-gl-sample-id builtin-gl-sample
 piglit_add_executable (arb_sample_shading-builtin-gl-sample-mask builtin-gl-sample-mask.cpp)
 piglit_add_executable (arb_sample_shading-builtin-gl-sample-position builtin-gl-sample-position.cpp)
 piglit_add_executable (arb_sample_shading-interpolate-at-sample-position interpolate-at-sample-position.cpp)
+piglit_add_executable (arb_sample_shading-ignore-centroid-qualifier ignore-centroid-qualifier.cpp)
 # vim: ft=cmake:
diff --git a/tests/spec/arb_sample_shading/execution/ignore-centroid-qualifier.cpp b/tests/spec/arb_sample_shading/execution/ignore-centroid-qualifier.cpp
new file mode 100644
index 0000000..cb54655
--- /dev/null
+++ b/tests/spec/arb_sample_shading/execution/ignore-centroid-qualifier.cpp
@@ -0,0 +1,193 @@
+/*
+ * Copyright (c) 2014 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 ignore-centroid-qualifier.cpp
+ *
+ * Tests that all 'in' variables in fragment shader are interpolated at sample
+ * positions when using per sample shading. Ignore the 'centroid' qualifier if
+ * used with 'in' variable.
+ *
+ */
+#include "piglit-util-gl-common.h"
+#include "piglit-fbo.h"
+
+using namespace piglit_util_fbo;
+const int pattern_width = 128; const int pattern_height = 128;
+
+PIGLIT_GL_TEST_CONFIG_BEGIN
+	config.supports_gl_compat_version = 21;
+	config.supports_gl_core_version = 31;
+        config.window_width = 2 * pattern_width;
+        config.window_height = pattern_height;
+	config.window_visual = PIGLIT_GL_VISUAL_DOUBLE | PIGLIT_GL_VISUAL_RGBA;
+
+PIGLIT_GL_TEST_CONFIG_END
+
+static Fbo multisampled_fbo;
+static int sample_pos_loc, sample_id_loc, num_samples;
+static int draw_prog_left, draw_prog_right, test_prog;
+
+enum piglit_result
+piglit_display(void)
+{
+	float pos[2];
+	bool result = true, pass = true;
+
+	glBindFramebuffer(GL_DRAW_FRAMEBUFFER, multisampled_fbo.handle);
+	glClear(GL_COLOR_BUFFER_BIT);
+
+	/* Draw test image in to left half of multisample fbo*/
+	glUseProgram(draw_prog_left);
+	glViewport(0, 0, pattern_width, pattern_height);
+	glEnable(GL_SAMPLE_SHADING);
+	glMinSampleShading(1.0);
+	piglit_draw_rect(-1, -1, 2, 2);
+	glDisable(GL_SAMPLE_SHADING);
+
+	for(int i = 0; i < num_samples; i++) {
+		/* Draw reference image in to right half of multisample fbo */
+		glUseProgram(draw_prog_right);
+		glBindFramebuffer(GL_DRAW_FRAMEBUFFER, multisampled_fbo.handle);
+		glGetMultisamplefv(GL_SAMPLE_POSITION, i, pos);
+		glUniform2fv(sample_pos_loc, 1, pos);
+		glEnable(GL_SCISSOR_TEST);
+		glScissor(pattern_width, 0, pattern_width, pattern_height);
+		glViewport(pattern_width, 0, pattern_width, pattern_height);
+		glClear(GL_COLOR_BUFFER_BIT);
+		piglit_draw_rect(-1, -1, 2, 2);
+		glDisable(GL_SCISSOR_TEST);
+
+		/* Draw sample color from multisample texture in to winsys fbo */
+		glUseProgram(test_prog);
+		glUniform1i(sample_id_loc, i);
+		glViewport(0, 0, 2 * pattern_width, pattern_height);
+		glBindFramebuffer(GL_DRAW_FRAMEBUFFER, piglit_winsys_fbo);
+		glClear(GL_COLOR_BUFFER_BIT);
+		piglit_draw_rect(-1, -1, 2, 2);
+
+		result = piglit_probe_rect_halves_equal_rgba(0, 0,
+							     piglit_width,
+							     piglit_height);
+		pass = pass && result;
+		printf("sample_id = %d, result = %s\n", i,
+		       result ? "pass" : "fail");
+	}
+	piglit_present_results();
+	return pass ? PIGLIT_PASS : PIGLIT_FAIL;
+}
+
+static void
+print_usage_and_exit(char *prog_name)
+{
+        printf("Usage: %s <num_samples>\n", prog_name);
+        piglit_report_result(PIGLIT_FAIL);
+}
+
+void
+piglit_init(int argc, char**argv)
+{
+	if (argc != 2)
+		print_usage_and_exit(argv[0]);
+
+	/* 1st arg: num_samples */
+	char *endptr = NULL;
+	num_samples = strtol(argv[1], &endptr, 0);
+	if (endptr != argv[1] + strlen(argv[1]))
+		print_usage_and_exit(argv[0]);
+
+	piglit_require_extension("GL_ARB_texture_multisample");
+	piglit_require_extension("GL_ARB_sample_shading");
+	piglit_require_GLSL_version(130);
+
+	/* Skip the test if num_samples > GL_MAX_SAMPLES */
+	GLint max_samples;
+	glGetIntegerv(GL_MAX_SAMPLES, &max_samples);
+	if (num_samples == 0 || num_samples > max_samples)
+		piglit_report_result(PIGLIT_SKIP);
+
+	FboConfig msConfig(num_samples, piglit_width, piglit_height);
+        msConfig.attach_texture = true;
+	multisampled_fbo.setup(msConfig);
+
+	/* Reduced tolerence for stricter color matching */
+	piglit_set_tolerance_for_bits(16, 16, 16, 16);
+	draw_prog_left = piglit_build_simple_program(
+		"#version 130\n"
+		"#extension GL_ARB_sample_shading: require\n"
+		"in vec4 piglit_vertex;\n"
+		"centroid out vec2 test;\n"
+		"void main() {\n"
+		"	gl_Position = piglit_vertex;\n"
+		"	test = piglit_vertex.xy;\n"
+		"}\n",
+
+		"#version 130\n"
+		"#extension GL_ARB_sample_shading: require\n"
+		"centroid in vec2 test;\n"
+		"void main() {\n"
+		"	gl_FragColor = vec4(abs(test), 0, 1);\n"
+		"}\n");
+
+	draw_prog_right = piglit_build_simple_program(
+		"#version 130\n"
+		"uniform vec2 sample_pos;\n"
+		"in vec4 piglit_vertex;\n"
+		"out vec2 ref;\n"
+		"void main() {\n"
+		"	gl_Position = piglit_vertex;\n"
+		"	ref = piglit_vertex.xy;\n"
+			/* Add an offset to account for interplolation
+			 * at sample position.
+			 */
+		"	ref += (sample_pos - 0.5) / 64;\n"
+		"}\n",
+
+		"#version 130\n"
+		"in vec2 ref;\n"
+		"void main() {\n"
+		"	gl_FragColor = vec4(abs(ref), 0, 1);\n"
+		"}\n");
+	sample_pos_loc = glGetUniformLocation(draw_prog_right, "sample_pos");
+
+	test_prog = piglit_build_simple_program(
+		"#version 130\n"
+		"in vec4 piglit_vertex;\n"
+		"void main() {\n"
+		"	gl_Position = piglit_vertex;\n"
+		"}\n",
+
+		"#version 130\n"
+		"#extension GL_ARB_texture_multisample: require\n"
+		"uniform int sample_id;\n"
+		"uniform sampler2DMS tex;\n"
+		"void main() {\n"
+		"	gl_FragColor =  texelFetch(tex, ivec2(gl_FragCoord.xy),\n"
+		"				   sample_id);\n"
+		"}\n");
+
+	glUseProgram(test_prog);
+	glUniform1i(glGetUniformLocation(test_prog, "tex"), 0);
+	sample_id_loc = glGetUniformLocation(test_prog, "sample_id");
+}
+
-- 
1.8.3.1



More information about the Piglit mailing list