[Piglit] [PATCH] arb_texture_rgb10_a2ui: add an FBO test

Dave Airlie airlied at gmail.com
Sun Nov 27 12:39:14 PST 2011


From: Dave Airlie <airlied at redhat.com>

Since this extension requires the format for renderbuffer type, do a test
for that.

Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 .../spec/arb_texture_rgb10_a2ui/CMakeLists.gl.txt  |    1 +
 tests/spec/arb_texture_rgb10_a2ui/fbo-rgb10a2ui.c  |  354 ++++++++++++++++++++
 2 files changed, 355 insertions(+), 0 deletions(-)
 create mode 100644 tests/spec/arb_texture_rgb10_a2ui/fbo-rgb10a2ui.c

diff --git a/tests/spec/arb_texture_rgb10_a2ui/CMakeLists.gl.txt b/tests/spec/arb_texture_rgb10_a2ui/CMakeLists.gl.txt
index 683c075..a1b6259 100644
--- a/tests/spec/arb_texture_rgb10_a2ui/CMakeLists.gl.txt
+++ b/tests/spec/arb_texture_rgb10_a2ui/CMakeLists.gl.txt
@@ -13,5 +13,6 @@ link_libraries (
 )
 
 add_executable (arb_texture_rgb10_a2ui-texture texture-rgb10a2ui.c)
+add_executable (arb_texture_rgb10_a2ui-fbo fbo-rgb10a2ui.c)
 
 # vim: ft=cmake:
