---
 tests/all.tests                                  |    6 +
 tests/spec/ext_texture_integer/CMakeLists.gl.txt |    1 +
 tests/spec/ext_texture_integer/fbo-blending.c    |  329 ++++++++++++++++++++++
 3 files changed, 336 insertions(+), 0 deletions(-)
 create mode 100644 tests/spec/ext_texture_integer/fbo-blending.c

diff --git a/tests/all.tests b/tests/all.tests
index cc2d2ce..8d99252 100644
--- a/tests/all.tests
+++ b/tests/all.tests
@@ -1342,6 +1342,8 @@ spec['EXT_texture_integer'] = ext_texture_integer
 ext_texture_integer['api-drawpixels'] = 
concurrent_test('ext_texture_integer-api-drawpixels')
 ext_texture_integer['api-teximage'] = 
concurrent_test('ext_texture_integer-api-teximage')
 ext_texture_integer['api-readpixels'] = 
concurrent_test('ext_texture_integer-api-readpixels')
+ext_texture_integer['fbo-blending'] = 
concurrent_test('ext_texture_integer-fbo-blending')
+ext_texture_integer['fbo-blending GL_ARB_texture_rg'] = 
concurrent_test('ext_texture_integer-fbo-blending GL_ARB_texture_rg')
 ext_texture_integer['fbo_integer_precision_clear'] = 
plain_test('ext_texture_integer-fbo_integer_precision_clear')
 ext_texture_integer['fbo_integer_readpixels_sint_uint'] = 
plain_test('ext_texture_integer-fbo_integer_readpixels_sint_uint')
 ext_texture_integer['texture_integer_glsl130'] = 
concurrent_test('ext_texture_integer-texture_integer_glsl130')
@@ -1370,6 +1372,10 @@ add_texwrap_test2(arb_texture_rg, '2D', 'GL_RG16F')
 add_texwrap_test2(arb_texture_rg, '2D', 'GL_R32F')
 add_texwrap_test2(arb_texture_rg, '2D', 'GL_RG32F')
 
+ext_texture_rgb10_a2ui = Group()
+spec['EXT_texture_rgb10_a2ui'] = ext_texture_rgb10_a2ui
+ext_texture_rgb10_a2ui['fbo-blending'] = 
concurrent_test('ext_texture_integer-fbo-blending GL_ARB_texture_rgb10_a2ui')
+
 ext_texture_shared_exponent = Group()
 spec['EXT_texture_shared_exponent'] = ext_texture_shared_exponent
 add_fbo_generatemipmap_extension(ext_texture_shared_exponent, 
'GL_EXT_texture_shared_exponent', 'fbo-generatemipmap-formats')
diff --git a/tests/spec/ext_texture_integer/CMakeLists.gl.txt 
b/tests/spec/ext_texture_integer/CMakeLists.gl.txt
index 52ca4f2..4849ed1 100644
--- a/tests/spec/ext_texture_integer/CMakeLists.gl.txt
+++ b/tests/spec/ext_texture_integer/CMakeLists.gl.txt
@@ -13,6 +13,7 @@ link_libraries (
        ${GLUT_glut_LIBRARY}
 )
 
