This doesn't test repeated copies with TextureBarrier()s in between,
but that doesn't seem like important new behavior in this extension.
---
 tests/all.py                                       |   5 +
 tests/spec/CMakeLists.txt                          |   1 +
 .../spec/mesa_tile_raster_order/CMakeLists.gl.txt  |  11 +
 tests/spec/mesa_tile_raster_order/CMakeLists.txt   |   1 +
 tests/spec/mesa_tile_raster_order/rasterorder.c    | 265 +++++++++++++++++++++
 5 files changed, 283 insertions(+)
 create mode 100644 tests/spec/mesa_tile_raster_order/CMakeLists.gl.txt
 create mode 100644 tests/spec/mesa_tile_raster_order/CMakeLists.txt
 create mode 100644 tests/spec/mesa_tile_raster_order/rasterorder.c

diff --git a/tests/all.py b/tests/all.py
index 9e3ce122bc3e..e087675cb030 100644
--- a/tests/all.py
+++ b/tests/all.py
@@ -4349,6 +4349,11 @@ with profile.test_list.group_manager(
 
 with profile.test_list.group_manager(
         PiglitGLTest,
+        grouptools.join('spec', 'mesa_tile_raster_order')) as g:
+    g(['mesa_tile_raster_order-rasterorder'])
+
+with profile.test_list.group_manager(
+        PiglitGLTest,
         grouptools.join('spec', 'oes_read_format')) as g:
     g(['oes-read-format'], run_concurrent=False)
 
diff --git a/tests/spec/CMakeLists.txt b/tests/spec/CMakeLists.txt
index 4cc6da64cd3b..15087395e64c 100644
--- a/tests/spec/CMakeLists.txt
+++ b/tests/spec/CMakeLists.txt
@@ -153,6 +153,7 @@ add_subdirectory (arb_texture_stencil8)
 add_subdirectory (arb_vertex_attrib_64bit)
 add_subdirectory (ext_framebuffer_blit)
 add_subdirectory (mesa_pack_invert)
+add_subdirectory (mesa_tile_raster_order)
 add_subdirectory (ext_texture_format_bgra8888)
 add_subdirectory (oes_draw_elements_base_vertex)
 add_subdirectory (arb_shader_draw_parameters)
diff --git a/tests/spec/mesa_tile_raster_order/CMakeLists.gl.txt 
b/tests/spec/mesa_tile_raster_order/CMakeLists.gl.txt
new file mode 100644
index 000000000000..074365e4d5fc
--- /dev/null
+++ b/tests/spec/mesa_tile_raster_order/CMakeLists.gl.txt
@@ -0,0 +1,11 @@
+include_directories(
+       ${GLEXT_INCLUDE_DIR}
+       ${OPENGL_INCLUDE_PATH}
+)
+
+link_libraries (
+       piglitutil_${piglit_target_api}
+       ${OPENGL_gl_LIBRARY}
+)
+
+piglit_add_executable (mesa_tile_raster_order-rasterorder rasterorder.c)
diff --git a/tests/spec/mesa_tile_raster_order/CMakeLists.txt 
b/tests/spec/mesa_tile_raster_order/CMakeLists.txt
new file mode 100644
index 000000000000..144a306f4e7d
--- /dev/null
+++ b/tests/spec/mesa_tile_raster_order/CMakeLists.txt
@@ -0,0 +1 @@
+piglit_include_target_api()
diff --git a/tests/spec/mesa_tile_raster_order/rasterorder.c 
b/tests/spec/mesa_tile_raster_order/rasterorder.c
new file mode 100644
index 000000000000..4bf5775d8d33
--- /dev/null
+++ b/tests/spec/mesa_tile_raster_order/rasterorder.c
@@ -0,0 +1,265 @@
+/*
+ * Copyright © 2017 Broadcom
+ *
+ * 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
+ *
+ * Basic tests of GL_MESA_tile_raster_order: overlapping copies in
+ * diagonal directions, and making sure that glIsEnabled() has the
+ * right initial defaults.
+ */
+
+#include "piglit-util-gl.h"
+
+#define W 256
+#define H 256
+
+PIGLIT_GL_TEST_CONFIG_BEGIN
+
+       config.supports_gl_compat_version = 10;
+
+       config.window_visual = PIGLIT_GL_VISUAL_DOUBLE | PIGLIT_GL_VISUAL_RGBA;
+       config.window_width = W;
+       config.window_height = H;
+
+PIGLIT_GL_TEST_CONFIG_END
+
+static const char *vs_fragcoord =
+       "attribute vec4 piglit_vertex;\n"
+       "void main()\n"
+       "{\n"
+       "       gl_Position = piglit_vertex;\n"
+       "}\n";
+
+const char *fs_fragcoord =
+       "uniform sampler2D s;\n"
+       "varying vec2 texcoord;\n"
+       "void main() {\n"
+       "       gl_FragColor = vec4((gl_FragCoord.x - 0.5) / 255.0,\n"
+       "                           (gl_FragCoord.y - 0.5) / 255.0,\n"
+       "                           0.0,\n"
+       "                           0.0);\n"
+       "}\n";
+
+static const char *vs_tex =
+       "attribute vec4 piglit_vertex;\n"
+       "attribute vec2 piglit_texcoord;\n"
+       "varying vec2 texcoord;\n"
+       "void main()\n"
+       "{\n"
+       "       gl_Position = piglit_vertex;\n"
+       "       texcoord = piglit_texcoord;\n"
+       "}\n";
+
+const char *fs_tex =
+       "uniform sampler2D s;\n"
+       "varying vec2 texcoord;\n"
+       "void main() {\n"
+       "       gl_FragColor = texture2D(s, texcoord);\n"
+       "}\n";
+
+/* Include the enums here for the moment, until we get new XML. */
+#ifndef GL_TILE_RASTER_ORDER_FIXED_MESA
+#define GL_TILE_RASTER_ORDER_FIXED_MESA          0x8BB8
+#define GL_TILE_RASTER_ORDER_INCREASING_X_MESA   0x8BB9
+#define GL_TILE_RASTER_ORDER_INCREASING_Y_MESA   0x8BBA
+#endif
+
+struct copy_desc {
+       bool inc_x, inc_y;
+       float dst_x, dst_y;
+       float src_x, src_y;
+       float w, h;
+};
+
+GLuint prog_tex, prog_fragcoord;
+
+bool
+test_one(const struct copy_desc *copy)
+{
+       uint8_t expected[W * H * 4];
+
+       printf("Testing copy from %d,%d to %d,%d (%dx%d) %cX %cY\n",
+              (int)copy->src_x, (int)copy->src_y,
+              (int)copy->dst_x, (int)copy->dst_y,
+              (int)copy->w, (int)copy->h,
+              copy->inc_x ? '+' : '-',
+              copy->inc_y ? '+' : '-');
+
+       for (int y = 0; y < H; y++) {
+               for (int x = 0; x < W; x++) {
+                       if (x >= copy->dst_x && x < copy->dst_x + copy->w &&
+                           y >= copy->dst_y && y < copy->dst_y + copy->h) {
+                               expected[(y * W + x) * 4 + 0] =
+                                       x - copy->dst_x + copy->src_x;
+                               expected[(y * W + x) * 4 + 1] =
+                                       y - copy->dst_y + copy->src_y;
+                       } else {
+                               expected[(y * W + x) * 4 + 0] = x;
+                               expected[(y * W + x) * 4 + 1] = y;
+                       }
+                       expected[(y * W + x) * 4 + 2] = 0;
+                       expected[(y * W + x) * 4 + 3] = 0;
+               }
+       }
+
+       /* Fill the window with ubytes from 0-255 according to x/y coordinate.
+        */
+       glUseProgram(prog_fragcoord);
+       piglit_draw_rect(-1, -1, 2, 2);
+
+       /* Do the copy of the rectangle. */
+       glEnable(GL_TILE_RASTER_ORDER_FIXED_MESA);
+       if (copy->inc_x)
+               glEnable(GL_TILE_RASTER_ORDER_INCREASING_X_MESA);
+       else
+               glDisable(GL_TILE_RASTER_ORDER_INCREASING_X_MESA);
+       if (copy->inc_y)
+               glEnable(GL_TILE_RASTER_ORDER_INCREASING_Y_MESA);
+       else
+               glDisable(GL_TILE_RASTER_ORDER_INCREASING_Y_MESA);
+
+       glUseProgram(prog_tex);
+       piglit_draw_rect_tex(-1 + 2 * copy->dst_x / W,
+                            -1 + 2 * copy->dst_y / W,
+                            2 * copy->w / W,
+                            2 * copy->h / H,
+                            copy->src_x / W,
+                            copy->src_y / H,
+                            copy->w / W,
+                            copy->h / H);
+
+       glDisable(GL_TILE_RASTER_ORDER_FIXED_MESA);
+
+       return piglit_probe_image_ubyte(0, 0, W, H, GL_RGBA, expected);
+}
+
+enum piglit_result
+piglit_display(void)
+{
+       /* Be careful with small-delta copies, as the piglit tolerance
+        * means that we will pass tests when texels are offset by
+        * small amounts.
+        */
+       static const struct copy_desc tests[] = {
+               {
+                       .inc_x = true, .inc_y = true,
+                       .dst_x = 20, .dst_y = 20,
+                       .src_x = 40, .src_y = 40,
+                       .w = 100, .h = 100,
+               },
+               {
+                       .inc_x = false, .inc_y = true,
+                       .dst_x = 40, .dst_y = 20,
+                       .src_x = 20, .src_y = 40,
+                       .w = 100, .h = 100,
+               },
+               {
+                       .inc_x = true, .inc_y = false,
+                       .dst_x = 20, .dst_y = 40,
+                       .src_x = 40, .src_y = 20,
+                       .w = 100, .h = 100,
+               },
+               {
+                       .inc_x = false, .inc_y = false,
+                       .dst_x = 40, .dst_y = 40,
+                       .src_x = 20, .src_y = 20,
+                       .w = 100, .h = 100,
+               },
+       };
+       bool pass = true;
+       GLuint fbo;
+       GLuint tex;
+
+       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);
+
+       /* We will initialize the texture values with drawing, to
+        * increase the chance of catching flushing bugs.
+        */
+       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, W, H, 0,
+                    GL_RGBA, GL_FLOAT, NULL);
+
+       glGenFramebuffers(1, &fbo);
+       glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+       glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,
+                              GL_COLOR_ATTACHMENT0,
+                              GL_TEXTURE_2D, tex, 0);
+
+       if (glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) !=
+           GL_FRAMEBUFFER_COMPLETE) {
+               fprintf(stderr, "FBO incomplete\n");
+               return PIGLIT_FAIL;
+       }
+
+       for (int i = 0; i < ARRAY_SIZE(tests); i++) {
+               if (!test_one(&tests[i])) {
+                       pass = false;
+                       break;
+               }
+       }
+
+       /* Visualize the results */
+       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, piglit_winsys_fbo);
+       glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
+       glBlitFramebuffer(0, 0, W, H,
+                         0, 0, W, H,
+                         GL_COLOR_BUFFER_BIT, GL_NEAREST);
+       piglit_present_results();
+
+       glDeleteFramebuffers(1, &fbo);
+       glDeleteTextures(1, &tex);
+
+       return pass ? PIGLIT_PASS : PIGLIT_FAIL;
+}
+
+void piglit_init(int argc, char **argv)
+{
+       piglit_require_GLSL();
+       piglit_require_extension("GL_MESA_tile_raster_order");
+       piglit_require_extension("GL_ARB_framebuffer_object");
+
+       prog_tex = piglit_build_simple_program(vs_tex, fs_tex);
+       prog_fragcoord = piglit_build_simple_program(vs_fragcoord, 
fs_fragcoord);
+
+       if (glIsEnabled(GL_TILE_RASTER_ORDER_FIXED_MESA)) {
+               fprintf(stderr,
+                       "GL_TILE_RASTER_ORDER_FIXED_MESA should default off\n");
+               piglit_report_result(PIGLIT_FAIL);
+       }
+
+       if (!glIsEnabled(GL_TILE_RASTER_ORDER_INCREASING_X_MESA)) {
+               fprintf(stderr,
+                       "GL_TILE_RASTER_ORDER_INCREASING_X_MESA "
+                       "should default on\n");
+               piglit_report_result(PIGLIT_FAIL);
+       }
+
+       if (!glIsEnabled(GL_TILE_RASTER_ORDER_INCREASING_Y_MESA)) {
+               fprintf(stderr,
+                       "GL_TILE_RASTER_ORDER_INCREASING_Y_MESA "
+                       "should default on\n");
+               piglit_report_result(PIGLIT_FAIL);
+       }
+}
-- 
2.13.3

_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to