diff --git a/tests/spec/arb_texture_rgb10_a2ui/fbo-rgb10a2ui.c b/tests/spec/arb_texture_rgb10_a2ui/fbo-rgb10a2ui.c
new file mode 100644
index 0000000..38d7c24
--- /dev/null
+++ b/tests/spec/arb_texture_rgb10_a2ui/fbo-rgb10a2ui.c
@@ -0,0 +1,354 @@
+/*
+ * Copyright (c) 2011 Dave Airlie
+ *
+ * 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
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, 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
+ * NON-INFRINGEMENT.  IN NO EVENT SHALL VMWARE AND/OR THEIR SUPPLIERS
+ * 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
+ * Tests FBO rendering with GL_ARB_texture_rgb10_a2ui
+ */
+
+
+#include "piglit-util.h"
+
+int piglit_width = 100, piglit_height = 100;
+int piglit_window_mode = GLUT_RGB | GLUT_ALPHA | GLUT_DOUBLE;
+
+static const char *TestName = "texture-integer";
+
+static GLint TexWidth = 256, TexHeight = 256;
+
+struct format_info
+{
+   const char *Name;
+   GLenum IntFormat, BaseFormat, Type;
+};
+
+
+static const struct format_info Formats[] = {
+  { "GL_RGB10_A2UI", GL_RGB10_A2UI, GL_RGBA_INTEGER_EXT, GL_UNSIGNED_INT_10_10_10_2 },
+};
+
+#define NUM_FORMATS  (sizeof(Formats) / sizeof(Formats[0]))
+
+/* Need to declare an ivec4-valued output variable for rendering to
+ * an integer-valued color buffer.
+ */
+static const char *SimpleFragShaderText =
+   "#version 130 \n"
+   "#extension GL_EXT_gpu_shader4: enable \n"
+   "uniform ivec4 value; \n"
+   "out ivec4 out_color; \n"
+   "void main() \n"
+   "{ \n"
+   "   out_color = value; \n"
+   "} \n";
+
+static GLuint SimpleFragShader, SimpleProgram;
+
+
+/* For glDrawPixels */
+static const char *PassthroughFragShaderText =
+   "void main() \n"
+   "{ \n"
+   "   gl_FragColor = gl_Color; \n"
+   "} \n";
+
+static GLuint PassthroughFragShader, PassthroughProgram;
+
+
+static int
+num_components(GLenum format)
+{
+   switch (format) {
+   case GL_RGBA:
+   case GL_RGBA_INTEGER_EXT:
+   case GL_BGRA_INTEGER_EXT:
+      return 4;
+   case GL_RGB_INTEGER_EXT:
+      return 3;
+   case GL_ALPHA_INTEGER_EXT:
+      return 1;
+   case GL_LUMINANCE_INTEGER_EXT:
+      return 1;
+   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
+      return 2;
+   case GL_RED_INTEGER_EXT:
+      return 1;
+   default:
+      assert(0);
+      return 0;
+   }
+}
+
+
+static GLboolean
+check_error(const char *file, int line)
+{
+   GLenum err = glGetError();
+   if (err) {
+      fprintf(stderr, "%s: error 0x%x at %s:%d\n", TestName, err, file, line);
+      return GL_TRUE;
+   }
+   return GL_FALSE;
+}
+
+
+/** \return GL_TRUE for pass, GL_FALSE for fail */
+static GLboolean
+test_fbo(const struct format_info *info)
+{
+   const int max = 1023;
+   const int comps = num_components(info->BaseFormat);
+   const GLenum type = info->Type;
+   GLint f;
+   GLuint fbo, texObj;
+   GLenum status;
+   GLboolean intMode;
+   GLint buf;
+
+   if (0)
+      fprintf(stderr, "============ Testing format = %s ========\n", info->Name);
+
+   /* Create texture */
+   glGenTextures(1, &texObj);
+   glBindTexture(GL_TEXTURE_2D, texObj);
+   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+   glTexImage2D(GL_TEXTURE_2D, 0, info->IntFormat, TexWidth, TexHeight, 0,
+                info->BaseFormat, type, NULL);
+
+   if (check_error(__FILE__, __LINE__))
+      return GL_FALSE;
+
+   glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &f);
+   assert(f == info->IntFormat);
+
+
+   /* Create FBO to render to texture */
+   glGenFramebuffers(1, &fbo);
+   glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+   glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
+                          GL_TEXTURE_2D, texObj, 0);
+
+   if (check_error(__FILE__, __LINE__))
+      return GL_FALSE;
+
+   status = glCheckFramebufferStatus(GL_FRAMEBUFFER_EXT);
+   if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
+      fprintf(stderr, "%s: failure: framebuffer incomplete.\n", TestName);
+      return GL_FALSE;
+   }
+
+
+   glGetBooleanv(GL_RGBA_INTEGER_MODE_EXT, &intMode);
+   if (check_error(__FILE__, __LINE__))
+      return GL_FALSE;
+   if (!intMode) {
+      fprintf(stderr, "%s: GL_RGBA_INTEGER_MODE_EXT return GL_FALSE\n",
+              TestName);
+      return GL_FALSE;
+   }
+
+   glGetIntegerv(GL_READ_BUFFER, &buf);
+   assert(buf == GL_COLOR_ATTACHMENT0_EXT);
+   glGetIntegerv(GL_DRAW_BUFFER, &buf);
+   assert(buf == GL_COLOR_ATTACHMENT0_EXT);
+
+
+   /* test clearing */
+   if (1) {
+      static const GLint clr[4] = { 8, 7, 6, 2 };
+      GLint pix[4], i;
+
+      glClearColorIiEXT(clr[0], clr[1], clr[2], clr[3]);
+      glClear(GL_COLOR_BUFFER_BIT);
+
+      glReadPixels(5, 5, 1, 1, GL_RGBA_INTEGER_EXT, GL_INT, pix);
+
+      for (i = 0; i < comps; i++) {
+         if (pix[i] != clr[i]) {
+            fprintf(stderr, "%s: glClear failed\n", TestName);
+            fprintf(stderr, "  Texture format = %s\n", info->Name);
+            fprintf(stderr, "  Expected %d, %d, %d, %d\n",
+                    clr[0], clr[1], clr[2], clr[3]);
+            fprintf(stderr, "  Found %d, %d, %d, %d\n",
+                    pix[0], pix[1], pix[2], pix[3]);
+	    //            return GL_FALSE;
+         }
+      }
+   }
+
+
+   /* Do glDraw/ReadPixels test */
+   if (1) {
+#define W 15
+#define H 10
+      GLint image[H * W * 4], readback[H * W * 4];
+      GLint i;
+
+      for (i = 0; i < W * H * 4; i++) {
+	image[i] = (i + 3) % max;
+	if ((i % 4) == 3)
+	  image[i] = 1;
+	assert(image[i] < max);
+      }
+
+      glUseProgram(PassthroughProgram);
+      if(0)glUseProgram(SimpleProgram);
+
+      glWindowPos2i(1, 1);
+      glDrawPixels(W, H, GL_RGBA_INTEGER_EXT, GL_INT, image);
+
+      if (check_error(__FILE__, __LINE__))
+         return GL_FALSE;
+
+      glReadPixels(1, 1, W, H, GL_RGBA_INTEGER_EXT, GL_INT, readback);
+
+      if (check_error(__FILE__, __LINE__))
+         return GL_FALSE;
+
+      for (i = 0; i < W * H * 4; i++) {
+         if (readback[i] != image[i]) {
+            if (comps == 3 && i % 4 == 3 && readback[i] == 1)
+               continue; /* alpha = 1 if base format == RGB */
+
+            fprintf(stderr,
+                 "%s: glDraw/ReadPixels failed at %d.  Expected %d, found %d\n",
+                    TestName, i, image[i], readback[i]);
+            fprintf(stderr, "Texture format = %s\n", info->Name);
+            assert(0);
+            return GL_FALSE;
+         }
+      }
+#undef W
+#undef H
+   }
+
+   /* Do rendering test */
+   if (1) {
+      GLint value[4], result[4], loc, w = piglit_width, h = piglit_height;
+      GLint error = 1; /* XXX fix */
+
+      /* choose random value/color for polygon */
+      value[0] = rand() % 100;
+      value[1] = rand() % 100;
+      value[2] = rand() % 100;
+      value[3] = rand() % 3;
+
+      glUseProgram(SimpleProgram);
+      check_error(__FILE__, __LINE__);
+
+      loc = glGetUniformLocation(SimpleProgram, "value");
+      assert(loc >= 0);
+      glUniform4iv(loc, 1, value);
+      check_error(__FILE__, __LINE__);
+
+#if 0 /* allow testing on mesa until this is implemented */
+      loc = glGetFragDataLocationEXT(SimpleProgram, "out_color");
+      assert(loc >= 0);
+#endif
+
+      glBegin(GL_POLYGON);
+      glVertex2f(0, 0);
+      glVertex2f(w, 0);
+      glVertex2f(w, h);
+      glVertex2f(0, h);
+      glEnd();
+      check_error(__FILE__, __LINE__);
+
+      glReadPixels(w/2, h/2, 1, 1, GL_RGBA_INTEGER, GL_INT, result);
+      check_error(__FILE__, __LINE__);
+
+      if (info->BaseFormat == GL_RGB_INTEGER_EXT) {
+         value[3] = 1;
+      }
+
+      if (abs(result[0] - value[0]) > error ||
+          abs(result[1] - value[1]) > error ||
+          abs(result[2] - value[2]) > error ||
+          abs(result[3] - value[3]) > error) {
+         fprintf(stderr, "%s: failure with format %s:\n", TestName, info->Name);
+         fprintf(stderr, "  input value = %d, %d, %d, %d\n",
+                 value[0], value[1], value[2], value[3]);
+         fprintf(stderr, "  result color = %d, %d, %d, %d\n",
+                 result[0], result[1], result[2], result[3]);
+         return GL_FALSE;
+      }
+   }
+
+   glutSwapBuffers();
+
+   glDeleteTextures(1, &texObj);
+   glDeleteFramebuffers(1, &fbo);
+
+   return GL_TRUE;
+}
+
+
+enum piglit_result
+piglit_display(void)
+{
+   int f;
+   enum piglit_result res = PIGLIT_PASS;
+   for (f = 0; f < NUM_FORMATS; f++) {
+      GLboolean pass = test_fbo(&Formats[f]);
+      if (!pass)
+	 res = PIGLIT_FAIL;
+   }
+   return res;
+}
+
+
+void
+piglit_init(int argc, char **argv)
+{
+   bool es;
+   int glslMajor, glslMinor;
+
+   piglit_require_extension("GL_ARB_texture_rgb10_a2ui");
+   piglit_require_extension("GL_EXT_gpu_shader4");
+
+   piglit_get_glsl_version(&es, &glslMajor, &glslMinor);
+   if (glslMajor * 100 + glslMinor < 130) {
+      printf("%s requires GLSL 1.30 or later\n", TestName);
+      piglit_report_result(PIGLIT_SKIP);
+      return;
+   }
+
+   PassthroughFragShader = piglit_compile_shader_text(GL_FRAGMENT_SHADER,
+                                                      PassthroughFragShaderText);
+   assert(PassthroughFragShader);
+   PassthroughProgram = piglit_link_simple_program(0, PassthroughFragShader);
+
+
+   SimpleFragShader = piglit_compile_shader_text(GL_FRAGMENT_SHADER,
+                                                 SimpleFragShaderText);
+   assert(SimpleFragShader);
+   SimpleProgram = piglit_link_simple_program(0, SimpleFragShader);
+
+
+   (void) check_error(__FILE__, __LINE__);
+
+   piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE);
+}
-- 
1.7.7.3



More information about the Piglit mailing list