[Piglit] [PATCH] tex-upload-scale-bias: tests texture upload with scale/bias transfer options

Iago Toral Quiroga itoral at igalia.com
Fri Feb 13 05:09:07 PST 2015


After the recent rewrite of the format conversion code in Mesa we got
a bug report for incorrect texture uploads with scale/bias trasfer
options: https://bugs.freedesktop.org/show_bug.cgi?id=89068

This was not being catched by piglit, so this patch adds a test case to
avoid similar regressions in the future.
---
 tests/all.py                          |   1 +
 tests/general/CMakeLists.gl.txt       |   1 +
 tests/general/tex-upload-scale-bias.c | 135 ++++++++++++++++++++++++++++++++++
 3 files changed, 137 insertions(+)
 create mode 100644 tests/general/tex-upload-scale-bias.c

diff --git a/tests/all.py b/tests/all.py
index d7a921a..37bbd67 100644
--- a/tests/all.py
+++ b/tests/all.py
@@ -812,6 +812,7 @@ add_plain_test(gl11, ['texture-al'])
 add_concurrent_test(gl11, ['triangle-guardband-viewport'])
 add_concurrent_test(gl11, ['getteximage-targets', '1D'])
 add_concurrent_test(gl11, ['getteximage-targets', '2D'])
+add_concurrent_test(gl11, ['tex-upload-scale-bias'])
 
 color_formats = [
     'GL_RED', 'GL_R8', 'GL_R8_SNORM', 'GL_R16', 'GL_R16_SNORM',
diff --git a/tests/general/CMakeLists.gl.txt b/tests/general/CMakeLists.gl.txt
index 4224c06..79cc980 100644
--- a/tests/general/CMakeLists.gl.txt
+++ b/tests/general/CMakeLists.gl.txt
@@ -137,5 +137,6 @@ piglit_add_executable (quad-invariance quad-invariance.c)
 piglit_add_executable (clear-accum clear-accum.c)
 piglit_add_executable (vs-point_size-zero vs-point_size-zero.c)
 piglit_add_executable (triangle-guardband-viewport triangle-guardband-viewport.c)
+piglit_add_executable (tex-upload-scale-bias tex-upload-scale-bias.c)
 
 # vim: ft=cmake:
diff --git a/tests/general/tex-upload-scale-bias.c b/tests/general/tex-upload-scale-bias.c
new file mode 100644
index 0000000..f9b9911
--- /dev/null
+++ b/tests/general/tex-upload-scale-bias.c
@@ -0,0 +1,135 @@
+/*
+ * 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.
+ */
+
+/*
+ * Test texture upload with scale and bias pixel transfer options
+ *
+ * Iago Toral Quiroga <itoral at igalia.com>
+ * Feb 13, 2015
+ */
+
+#include "piglit-util-gl.h"
+
+PIGLIT_GL_TEST_CONFIG_BEGIN
+
+	config.supports_gl_compat_version = 10;
+
+	config.window_visual = PIGLIT_GL_VISUAL_DOUBLE | PIGLIT_GL_VISUAL_RGB;
+
+PIGLIT_GL_TEST_CONFIG_END
+
+static const GLfloat colors[4] = { 0.5, 0.25, 0.1, 0.5 };
+static const GLfloat scale[4] = { 2.0, 3.0, 1.0, 1.0 };
+static const GLfloat bias[4] = { -0.25, 0.0, 0.4, 0.0 };
+
+static GLuint
+create_texture()
+{
+   GLuint tex, size, i;
+   GLfloat *image;
+
+   glGenTextures(1, &tex);
+
+   glBindTexture(GL_TEXTURE_2D, tex);
+   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+   /* Upload texture color data and apply a bias and scale
+    */
+   glPixelTransferf(GL_RED_SCALE, scale[0]);
+   glPixelTransferf(GL_RED_BIAS, bias[0]);
+   glPixelTransferf(GL_GREEN_SCALE, scale[1]);
+   glPixelTransferf(GL_GREEN_BIAS, bias[1]);
+   glPixelTransferf(GL_BLUE_SCALE, scale[2]);
+   glPixelTransferf(GL_BLUE_BIAS, bias[2]);
+   glPixelTransferf(GL_ALPHA_SCALE, scale[3]);
+   glPixelTransferf(GL_ALPHA_BIAS, bias[3]);
+
+   size = 64;
+   image = malloc(size * size * 4 * sizeof(GLfloat));
+   for (i = 0; i < size * size; i++) {
+      image[i*4+0] = colors[0];
+      image[i*4+1] = colors[1];
+      image[i*4+2] = colors[2];
+      image[i*4+3] = colors[3];
+   }
+
+   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+                size, size, 0, GL_RGBA, GL_FLOAT, image);
+
+   /* Reset pixel transfer to defaults */
+   glPixelTransferf(GL_RED_SCALE, 1.0);
+   glPixelTransferf(GL_RED_BIAS, 0.0);
+   glPixelTransferf(GL_GREEN_SCALE, 1.0);
+   glPixelTransferf(GL_GREEN_BIAS, 0.0);
+   glPixelTransferf(GL_BLUE_SCALE, 1.0);
+   glPixelTransferf(GL_BLUE_BIAS, 0.0);
+   glPixelTransferf(GL_ALPHA_SCALE, 1.0);
+   glPixelTransferf(GL_ALPHA_BIAS, 0.0);
+
+   free(image);
+
+   return tex;
+}
+
+
+enum piglit_result
+piglit_display(void)
+{
+   GLuint tex;
+   GLboolean pass;
+   GLfloat expected[4];
+   int i;
+
+   /* Create a texture and upload color data with scale and bias options */
+   glEnable(GL_TEXTURE_2D);
+   tex = create_texture();
+
+   /* Render with our texture */
+   glClear(GL_COLOR_BUFFER_BIT);
+   glBindTexture(GL_TEXTURE_2D, tex);
+   piglit_draw_rect_tex(0, 0, piglit_width, piglit_height,
+                        0.0, 0.0, 1.0, 1.0);
+
+   /* Compute expected color result after applying scale and bias.
+    * Read back pixels from the framebuffer and check that they have scale
+    * and bias applied.
+    */
+   for (i = 0; i < 4; i++)
+      expected[i] = colors[i] * scale[i] + bias[i];
+
+   pass = piglit_probe_pixel_rgba(piglit_width/2, piglit_height/2, expected);
+
+   glDeleteTextures(1, &tex);
+   glDisable(GL_TEXTURE_2D);
+
+   return pass ? PIGLIT_PASS : PIGLIT_FAIL;
+}
+
+
+void
+piglit_init(int argc, char **argv)
+{
+   piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE);
+   glClearColor(0.0, 0.0, 0.0, 1.0);
+}
-- 
1.9.1



More information about the Piglit mailing list