summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Roberts <neil@linux.intel.com>2015-07-17 14:17:27 +0100
committerNeil Roberts <neil@linux.intel.com>2015-07-23 13:49:41 +0100
commit0c0b125eda62dea434284e49373ec1a90deba01a (patch)
tree9609d4b44a264d3f426894005abbf828eea30bf3
parent3477cbfc56c3e135657cb917b93f811fedd08af5 (diff)
Test that interpolateAtSample returns different results
Adds a new test for interpolateAtSample which captures the results from the function with each different sample value and ensures that they are all different. This can be done either with a constant or non-constant value depending on whether a command line argument is given. The other tests for interpolateAtSample always use 0 as the sample ID so it's not very thorough. Using non-const sampler IDs isn't implemented in the i965 driver of Mesa but the other tests pass anyway on a release build because it is hardcoded to use sample 0. Reviewed-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--tests/all.py2
-rw-r--r--tests/spec/arb_gpu_shader5/CMakeLists.gl.txt1
-rw-r--r--tests/spec/arb_gpu_shader5/interpolateAtSample-different.c259
3 files changed, 262 insertions, 0 deletions
diff --git a/tests/all.py b/tests/all.py
index 9af40a1ac..1437194f4 100644
--- a/tests/all.py
+++ b/tests/all.py
@@ -2063,6 +2063,8 @@ with profile.group_manager(
g(['arb_gpu_shader5-interpolateAtCentroid-noperspective'])
g(['arb_gpu_shader5-interpolateAtSample'])
g(['arb_gpu_shader5-interpolateAtSample-nonconst'])
+ g(['arb_gpu_shader5-interpolateAtSample-different'])
+ g(['arb_gpu_shader5-interpolateAtSample-different', 'uniform'])
g(['arb_gpu_shader5-interpolateAtOffset'])
g(['arb_gpu_shader5-interpolateAtOffset-nonconst'])
diff --git a/tests/spec/arb_gpu_shader5/CMakeLists.gl.txt b/tests/spec/arb_gpu_shader5/CMakeLists.gl.txt
index b25c0d4a1..f6b845b7b 100644
--- a/tests/spec/arb_gpu_shader5/CMakeLists.gl.txt
+++ b/tests/spec/arb_gpu_shader5/CMakeLists.gl.txt
@@ -17,5 +17,6 @@ piglit_add_executable (arb_gpu_shader5-interpolateAtCentroid-centroid interpolat
piglit_add_executable (arb_gpu_shader5-interpolateAtCentroid-noperspective interpolateAtCentroid-noperspective.c)
piglit_add_executable (arb_gpu_shader5-interpolateAtSample interpolateAtSample.c)
piglit_add_executable (arb_gpu_shader5-interpolateAtSample-nonconst interpolateAtSample-nonconst.c)
+piglit_add_executable (arb_gpu_shader5-interpolateAtSample-different interpolateAtSample-different.c)
piglit_add_executable (arb_gpu_shader5-interpolateAtOffset interpolateAtOffset.c)
piglit_add_executable (arb_gpu_shader5-interpolateAtOffset-nonconst interpolateAtOffset-nonconst.c)
diff --git a/tests/spec/arb_gpu_shader5/interpolateAtSample-different.c b/tests/spec/arb_gpu_shader5/interpolateAtSample-different.c
new file mode 100644
index 000000000..7552d21de
--- /dev/null
+++ b/tests/spec/arb_gpu_shader5/interpolateAtSample-different.c
@@ -0,0 +1,259 @@
+/*
+ * Copyright (c) 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 interpolateAtSample-different.c
+ *
+ * Test ARB_gpu_shader5 interpolateAtSample builtin.
+ *
+ * A 1x1 multisample floating-point framebuffer is created with four
+ * samples. A fragment is then rendered into the FBO four times, once
+ * with interpolation at each different sample location. The
+ * interpolation values are written into the framebuffer and read
+ * back. They are then checked to ensure they are all different and
+ * that they all lie within the fragment.
+ *
+ * interpolateAtSample can be called with const or non-const argument.
+ * If ‘uniform’ is specified on the command line it will use a
+ * non-const argument (via a uniform).
+ */
+
+#include "piglit-util-gl.h"
+
+PIGLIT_GL_TEST_CONFIG_BEGIN
+
+ config.supports_gl_core_version = 32;
+
+ config.window_visual = PIGLIT_GL_VISUAL_DOUBLE | PIGLIT_GL_VISUAL_RGB;
+
+PIGLIT_GL_TEST_CONFIG_END
+
+#define N_SAMPLES 4
+
+static const char
+vertex_shader[] =
+ "#version 150\n"
+ "in vec2 piglit_vertex;\n"
+ "in vec2 piglit_texcoord;\n"
+ "out vec2 texcoord;\n"
+ "\n"
+ "void\n"
+ "main()\n"
+ "{\n"
+ " gl_Position = vec4(piglit_vertex, 0.0, 1.0);\n"
+ " texcoord = piglit_texcoord;\n"
+ "}\n";
+
+static const char
+fragment_shader_version[] =
+ "#version 150\n"
+ "#extension GL_ARB_gpu_shader5 : require\n";
+
+static const char
+fragment_shader[] =
+ /* Version header and define for sample_id is added outside of
+ * this string so that it can decide at runtime whether to use
+ * a uniform or a constant.
+ */
+ "in vec2 texcoord;\n"
+ "\n"
+ "void\n"
+ "main()\n"
+ "{\n"
+ " gl_FragColor.rg = interpolateAtSample(texcoord, sample_id);\n"
+ " gl_FragColor.ba = vec2(0.0, 1.0);\n"
+ "}\n";
+
+enum piglit_result
+piglit_display(void)
+{
+ /* not used */
+ return PIGLIT_FAIL;
+}
+
+static void
+create_framebuffer(int sample_count,
+ GLuint *fbo,
+ GLuint *rb)
+{
+ GLenum status;
+
+ glGenFramebuffers(1, fbo);
+ glBindFramebuffer(GL_FRAMEBUFFER, *fbo);
+ glGenRenderbuffers(1, rb);
+ glBindRenderbuffer(GL_RENDERBUFFER, *rb);
+ if (sample_count > 1)
+ glRenderbufferStorageMultisample(GL_RENDERBUFFER,
+ sample_count, /* samples */
+ GL_RG32F,
+ 1, 1 /* width/height */);
+ else
+ glRenderbufferStorage(GL_RENDERBUFFER,
+ GL_RG32F,
+ 1, 1 /* width/height */);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER,
+ GL_COLOR_ATTACHMENT0,
+ GL_RENDERBUFFER,
+ *rb);
+
+ status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
+ if (status != GL_FRAMEBUFFER_COMPLETE) {
+ fprintf(stderr, "Multisample FBO incomplete\n");
+ piglit_report_result(PIGLIT_SKIP);
+ }
+}
+
+GLuint
+create_program(int sample_id)
+{
+ char shader_source[sizeof fragment_shader +
+ sizeof fragment_shader_version +
+ 512];
+
+ strcpy(shader_source, fragment_shader_version);
+
+ if (sample_id == -1) {
+ strcat(shader_source, "uniform int sample_id;\n");
+ } else {
+ sprintf(shader_source + sizeof fragment_shader_version - 1,
+ "#define sample_id %i\n",
+ sample_id);
+ }
+
+ strcat(shader_source, fragment_shader);
+
+ return piglit_build_simple_program(vertex_shader, shader_source);
+}
+
+void
+piglit_init(int argc, char**argv)
+{
+ GLuint ms_fbo, ms_rb;
+ GLuint ss_fbo, ss_rb;
+ GLuint programs[N_SAMPLES];
+ bool use_uniform = false;
+ GLuint shader_id_location = -1;
+ GLfloat results[N_SAMPLES][2];
+ bool pass = true;
+ int i, j;
+
+ for (i = 1; i < argc; i++) {
+ if (!strcmp(argv[i], "uniform")) {
+ use_uniform = true;
+ } else {
+ fprintf(stderr, "unknown argument \"%s\"\n", argv[i]);
+ piglit_report_result(PIGLIT_FAIL);
+ }
+ }
+
+ piglit_require_extension("GL_ARB_gpu_shader5");
+ piglit_require_GLSL_version(150);
+
+ if (use_uniform) {
+ programs[0] = create_program(-1);
+ glUseProgram(programs[0]);
+ shader_id_location = glGetUniformLocation(programs[0],
+ "sample_id");
+ } else {
+ for (i = 0; i < N_SAMPLES; i++)
+ programs[i] = create_program(i);
+ }
+
+ create_framebuffer(N_SAMPLES,
+ &ms_fbo, &ms_rb);
+ create_framebuffer(1, /* sample_count */
+ &ss_fbo, &ss_rb);
+
+ glViewport(0, 0, 1, 1);
+
+ for (i = 0; i < N_SAMPLES; i++) {
+ if (use_uniform)
+ glUniform1i(shader_id_location, i);
+ else
+ glUseProgram(programs[i]);
+
+ glBindFramebuffer(GL_FRAMEBUFFER, ms_fbo);
+ glClear(GL_COLOR_BUFFER_BIT);
+ piglit_draw_rect_tex(-1, -1, 2, 2,
+ 0, 0, 1, 1);
+
+ glBindFramebuffer(GL_READ_FRAMEBUFFER, ms_fbo);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, ss_fbo);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+ glBlitFramebuffer(0, 0, /* srcX/Y0 */
+ 1, 1, /* srcX/Y1 */
+ 0, 0, /* dstX/Y0 */
+ 1, 1, /* dstX/Y1 */
+ GL_COLOR_BUFFER_BIT,
+ GL_NEAREST);
+
+ glBindFramebuffer(GL_FRAMEBUFFER, ss_fbo);
+
+ glReadPixels(0, 0, /* x/y */
+ 1, 1, /* width/height */
+ GL_RG, GL_FLOAT,
+ results[i]);
+ }
+
+ for (i = 0; i < N_SAMPLES; i++) {
+ printf("value at sample %i = %f %f\n",
+ i,
+ results[i][0],
+ results[i][1]);
+ }
+
+ /* Check that the samples are within [0, 1] */
+ for (i = 0; i < N_SAMPLES; i++) {
+ if (results[i][0] < 0.0f || results[i][0] > 1.0f ||
+ results[i][1] < 0.0f || results[i][1] > 1.0f) {
+ fprintf(stderr,
+ "results for sample %i are out of range\n",
+ i);
+ pass = false;
+ }
+ }
+
+ /* Check that all of the samples are different */
+ for (i = 1; i < N_SAMPLES; i++) {
+ for (j = 0; j < i; j++) {
+ if (results[i][0] == results[j][0] &&
+ results[i][1] == results[j][1]) {
+ fprintf(stderr,
+ "samples %i and %i have the same "
+ "value\n",
+ i, j);
+ pass = false;
+ break;
+ }
+ }
+ }
+
+ glDeleteFramebuffers(1, &ms_fbo);
+ glDeleteRenderbuffers(1, &ms_rb);
+ glDeleteFramebuffers(1, &ss_fbo);
+ glDeleteRenderbuffers(1, &ss_rb);
+
+ piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL);
+}
+