+add_executable (ext_texture_integer-fbo-blending fbo-blending.c)
 add_executable (ext_texture_integer-fbo_integer_precision_clear 
fbo-integer-precision-clear.c)
 add_executable (ext_texture_integer-fbo_integer_readpixels_sint_uint 
fbo-integer-readpixels-sint-uint.c)
 add_executable (ext_texture_integer-texture_integer_glsl130 
texture-integer-glsl130.c)
diff --git a/tests/spec/ext_texture_integer/fbo-blending.c 
b/tests/spec/ext_texture_integer/fbo-blending.c
new file mode 100644
index 0000000..013da7b
--- /dev/null
+++ b/tests/spec/ext_texture_integer/fbo-blending.c
@@ -0,0 +1,329 @@
+/*
+ * Copyright © 2011 Intel Corporation
+ * Copyright (c) 2010 VMware, Inc.
+ * 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 fbo-blending.c
+ *
+ * From the GL_EXT_texture_integer spec:
+ *
+ *     "Per-fragment operations that require floating-point color
+ *      components, including multisample alpha operations, alpha test,
+ *      blending, and dithering, have no effect when the corresponding
+ *      colors are written to an integer color buffer."
+ *
+ * This test covers alpha test, blending, and dithering.  All formats
+ * tested due to failures in i965 differing based on render target
+ * format.
+ */
+
+
+#include "piglit-util.h"
+
+int piglit_width = 100, piglit_height = 100;
+int piglit_window_mode = GLUT_RGB | GLUT_ALPHA | GLUT_DOUBLE;
+
+static GLuint tex;
+static int color_loc;
+/* Numbers chosen to always avoid clamping -- we should test that in
+ * some other test.
+ */
+static const uint32_t color[4] = {
+       0x5,
+       0x4,
+       0x3,
+       0x2,
+};
+
+struct format_info {
+       const char *name;
+       GLenum internal_format, base_format;
+       int size;
+       bool sign;
+};
+
+
+/* Only test 32-bit formats - since you won't see precision problems on lower 
sizes */
+static const struct format_info formats[] = {
+       { "GL_RGBA8I_EXT",   GL_RGBA8I_EXT,   GL_RGBA_INTEGER_EXT, 8,  GL_TRUE  
},
+       { "GL_RGBA8UI_EXT",  GL_RGBA8UI_EXT , GL_RGBA_INTEGER_EXT, 8,  GL_FALSE 
},
+       { "GL_RGBA16I_EXT",  GL_RGBA16I_EXT,  GL_RGBA_INTEGER_EXT, 16, GL_TRUE  
},
+       { "GL_RGBA16UI_EXT", GL_RGBA16UI_EXT, GL_RGBA_INTEGER_EXT, 16, GL_FALSE 
},
+       { "GL_RGBA32I_EXT",  GL_RGBA32I_EXT,  GL_RGBA_INTEGER_EXT, 32, GL_TRUE  
},
+       { "GL_RGBA32UI_EXT", GL_RGBA32UI_EXT, GL_RGBA_INTEGER_EXT, 32, GL_FALSE 
},
+
+       { "GL_RGBA8I_EXT (bgra)",   GL_RGBA8I_EXT,   GL_BGRA_INTEGER_EXT, 8,  
GL_TRUE  },
+       { "GL_RGBA8UI_EXT (bgra)",  GL_RGBA8UI_EXT , GL_BGRA_INTEGER_EXT, 8,  
GL_FALSE },
+       { "GL_RGBA16I_EXT (bgra)",  GL_RGBA16I_EXT,  GL_BGRA_INTEGER_EXT, 16, 
GL_TRUE  },
+       { "GL_RGBA16UI_EXT (bgra)", GL_RGBA16UI_EXT, GL_BGRA_INTEGER_EXT, 16, 
GL_FALSE },
+       { "GL_RGBA32I_EXT (bgra)",  GL_RGBA32I_EXT,  GL_BGRA_INTEGER_EXT, 32, 
GL_TRUE  },
+       { "GL_RGBA32UI_EXT (bgra)", GL_RGBA32UI_EXT, GL_BGRA_INTEGER_EXT, 32, 
GL_FALSE },
+
+       { "GL_RGB8I_EXT",   GL_RGB8I_EXT,   GL_RGB_INTEGER_EXT, 8,  GL_TRUE  },
+       { "GL_RGB8UI_EXT",  GL_RGB8UI_EXT , GL_RGB_INTEGER_EXT, 8,  GL_FALSE },
+       { "GL_RGB16I_EXT",  GL_RGB16I_EXT,  GL_RGB_INTEGER_EXT, 16, GL_TRUE  },
+       { "GL_RGB16UI_EXT", GL_RGB16UI_EXT, GL_RGB_INTEGER_EXT, 16, GL_FALSE },
+       { "GL_RGB32I_EXT",  GL_RGB32I_EXT,  GL_RGB_INTEGER_EXT, 32, GL_TRUE  },
+       { "GL_RGB32UI_EXT", GL_RGB32UI_EXT, GL_RGB_INTEGER_EXT, 32, GL_FALSE },
+
+       { "GL_ALPHA8I_EXT",   GL_ALPHA8I_EXT,   GL_ALPHA_INTEGER_EXT, 8,  
GL_TRUE  },
+       { "GL_ALPHA8UI_EXT",  GL_ALPHA8UI_EXT , GL_ALPHA_INTEGER_EXT, 8,  
GL_FALSE },
+       { "GL_ALPHA16I_EXT",  GL_ALPHA16I_EXT,  GL_ALPHA_INTEGER_EXT, 16, 
GL_TRUE  },
+       { "GL_ALPHA16UI_EXT", GL_ALPHA16UI_EXT, GL_ALPHA_INTEGER_EXT, 16, 
GL_FALSE },
+       { "GL_ALPHA32I_EXT",  GL_ALPHA32I_EXT,  GL_ALPHA_INTEGER_EXT, 32, 
GL_TRUE  },
+       { "GL_ALPHA32UI_EXT", GL_ALPHA32UI_EXT, GL_ALPHA_INTEGER_EXT, 32, 
GL_FALSE },
+
+       { "GL_LUMINANCE8I_EXT",   GL_LUMINANCE8I_EXT,   
GL_LUMINANCE_INTEGER_EXT, 8,  GL_TRUE  },
+       { "GL_LUMINANCE8UI_EXT",  GL_LUMINANCE8UI_EXT , 
GL_LUMINANCE_INTEGER_EXT, 8,  GL_FALSE },
+       { "GL_LUMINANCE16I_EXT",  GL_LUMINANCE16I_EXT,  
GL_LUMINANCE_INTEGER_EXT, 16, GL_TRUE  },
+       { "GL_LUMINANCE16UI_EXT", GL_LUMINANCE16UI_EXT, 
GL_LUMINANCE_INTEGER_EXT, 16, GL_FALSE },
+       { "GL_LUMINANCE32I_EXT",  GL_LUMINANCE32I_EXT,  
GL_LUMINANCE_INTEGER_EXT, 32, GL_TRUE  },
+       { "GL_LUMINANCE32UI_EXT", GL_LUMINANCE32UI_EXT, 
GL_LUMINANCE_INTEGER_EXT, 32, GL_FALSE },
+
+       { "GL_LUMINANCE_ALPHA8I_EXT",   GL_LUMINANCE_ALPHA8I_EXT,   
GL_LUMINANCE_ALPHA_INTEGER_EXT, 8,  GL_TRUE  },
+       { "GL_LUMINANCE_ALPHA8UI_EXT",  GL_LUMINANCE_ALPHA8UI_EXT , 
GL_LUMINANCE_ALPHA_INTEGER_EXT, 8,  GL_FALSE },
+       { "GL_LUMINANCE_ALPHA16I_EXT",  GL_LUMINANCE_ALPHA16I_EXT,  
GL_LUMINANCE_ALPHA_INTEGER_EXT, 16, GL_TRUE  },
+       { "GL_LUMINANCE_ALPHA16UI_EXT", GL_LUMINANCE_ALPHA16UI_EXT, 
GL_LUMINANCE_ALPHA_INTEGER_EXT, 16, GL_FALSE },
+       { "GL_LUMINANCE_ALPHA32I_EXT",  GL_LUMINANCE_ALPHA32I_EXT,  
GL_LUMINANCE_ALPHA_INTEGER_EXT, 32, GL_TRUE  },
+       { "GL_LUMINANCE_ALPHA32UI_EXT", GL_LUMINANCE_ALPHA32UI_EXT, 
GL_LUMINANCE_ALPHA_INTEGER_EXT, 32, GL_FALSE },
+
+       { "GL_INTENSITY8I_EXT",   GL_INTENSITY8I_EXT,   GL_RED_INTEGER_EXT, 8,  
GL_TRUE  },
+       { "GL_INTENSITY8UI_EXT",  GL_INTENSITY8UI_EXT , GL_RED_INTEGER_EXT, 8,  
GL_FALSE },
+       { "GL_INTENSITY16I_EXT",  GL_INTENSITY16I_EXT,  GL_RED_INTEGER_EXT, 16, 
GL_TRUE  },
+       { "GL_INTENSITY16UI_EXT", GL_INTENSITY16UI_EXT, GL_RED_INTEGER_EXT, 16, 
GL_FALSE },
+       { "GL_INTENSITY32I_EXT",  GL_INTENSITY32I_EXT,  GL_RED_INTEGER_EXT, 32, 
GL_TRUE  },
+       { "GL_INTENSITY32UI_EXT", GL_INTENSITY32UI_EXT, GL_RED_INTEGER_EXT, 32, 
GL_FALSE },
+};
+
+static const struct format_info rg_formats[] = {
+       { "GL_RG8I",   GL_RG8I,   GL_RG_INTEGER, 8,  GL_TRUE  },
+       { "GL_RG8UI",  GL_RG8UI , GL_RG_INTEGER, 8,  GL_FALSE },
+       { "GL_RG16I",  GL_RG16I,  GL_RG_INTEGER, 16, GL_TRUE  },
+       { "GL_RG16UI", GL_RG16UI, GL_RG_INTEGER, 16, GL_FALSE },
+       { "GL_RG32I",  GL_RG32I,  GL_RG_INTEGER, 32, GL_TRUE  },
+       { "GL_RG32UI", GL_RG32UI, GL_RG_INTEGER, 32, GL_FALSE },
+       { "GL_R8I",   GL_R8I,   GL_RED_INTEGER, 8,  GL_TRUE  },
+       { "GL_R8UI",  GL_R8UI , GL_RED_INTEGER, 8,  GL_FALSE },
+       { "GL_R16I",  GL_R16I,  GL_RED_INTEGER, 16, GL_TRUE  },
+       { "GL_R16UI", GL_R16UI, GL_RED_INTEGER, 16, GL_FALSE },
+       { "GL_R32I",  GL_R32I,  GL_RED_INTEGER, 32, GL_TRUE  },
+       { "GL_R32UI", GL_R32UI, GL_RED_INTEGER, 32, GL_FALSE },
+};
+
+static const struct format_info rgb10_formats[] = {
+       { "GL_RGB10_A2UI", GL_RGB10_A2UI, GL_RGBA_INTEGER_EXT, 10, GL_FALSE },
+       { "GL_RGB10_A2UI (bgra)", GL_RGB10_A2UI, GL_BGRA_INTEGER_EXT, 10, 
GL_FALSE },
+       { "GL_RGB10_A2UI (rev)", GL_RGB10_A2UI, GL_RGBA_INTEGER_EXT, 10, 
GL_TRUE },
+       { "GL_RGB10_A2UI (rev bgra)", GL_RGB10_A2UI, GL_BGRA_INTEGER_EXT, 10, 
GL_TRUE },
+};
+
+static GLenum
+get_datatype(const struct format_info *info)
+{
+       switch (info->size) {
+       case 8:
+               return info->sign ? GL_BYTE : GL_UNSIGNED_BYTE;
+       case 16:
+               return info->sign ? GL_SHORT : GL_UNSIGNED_SHORT;
+       case 32:
+               return info->sign ? GL_INT : GL_UNSIGNED_INT;
+       default:
+               assert(0);
+               return 0;
+       }
+}
+
+static void
+usage(void)
+{
+       fprintf(stderr, "usage:\n");
+       fprintf(stderr,
+               "ext_texture_integer-fbo-blending "
+               "[GL_ARB_texture_rg | GL_ARB_texture_rgb10_a2ui]\n");
+       exit(1);
+}
+
+/** \return GL_TRUE for pass, GL_FALSE for fail */
+static GLboolean
+test_format(const struct format_info *info)
+{
+       const GLenum type = get_datatype(info);
+       GLenum status;
+       uint32_t expected_color[4];
+
+       printf("%s:\n", info->name);
+
+       /* Create texture */
+       glTexImage2D(GL_TEXTURE_2D, 0, info->internal_format, 1, 1, 0,
+                    info->base_format, type, NULL);
+       glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
+                              GL_TEXTURE_2D, tex, 0);
+
+       status = glCheckFramebufferStatus(GL_FRAMEBUFFER_EXT);
+       if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
+               printf("  framebuffer incomplete.\n");
+               return PIGLIT_SKIP;
+       }
+
+       piglit_draw_rect(-1, -1, 2, 2);
+
+       memcpy(expected_color, color, sizeof(color));
+       switch (info->base_format) {
+       case GL_RGBA_INTEGER:
+       case GL_BGRA_INTEGER:
+               break;
+       case GL_RGB_INTEGER:
+               expected_color[3] = 1;
+               break;
+       case GL_LUMINANCE_INTEGER_EXT:
+               expected_color[1] = expected_color[0];
+               expected_color[2] = expected_color[0];
+               expected_color[3] = 1;
+               break;
+       case GL_LUMINANCE_ALPHA_INTEGER_EXT:
+               expected_color[1] = expected_color[0];
+               expected_color[2] = expected_color[0];
+               break;
+       case GL_RED_INTEGER:
+               if (strstr(info->name, "INTENSITY")) {
+                       expected_color[1] = expected_color[0];
+                       expected_color[2] = expected_color[0];
+                       expected_color[3] = expected_color[0];
+               } else {
+                       expected_color[1] = 0;
+                       expected_color[2] = 0;
+                       expected_color[3] = 1;
+               }
+               break;
+       case GL_RG_INTEGER:
+               expected_color[2] = 0;
+               expected_color[3] = 1;
+               break;
+       default:
+               abort();
+       }
+
+       if (piglit_probe_rect_rgba_uint(0, 0, 1, 1, expected_color))
+               return PIGLIT_PASS;
+       else {
+               printf("  Input color: %d %d %d %d\n",
+                      color[0], color[1], color[2], color[3]);
+               return PIGLIT_FAIL;
+       }
+}
+
+
+enum piglit_result
+piglit_display(void)
+{
+       /* unreached */
+       return PIGLIT_FAIL;
+}
+
+
+void
+piglit_init(int argc, char **argv)
+{
+       GLuint fbo;
+       static const char *vs_source =
+               "#version 130\n"
+               "void main()\n"
+               "{\n"
+               "   gl_Position = gl_Vertex;\n"
+               "}\n";
+       static const char *fs_source =
+               "#version 130\n"
+               "uniform uvec4 color;\n"
+               "out uvec4 result;\n"
+               "void main()\n"
+               "{\n"
+               "   result = color;\n"
+               "}\n";
+       GLuint fs, vs, prog;
+       int f, i;
+       enum piglit_result result = PIGLIT_SKIP;
+       const struct format_info *test_formats = formats;
+       int num_test_formats = ARRAY_SIZE(formats);
+
+       for (i = 1; i < argc; i++) {
+               if (strcmp(argv[i], "GL_ARB_texture_rg") == 0) {
+                       piglit_require_extension(argv[i]);
+                       test_formats = rg_formats;
+                       num_test_formats = ARRAY_SIZE(rg_formats);
+               } else if (strcmp(argv[i], "GL_ARB_texture_rgb10_a2ui") == 0) {
+                       piglit_require_extension(argv[i]);
+                       test_formats = rgb10_formats;
+                       num_test_formats = ARRAY_SIZE(rgb10_formats);
+               } else {
+                       usage();
+                       exit(1);
+               }
+       }
+
+       if (argc > 1) {
+       }
+
+       piglit_require_extension("GL_EXT_texture_integer");
+       piglit_require_GLSL_version(130);
+
+       fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, fs_source);
+       vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vs_source);
+       prog = piglit_link_simple_program(vs, fs);
+       if (!prog || !fs || !vs)
+               piglit_report_result(PIGLIT_FAIL);
+       glUseProgram(prog);
+       color_loc = glGetUniformLocation(prog, "color");
+       glUniform4uiv(color_loc, 1, color);
+
+       glGenFramebuffers(1, &fbo);
+       glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+
+       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);
+
+       glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
+
+       /* Turn on all the knobs (except multisample alpha, which
+        * we'll leave to an EXT_framebuffer_multisample test) that
+        * are supposed to be ignored.
+        */
+       glEnable(GL_BLEND);
+       glBlendFunc(GL_ZERO, GL_ZERO);
+
+       glEnable(GL_DITHER);
+
+       glEnable(GL_ALPHA_TEST);
+       glAlphaFunc(GL_NEVER, 1);
+
+       for (f = 0; f < num_test_formats; f++)
+               piglit_merge_result(&result, test_format(&test_formats[f]));
+
+       glBindFramebuffer(GL_FRAMEBUFFER, 0);
+       glDeleteFramebuffers(1, &fbo);
+
+       piglit_report_result(result);
+}
-- 
1.7.7.3

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to