[Piglit] [PATCH 8/9] etc1: Test texturing from an ETC1 miptree

Chad Versace chad.versace at linux.intel.com
Mon Jul 9 10:43:36 PDT 2012


Add test spec/OES_compressed_ETC1_RGB8_texture/miptree.

Signed-off-by: Chad Versace <chad.versace at linux.intel.com>
---
 tests/all_es2.tests                                |   4 +
 .../CMakeLists.gles2.txt                           |  11 +
 .../oes_compressed_etc1_rgb8_texture-miptree.c     | 239 +++++++++++++++++++++
 .../waffles-compressed-etc1-64x32-miptree.ktx      | Bin 0 -> 1476 bytes
 .../waffles-decompressed-rgb-64x32-miptree.ktx     | Bin 0 -> 8288 bytes
 5 files changed, 254 insertions(+)
 create mode 100644 tests/spec/oes_compressed_etc1_rgb8_texture/CMakeLists.gles2.txt
 create mode 100644 tests/spec/oes_compressed_etc1_rgb8_texture/oes_compressed_etc1_rgb8_texture-miptree.c
 create mode 100644 tests/spec/oes_compressed_etc1_rgb8_texture/waffles-compressed-etc1-64x32-miptree.ktx
 create mode 100644 tests/spec/oes_compressed_etc1_rgb8_texture/waffles-decompressed-rgb-64x32-miptree.ktx

diff --git a/tests/all_es2.tests b/tests/all_es2.tests
index 64e5570..ac1b636 100644
--- a/tests/all_es2.tests
+++ b/tests/all_es2.tests
@@ -17,4 +17,8 @@ spec['EXT_unpack_subimage'] = ext_unpack_subimage
 ext_unpack_subimage['basic'] = PlainExecTest(['ext_unpack_subimage', '-auto'])
 ext_unpack_subimage['basic'].runConcurrent = True
 
+oes_compressed_etc1_rgb8_texture = Group()
+spec['OES_compressed_ETC1_RGB8_texture'] = oes_compressed_etc1_rgb8_texture
+oes_compressed_etc1_rgb8_texture['miptree'] = PlainExecTest(['oes_compressed_etc1_rgb8_texture-miptree', '-auto'])
+
 profile.tests['spec'] = spec
