[Piglit] [PATCH] Add test to verify interpolation at sample position

Anuj Phogat anuj.phogat at gmail.com
Thu Jan 9 15:43:42 PST 2014


ARB_sample_shading extension says:
 "When the sample shading fraction is 1.0, a separate set of colors
  and other associated data are evaluated for each sample, each set
  of values are evaluated at the sample location."

Test passes on intel hardware with mesa patch: 'i965: Use sample
barycentric coordinates with per sample shading'.

Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
Cc: Chris Forbes <chrisf at ijw.co.nz>
---
Thanks Chris for pointing to a reference test which I used to create
this test.

 tests/all.tests                                    |   5 +
 .../arb_sample_shading/execution/CMakeLists.gl.txt |   1 +
 .../execution/interpolate-at-sample-position.cpp   | 192 +++++++++++++++++++++
 3 files changed, 198 insertions(+)
 create mode 100644 tests/spec/arb_sample_shading/execution/interpolate-at-sample-position.cpp

diff --git a/tests/all.tests b/tests/all.tests
index 29d012b..d7a2393 100644
--- a/tests/all.tests
+++ b/tests/all.tests
@@ -1440,6 +1440,11 @@ for num_samples in TEST_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 = 'interpolate-at-sample-position {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 a832189..9a72439 100644
--- a/tests/spec/arb_sample_shading/execution/CMakeLists.gl.txt
+++ b/tests/spec/arb_sample_shading/execution/CMakeLists.gl.txt
@@ -15,4 +15,5 @@ piglit_add_executable (arb_sample_shading-builtin-gl-num-samples builtin-gl-num-
 piglit_add_executable (arb_sample_shading-builtin-gl-sample-id builtin-gl-sample-id.cpp)
 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)
 # vim: ft=cmake:
diff --git a/tests/spec/arb_sample_shading/execution/interpolate-at-sample-position.cpp b/tests/spec/arb_sample_shading/execution/interpolate-at-sample-position.cpp
new file mode 100644
index 0000000..253aa08
--- /dev/null
+++ b/tests/spec/arb_sample_shading/execution/interpolate-at-sample-position.cpp
@@ -0,0 +1,192 @@
+/*
+ * 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 interpolate-at-sample-position.cpp
+ *
+ * Tests that 'in' variables in fragment shader are interpolated at sample
+ * positions when using per sample shading.
+ *
+ */
+#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 piglit_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);
+
+	piglit_fbo_config 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"
+		"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"
+		"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