diff --git a/tests/spec/oes_compressed_etc1_rgb8_texture/CMakeLists.gles2.txt b/tests/spec/oes_compressed_etc1_rgb8_texture/CMakeLists.gles2.txt
new file mode 100644
index 0000000..7108378
--- /dev/null
+++ b/tests/spec/oes_compressed_etc1_rgb8_texture/CMakeLists.gles2.txt
@@ -0,0 +1,11 @@
+include_directories(
+	${GLEXT_INCLUDE_DIR}
+	${OPENGL_INCLUDE_PATH}
+)
+
+link_libraries(
+        piglitutil_${piglit_target_api}
+        ${OPENGL_gles2_LIBRARY}
+        )
+
+piglit_add_executable(oes_compressed_etc1_rgb8_texture-miptree oes_compressed_etc1_rgb8_texture-miptree.c)
diff --git a/tests/spec/oes_compressed_etc1_rgb8_texture/oes_compressed_etc1_rgb8_texture-miptree.c b/tests/spec/oes_compressed_etc1_rgb8_texture/oes_compressed_etc1_rgb8_texture-miptree.c
new file mode 100644
index 0000000..cecd327
--- /dev/null
+++ b/tests/spec/oes_compressed_etc1_rgb8_texture/oes_compressed_etc1_rgb8_texture-miptree.c
@@ -0,0 +1,239 @@
+/*
+ * Copyright 2012 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
+ * \brief Test texturing from an ETC1 miptree of a real image.
+ *
+ * This test uses two data files. The file waffles-compressed-etc1-64x32.ktx
+ * contains a full miptree in GL_ETC1_RGB8_OES format of a 2D texture of
+ * waffles and fruit [1].  The base level size is 64x32 pixels. The file
+ * waffles-decompressed-rgb-64x32.ktx contains a parallel miptree in GL_RGB
+ * format. Each of its RGB images was obtained by decompressing the corresponding
+ * ETC1 image with etcpack [2].
+ *
+ * This test draws each miplevel i of the ETC1 texture such that the image's
+ * lower left corner is at (x=0, y=sum(height of miplevel j for j=0 to i-1)),
+ * and it draws each miplevel of the RGB texture to the right of its
+ * corresponding ETC1 image. Then it compares that the images are identical.
+ *
+ * [1] The reference image is located at http://people.freedesktop.org/~chadversary/permalink/2012-07-09/1574cff2-d091-4421-a3cf-b56c7943d060.jpg.
+ * [2] etcpack is the reference ETC1 compression tool, available at http://devtools.ericsson.com/etc.
+ */
+
+#include "piglit-util-gl-common.h"
+#include "piglit_ktx.h"
+
+#define num_levels 7
+#define level0_width 64
+#define level0_height 32
+
+#define num_vertices 4
+
+static const int window_width = 2 * level0_width;
+static const int window_height = 2 * level0_height;
+
+PIGLIT_GL_TEST_MAIN(
+    window_width, window_height,
+    GLUT_RGB | GLUT_DOUBLE)
+
+
+static GLuint prog;
+
+/* Texture objects. */
+static GLuint compressed_tex;
+static GLuint decompressed_tex;
+
+/**
+ * The \a filename is relative to the current test's source directory.
+ *
+ * A new texture is created and returned in \a tex_name.
+ */
+static void
+load_texture(const char *filename, GLuint *tex_name)
+{
+	struct piglit_ktx *ktx;
+	const struct piglit_ktx_info *info;
+	char filepath[4096];
+	bool ok = true;
+
+	piglit_join_paths(filepath, sizeof(filepath), 5,
+	                  piglit_source_dir(),
+	                  "tests",
+	                  "spec",
+	                  "oes_compressed_etc1_rgb8_texture",
+	                  filename);
+
+	ktx = piglit_ktx_read_file(filepath);
+	if (ktx == NULL)
+		piglit_report_result(PIGLIT_FAIL);
+
+	info = piglit_ktx_get_info(ktx);
+	assert(info->num_miplevels == num_levels);
+	assert(info->target == GL_TEXTURE_2D);
+	assert(info->pixel_width == level0_width);
+	assert(info->pixel_height== level0_height);
+
+	*tex_name = 0;
+	ok = piglit_ktx_load_texture(ktx, tex_name, NULL);
+	if (!ok)
+		piglit_report_result(PIGLIT_FAIL);
+
+	piglit_ktx_destroy(ktx);
+}
+
+void
+piglit_init(int argc, char **argv)
+{
+	static const char compressed_filename[] = "waffles-compressed-etc1-64x32-miptree.ktx";
+	static const char decompressed_filename[] = "waffles-decompressed-rgb-64x32-miptree.ktx";
+
+	const char vs_source[] =
+		"#version 100\n"
+		"\n"
+		"uniform vec2 window_pixel_size;\n"
+		"uniform vec2 level_pixel_size;\n"
+		"uniform vec2 pixel_offset;\n"
+		"\n"
+		"// vertex is some corner of the unit square [0,1]^2 \n"
+		"attribute vec2 vertex;\n"
+		"varying vec2 tex_coord;\n"
+		"\n"
+		"void main()\n"
+		"{\n"
+		"    vec2 pos = vertex;\n"
+		"    pos *= level_pixel_size;\n"
+		"    pos += pixel_offset;\n"
+		"    pos /= 0.5 * window_pixel_size;\n"
+		"    pos -= vec2(1, 1);\n"
+		"    gl_Position = vec4(pos.xy, 0.0, 1.0);\n"
+		"\n"
+		"    tex_coord = vertex;\n"
+		"}\n";
+
+	const char fs_source[] =
+		"#version 100\n"
+		"\n"
+		"uniform sampler2D tex;\n"
+		"varying vec2 tex_coord;\n"
+		"\n"
+		"void main()\n"
+		"{\n"
+		"    vec4 t = texture2D(tex, tex_coord);\n"
+		"    gl_FragColor = vec4(t.rgb, 1.0);\n"
+		"}\n";
+
+	/* Draw a square triangle strip. */
+	const GLfloat vertices[2 * num_vertices] = {
+		0, 0,
+		1, 0,
+		1, 1,
+		0, 1,
+	};
+
+	GLuint vs;
+	GLuint fs;
+
+	GLint vertex_loc;
+	GLuint vertex_buf;
+
+	piglit_require_extension("GL_OES_compressed_ETC1_RGB8_texture");
+
+	load_texture(compressed_filename, &compressed_tex);
+	load_texture(decompressed_filename, &decompressed_tex);
+
+	glClearColor(1.0, 0.0, 0.0, 1.0);
+	glViewport(0, 0, window_width, window_height);
+
+	vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vs_source);
+	fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, fs_source);
+	prog = piglit_link_simple_program(vs, fs);
+	assert(prog != 0);
+	glUseProgram(prog);
+
+	vertex_loc = glGetAttribLocation(prog, "vertex");
+	glGenBuffers(1, &vertex_buf);
+	glBindBuffer(GL_ARRAY_BUFFER, vertex_buf);
+	glEnableVertexAttribArray(vertex_loc);
+	glVertexAttribPointer(vertex_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
+	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices,
+	             GL_STATIC_DRAW);
+
+	glUniform1i(glGetUniformLocation(prog, "tex"), 0);
+	glActiveTexture(GL_TEXTURE0);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+	glUniform2f(glGetUniformLocation(prog, "window_pixel_size"),
+	            window_width, window_height);
+}
+
+static void
+minify(int *x)
+{
+	assert(*x > 0);
+
+	if (*x > 1)
+		*x >>= 1;
+}
+
+enum piglit_result
+piglit_display(void)
+{
+	GLint pixel_offset_loc = glGetUniformLocation(prog, "pixel_offset");
+	GLint level_pixel_size_loc = glGetUniformLocation(prog, "level_pixel_size");
+
+	int level = 0;
+	int level_width = level0_width;
+	int level_height = level0_height;
+	int y_offset = 0;
+
+	bool pass = true;
+
+	glClear(GL_COLOR_BUFFER_BIT);
+
+	for (level = 0; level < num_levels; ++level) {
+		glUniform2f(level_pixel_size_loc,
+		            (float) level_width,
+		            (float) level_height);
+
+		/* Draw miplevel of compressed texture. */
+		glBindTexture(GL_TEXTURE_2D, compressed_tex);
+		glUniform2f(pixel_offset_loc, 0, y_offset);
+		glDrawArrays(GL_TRIANGLE_FAN, 0, num_vertices);
+
+		/* Draw miplevel of decompressed texture. */
+		glBindTexture(GL_TEXTURE_2D, decompressed_tex);
+		glUniform2f(pixel_offset_loc, level0_width, y_offset);
+		glDrawArrays(GL_TRIANGLE_FAN, 0, num_vertices);
+
+		y_offset += level_height;
+		minify(&level_width);
+		minify(&level_height);
+	}
+
+	pass = piglit_probe_rect_halves_equal_rgba(0, 0, window_width, window_height);
+	piglit_present_results();
+
+	return pass ? PIGLIT_PASS : PIGLIT_FAIL;
+}
diff --git a/tests/spec/oes_compressed_etc1_rgb8_texture/waffles-compressed-etc1-64x32-miptree.ktx b/tests/spec/oes_compressed_etc1_rgb8_texture/waffles-compressed-etc1-64x32-miptree.ktx
new file mode 100644
index 0000000000000000000000000000000000000000..71356c10a5edfcdad6ab56b434931eddbb1f4d00
GIT binary patch
literal 1476
zcmZ8hX;70#7~Ui(5fHvWIXr4YKu~m$$l-xX6e-YHigF23#|ml)ZBP>l5=O0|7$6)$
z?!&4Sxfvsh+)ytfh7TA)L=q6NiZtXH5WZ^QYv?q8`poP;@9xgK&(3>nH7)Qci9%^v
zZLrn=gT?6qEilWI7LjQH=&u2Qs<lblp~LdIzHXuQ=*&1y7LT-;4WxO6 at cD%|hm$<d
zDfmr-S3K(BZnEB)S~|$w!MwilB at d#_g8<{cWNSysSf;Q&eM{A5KAemUwLS#Bs6}62
z9}@r+Ew5;lv7p_f*K*6VLe8wSkLRZ4aH2jrgh#R;SuFs(%@+4kDu6&3BY~~-yRj)Z
zkes$8{&Q%*gO#zRtW&}`My3ICGKCQW`4cIrtrJ-W-emihGR^O{H1y;<+H;O+AV+iW
zNlCnyaCiqf6&Vm*H%3)hseHH%fWw3yxONVJ1x{3ass;y1;I7^etXF(meL~s|VcSto
zN={kBzyb%)rR?&>qI|w{4%?G0nFT+Ddy%|T(bt5~P;>e^d?%Nm<iu89(IidhLW6kt
zkU(8z>P^8n+Gy^q4Hi55kGzZB7GtJ)vRV=6;$n10)iuA+vJHSLl1B5G127!18ksZ1
z-d+sv9eUdl0Tl+knLrp8d%w)Sd^5>}fNCizuUtwYNS1D2JrJo;jjK%!Obt#0zR=Z{
zw1<g;4;TCa-*O&ziD7EG%5`kG1P%q6uu}GU at QPucvts1bBzITz<@)&5O~K{~k}FVa
zV_A0PX~n}BX+>hK88bBE^_|FT4EK4AqMciVf0k)JI at 9<70M at SQ>G^1YAMMiR>)zEP
zXBSlXJ@)2yPJeaWrG|R%kHaNkG!GNM-ahL at F)JmJHlMt1Z5d^OV-sN?DN+-jEBOUi
zCZ(@s&1A;=rTgurbrj{#l^n%H5{U`xL_gZboVMl)+C#tc;T$qvgfH680KQ5O9m`1p
zcu0To(+~^bP?b&}>8vSaLB*qW$*v+{kWIn!Ti at Gplg(@H3pV(j1s#e2q7}nqfnb*6
zMrE6P>8gKoL0d1KRr+NIAg?LRWMmN?WSd<^(RMnhAgVJ~sBf+DK0#g8jQl}MaUy2m
zCVB3hm1?I=Xj8NU=v8e%ktKbMhlHoom&s;cFSo;F|4=Lh6lh!8-oF7jNv=+I)c~N7
zqi}6IfgqDs#zsge1VKhB!^|s4R-eH2#hyYhgoL#+0qwmFs{p=;p#$R5BqFlGp3}<|
zEj7D4N^GFy_r?3pOXm9b_i%T{0V4#N(`Xz429 at jdr>0cezWEGfGTFcH_&*O04obCs
zCF<!G_niYq%H}qI at 7`IL+1f%EA9ryk?_<?&Z_9;#4pL2G;t2d6q<8Z-2ZQqY4cVkL
z#e}l0j=S-$v$2(tyfAQ4tJ|s5)$#I&k$BvV+40VT6BS^^5)$%D$Au7WVvFx5xWKc2
z#AAgm^0asen4ngVUySBaz|)B0k~&dPB6P#|+psn7S(obqw&N;1R0?H8$kwd$G4Tz}
z5!eUD9qu;LJ4Xc8Zr@$1Jas_r*eRsS%XuP)D#}a6NS+87Up|Z=s3F(~Ky{ppi~u!_
zrbn+VIOxS|`N at 98#V(HPSXU(J=lK%@)%9@}btb>@0zL>0V=>S;JT3G*f;UtLza4*@
zp^XjF(<4K)DeOZK1gk&+kT(|$JArhxp?F6~K2N;!Me4@$7=mQrV*@E$0{Z!N at orMg
zdPMwRY-gxiXS)B^EIUpmUBbq+kYPPTd1KZCJ0)Q~-2JKzTD3&(uKabm9+c1X*+ at UZ
z3YOn@;ZC^^9Mklc)&mdp8Kk{K5QZ;!L~vMyi+mbaCaJIDwR^S6!E+`AmGQD&UwGC}
OOX#xQc$1%{CGZb;o3R!E

literal 0
HcmV?d00001

diff --git a/tests/spec/oes_compressed_etc1_rgb8_texture/waffles-decompressed-rgb-64x32-miptree.ktx b/tests/spec/oes_compressed_etc1_rgb8_texture/waffles-decompressed-rgb-64x32-miptree.ktx
new file mode 100644
index 0000000000000000000000000000000000000000..5f3b106a665b820ed1c1fe12aca3ab806834adb5
GIT binary patch
literal 8288
zcmbuE4O~=J-p5b7x`?i;kP?jI6B=NHLW;)AfC5563 at npo3(Alfv7rG%tF(|v@`R(J
zyf`lMh`}fr;$pls1c@)aD1}&xBp|En8-#|kD1!oe_IK|YE+c69`8 at aY^?2^gng99z
z|M$S0dnxc<_LrCE&HHxZc+vP5e)sz^FH9li1wx3P$?!iHoWG2JLkIu<(1|f2U&nfZ
zv)kVWSCrn2d-*}Plrlhz!$E)Us`gYLEh?v at F@`x(0<I*RfO|P}%R@<R>|}5~=XH8)
zDQ)|t>458jC<k?-cgL|@`n03IzRkr&rch*}_590+yYtExd%g!kLe}F&i9`w<+};Kf
z_hoi2eh#iO#=1`w!O at 8zEv>Y_pF+MqHAwJ>IY1W7|HoLn61nKa8cT2?UV;=dmXUBV
zCttswz#RUNZ-~`9mo)uSss;Q3<iYnDK}g}q=O58KO;5{!vJ{v<Qh<E&?!uCi8ki#s
zU4Nt?_ at m?L9~PgI6A%!G6d->x>7BaIr8S><Hf(bhXi`NK#CRkvGXts!C&n@}P97;h
z{%)orEuZ@!*Q7mN?|eLgKlqME at J9+qHcC6xiIo1rGcu37vNBJ9f5=CDmi}SXR#4U0
zo3_6;U`;X*>JNVbTnqRE<_~#rEY1yNtuP3gMHqo%A`s(Y2p|t2kM+aJ*ElhMmICCl
ze&ByNjC|z8ks>#TKjeSKANe2!EFMsHq8asvHc|lnl-4x-3n at TYkY^n$Cm*aI_=BcY
zIU{MwWEV>#;5=sn at O2&oK3**bfzoka_9R?FGD67r8%TGS0WC7;s9Hn|#hSgwplOq+
zI(%G0(0DIP5-1s$6f&RDRr7a1f8IxF-N@<>oh$Ro>`>6y?R71;x*t$R`N>vAW<kjM
zB#AT-*tp1mv$HR7aD5vfF97+1&;^hWG$HO*A^`b!-!O;vmJN#-5pogpKdLaiyp2nN
zac#>OCXWvDhrHn5RI&+FXZmSVpmn{pS769p`#)09_1}A-vhmXWlA0!@fc97XQ^KWA
zBEoPqn+)Lp at oKlIu-S=mj*QJw)<^-xhkyGny}?7KjE-delc9uhB!B?aAJk_oxqCDe
zpwqSApF#g~aA2U0F+yJV^oQndP*8d%VXNx$U0PA!mXcG90Wpe9q5ifKDPZ;Yx0?!i
z)-r#-_-=wcI`9WrKkX$>FsJHQ83Q?{NTDf~O96`q{zW?-J5NW^_EZ4*XZiD4v<wWi
z;Bx57qtDDA@*QT56ad~ro13e~`mwR|1oIr<0ueqU at X<<d;A}ny$Q+C}1TBh>mw=QM
zDNrh1K%_5eR{PP4`NNdYrMV_|()C*7$+ayUn!~R2#wRpuY3m2m8UOlV=Dj$3n!S=X
z?;0Ge66onEr?ipMZt#%8clg-&`9IXhe!zKYWfMT>eCxIAx9_7fI7n-2n?hq0Gi+S!
zJUzkoFgw8fVa{0XEf)M$DtU2nAoI63A`LO*34cBX=C9d13I5>zrq`J~I`Hp|vKIU)
zJv#*Cwf?=2dKoN-_B&KJ1<144nLpYd9%Wu0{Ht at qQGe$-)4+mPrh`S+7H>Ju4-TGz
z6d<owM=^iMg8(Cv=1cn3et=e33{z-Es}@3jhdbHpK+2a-=}z_r at CQFd&O!a}4_+70
zXf%QqrS}ASA8{|E{l^#IoNI+CZND=-67|Qy{J9>b at JIc1{bw6b23A%CDPZxyAH|o;
z^#y;V0ID_`_kT5=^FKA8qiP{I6=wjLe`BOI{JF)m#a-8*&C6P3!6$N0qiJ9%z?`Lk
z0nA at _{Am9R#o?ReB3oNqQ&Usp$;LozCI&MN46IE}6QgZ_BGgb~LhK2V5+c{v7pPc5
zXsQ!!;yK~|^KMb5CjphRNv+{?06KNSGj7I9>Xi5jrnJAav8o6yPjhcoc5;9{P<?25
zCSBHD_BVR<3rbG|{D4z>Q`a1Q$TNT4*UOYL_*+_98W<QDjyD9xlZ*lUfyGn;AkX|^
z{{Ey%e|_;qfKG}D0c}Zy78uq<apnLWL0;D%DXa<b5 at 6=FX_3eR@&H+YpY{jQ#+~ff
zY%li%GJG)k5h*Z#6#qB<S at Dy{j?FPK0jC!)M*ZPm9LVv}0*<D=4)nr0S`<XHyfxb#
zu5B>qiXS{9%+3O=vA1NzOC`r+?NoA6i&Ca34!^$VO>j4NX~X7u`_^zNXul?Uvnhi%
z52x{DZ-hVA&!UBk02U9cKh{r4s#C}k?aF~afIMLJXa2cs^#Lc(`!jiD0smAhBKX5R
zRqm4;wF>@B9&O7`XZWK<3MfAOuU;+W*H5$7zc*W>x%{NK_N-1BoGQ1P%pazIGzB3`
zmX)Ncf at Lx*k;rBusmPdrO8M%6XuWlo1ne;|0N>i$9<j8Ho-r{+B2Ms~2CCQ1pvTwJ
zHU&K(yB%YGPCfxprQ2rL*COUlXKjQP0nMBLcxD6na`}|1Nb4)f-k>?k8r)2gfPp+2
zgVGjCf27 at c^hzSVm(g?UyXW_pn24Ew%yO;&SMe|YpG at ly^ITI?WZ^%CAO*-5ZS>~k
zJ9jgGXd?x*rLF|#`Jv0vaw%Amyx at uOzq4m1<dMQQ2Lfv3BKV(+vwWuimBeTH-z<(V
zjP(@iZ#&ag5gLO_fZ_ubpF?2^j{nUNDfpS1I_c{JF(FPo at b6S_=H!pB?fBRXJUkcz
z3jAM6upt at C7lEkPj1%3&+dVmd6d(Q_O7ZtG6Tgy^bXT&^o`d<*>TqrStHX!ue<kr@
z_rIT7f95Zj%aMYxeo%kN$A^cH_Sc&8DKLL8Bf{#BB_#MWd9*N>Panfz^@snpWFz=9
zkOkyXf2v;9r}DYF-3}lHB+_-}Gwu3$wm)q?UcGhQ<=i#Ol`{kE2_r3X+IQI=jfehR
zyLTQqrZnT3ALdGC6AoV<xxNUn?=o5<zpGdP>O&^yNXC`;h)%DvM$2x3*4PscBeLI@
zoLfU~#uLhaUvuAjg=W=T|I}4#Pj7G1)CRO}m;>&ozCjCD_kZ&NJsU at VNT%0w`uh4F
z at yDpE(1{e_52~`gL4WgR0QoEG73aQm2Iun^f at 4apzsH0L!FrRxX#X4u0ZbnL$+(x{
z at 8cj(oBbL$8Z-aCRDJe+4f#8JC&8aKuVnr(uMC)k6ySg7Z~(1})b$@Fj~6<5H1Kar
zS^{W6D1bat=s31i*FQ;4AkX|iHZfDW$YL$*P=D-&F2qZ-Jf|`~ur&YymSf!wwEmFi
zQ2P!07hCjyIi2z?SA5=|UR+B{!#WZj0Xp#KE&*Tvp8i{dl-q)iI<)?jYG_j`M?omE
zsNCfMAb+X&O`-m{1VQHJf<NSO3D|b7EZ7F}o2&?cIq)+j%)d$H#QcT&(_B+}Y`&Ia
zi(&uUo9HhpCO_JLlsWgp<HwB0IJ5&a?H#Aox5|PATFQdKt-3_ep;jK*80hi`!ZDF3
zmV0dXw*c{h<JNc)MwlJ(5oyWxC9PXb87d!gJdE_IL{x1}D_;eVzP0Q7dfuJGvvDgu
zcqxcJh at +=gx9*%n%R)d)qKhUc at Nru{wwyiv{rui at WD-yD*ABTwsTRodeg2L1S_*!t
z=D7M}eMVAVv<v)GBSg8Itr<DtVwM8h(qIl`0pPF65p(jOY!;WoaS2lB|7HPzKe(U&
z2K;|cmH=J<r^-X<S^nJh;16D!CBhQJ2A$ud<Ba#OP6<Q`hxW__>RfA%U8aY&7%*~I
z>w|O|iFf9TFZe$y`5!I?-k*DpQMKsWNe=+|%BV>-AHI~i7~?I3`m?!5x4-F+B!(`;
zQ~Z$v`~j0cam4=2x9(>S*`C;Ei7Y_*1`d{juD?)!TI)*Bz6F>+t3UHs`RK#{$@`U&
z8DKlgz#H0%|LT7uKHt^VRiCjQWM?k~rKMi2tr4fyekCfW3ptV#$(H9+rVBJ}COz3x
zddjEJMr%#&%YfFuPA|IkHOUzb1q-TnI)b+RCB^Y3s6VaaZyZL<s&gvHKc_!`Idncx
z>D{B5&+<nKOuqfVYY)_Jw89!Ne|m8~2mI?_&rg~hA4nK!LF1V}QsCsD&mUPlzyHV-
z+H2t7c<9~AU9RA}Y#$UqCq>*|;=^&+0rY(1LC>zB7ri+et%dscpPU0y!o~h}+GkJ!
zmIVH^AruU>L{mC2#1lmmPX7P(r|mVk1k4}u0P at LkMks#&=~aVOe}+8TVgGJ#3U0r_
zanTLHUwDS5_3ul4PJi+TLJAXCfaT6p99|}_vx(ee0zd~(32D(>(4A#c5Hkw|+Yq#u
zb7O`4(P{p7_trF3>CrPqMOB at h{Rs(aUS0uiZcBkw8VC?P;59u2#}vvqHxLtK4lZxg
z!xU(N5WK4*gp1!%IbsULM{rERaB}hyKyVg6@?Goy{ZuS~=gaI7GoFv*E{hg;(58sC
zB(o0XYFe94AJqd5Z5JlO^D_3xk3BDoQ7CL&TtI5*q76Q;Kpr6Yk%P;Coeja0cQyq&
z2#fe=!I3~K-T0V7n1xM&S%d?#<ZkwJo<_tbVjy#Q>5Cm9$ty*R|D at e7V%GxjG&3jM
zMCC+UqHS7~(LlQ{`<tnNb}z+tBoy04HVfj9CB$f~5wJ8O0Kr*&Y)Jv)BRD|t<Ni}w
z{8+oGU|)d!Pic{W>(nOD-XgYR)7^{;@%<M2AvjWC{%O<3S9v?K7QyjMQ<EYEcwmjE
z)p%x&&SixMEr~!2+VVqaUkO8_xg(TFH$JOR+2`(<0+B%gA(#chQ6dCK3haS6;^X0X
zMTl97grL>NZ%}aY8x*?n>ob;NE5neANsY=0WX2e>`xCS&QZb8+;J5 at KRvZUp<kFUj
z_j9JUCXpRdqA7J~-{!zQdT8Da9zN80rg=3BQviB3iv<_r`%fi+#YbcmA0T)``fL^-
zn><W`;PjVu=Qo%?$nvIzYe&ZCe at Wdciv|su9s<D=38P^7f<)OwVOy59n$Y_9PKI;-
zY!k`ibMk<Xe}C}4Q2(Ldfb3V{kKAoxTN2k^Jr24u)+0XlOaQZB=ZE+J at gL-hb>pKx
z at bB8{$(2aw7(n2mZ(rSYr5(~%(U2K)IDPi{a^GXQj_90>pK>6WG^LY=Wg^<J0CcMT
z04l6lZipu%?1RGh1mXkswa(&?m_;`}rnt1n8X&k3zi6W|&|btAC9~D)p*o}dN5t={
zuc%CSW%Sm6@<8nk=v8+P-ao;Y;5HcYSRs^;F9b*DH{)Xr!X~dac*lwW$PdTwlhZyq
zi;oq~#UFKS!XJhGU0wnQcesE0zKB-)wQn<K{Iow|=oYQBw6yldjb0EJmyE$SM)(v#
zyKxr5VD$<DFkV1+B4Iq at Z=Xj1JsNd3`qemlQW`lP+{kw1G9OC*;Es?_-<QA#EFs)@
z3>L;?FyOBA(0I%>&{Eb?mk6 at LJV8w8ESnjmcAFj;#18k$iVk%$K&^Om?dU*VUPXQg
zz~F0NzJl>+k8FJBS>y3x48|09zn(`Q{~f$9CaSHd6 at Kg)PsHa=dI~Wf!|;)RMiX?-
zlokvPe)t~#CNDMN$P6_EH;PsQws*y8O{x>#LL28r at OndL=+L&dr>j1{KoMG+FlWT;
w7=YLDB0fU-dno+5pTzoGfZ7CK+Np+9OIaf8V;exum!|+ievkeSW&6l~0hhg6V*mgE

literal 0
HcmV?d00001

-- 
1.7.11.1



More information about the Piglit mailing list