[Piglit] [PATCH] ext_compressed_etc1_rgb8_sub_texture: Update sub-section test.

Plamena Manolova plamena.manolova at intel.com
Tue Jan 24 12:43:30 UTC 2017


This test is to check whether updating sub-sections of ETC1_RGB8_OES
textures when GL_EXT_compressed_ETC1_RGB8_sub_texture is available works
as expected.

Signed-off-by: Plamena Manolova <plamena.manolova at intel.com>
---
 tests/all.py                                       |   5 +
 tests/spec/CMakeLists.txt                          |   1 +
 .../CMakeLists.gles2.txt                           |   6 +
 .../CMakeLists.txt                                 |   1 +
 .../update-test.c                                  | 279 +++++++++++++++++++++
 .../waffles-compressed-etc1-64x32-miptree.ktx      | Bin 0 -> 1476 bytes
 .../waffles-decompressed-rgb-64x32-miptree.ktx     | Bin 0 -> 8288 bytes
 7 files changed, 292 insertions(+)
 create mode 100644 tests/spec/ext_compressed_etc1_rgb8_sub_texture/CMakeLists.gles2.txt
 create mode 100644 tests/spec/ext_compressed_etc1_rgb8_sub_texture/CMakeLists.txt
 create mode 100644 tests/spec/ext_compressed_etc1_rgb8_sub_texture/update-test.c
 create mode 100644 tests/spec/ext_compressed_etc1_rgb8_sub_texture/waffles-compressed-etc1-64x32-miptree.ktx
 create mode 100644 tests/spec/ext_compressed_etc1_rgb8_sub_texture/waffles-decompressed-rgb-64x32-miptree.ktx

diff --git a/tests/all.py b/tests/all.py
index 74ffb42..3c31b3e 100644
--- a/tests/all.py
+++ b/tests/all.py
@@ -2884,6 +2884,11 @@ with profile.test_list.group_manager(
     g(['vp-clipdistance-04'], run_concurrent=False)
 
 with profile.test_list.group_manager(
+        PiglitGLTest,
+        grouptools.join('spec', 'ext_compressed_etc1_rgb8_sub_texture')) as g:
+    g(['ext_compressed_etc1_rgb8_sub_texture-update-test'])
+
+with profile.test_list.group_manager(
         PiglitGLTest, grouptools.join('spec', 'ext_framebuffer_blit')) as g:
     g(['fbo-blit'], run_concurrent=False)
     g(['fbo-copypix'], run_concurrent=False)
diff --git a/tests/spec/CMakeLists.txt b/tests/spec/CMakeLists.txt
index 548515d..ae37280 100644
--- a/tests/spec/CMakeLists.txt
+++ b/tests/spec/CMakeLists.txt
@@ -154,3 +154,4 @@ add_subdirectory (ext_window_rectangles)
 add_subdirectory (arb_shader_texture_image_samples)
 add_subdirectory (arb_texture_barrier)
 add_subdirectory (intel_conservative_rasterization)
+add_subdirectory (ext_compressed_etc1_rgb8_sub_texture)
diff --git a/tests/spec/ext_compressed_etc1_rgb8_sub_texture/CMakeLists.gles2.txt b/tests/spec/ext_compressed_etc1_rgb8_sub_texture/CMakeLists.gles2.txt
new file mode 100644
index 0000000..5e2d499
--- /dev/null
+++ b/tests/spec/ext_compressed_etc1_rgb8_sub_texture/CMakeLists.gles2.txt
@@ -0,0 +1,6 @@
+include_directories(
+	${GLEXT_INCLUDE_DIR}
+	${OPENGL_INCLUDE_PATH}
+)
+link_libraries(piglitutil_${piglit_target_api})
+piglit_add_executable (ext_compressed_etc1_rgb8_sub_texture-update-test update-test.c)
diff --git a/tests/spec/ext_compressed_etc1_rgb8_sub_texture/CMakeLists.txt b/tests/spec/ext_compressed_etc1_rgb8_sub_texture/CMakeLists.txt
new file mode 100644
index 0000000..4a012b9
--- /dev/null
+++ b/tests/spec/ext_compressed_etc1_rgb8_sub_texture/CMakeLists.txt
@@ -0,0 +1 @@
+piglit_include_target_api()
\ No newline at end of file
diff --git a/tests/spec/ext_compressed_etc1_rgb8_sub_texture/update-test.c b/tests/spec/ext_compressed_etc1_rgb8_sub_texture/update-test.c
new file mode 100644
index 0000000..cf07002
--- /dev/null
+++ b/tests/spec/ext_compressed_etc1_rgb8_sub_texture/update-test.c
@@ -0,0 +1,279 @@
+/*
+ * 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.
+ */
+
+/*
+ * This test is to check whether updating sub-sections of ETC1_RGB8_OES
+ * textures when GL_EXT_compressed_ETC1_RGB8_sub_texture is available works
+ * as expected.
+ */
+
+#include "piglit-util-gl.h"
+#include "piglit_ktx.h"
+
+#define NUM_LEVELS 7
+#define LEVEL0_WIDTH 64
+#define LEVEL0_HEIGHT 32
+
+PIGLIT_GL_TEST_CONFIG_BEGIN
+	config.supports_gl_es_version = 20;
+	config.window_width = LEVEL0_WIDTH;
+	config.window_height = LEVEL0_HEIGHT;
+	config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DOUBLE;
+PIGLIT_GL_TEST_CONFIG_END
+
+static GLuint prog, vbo, tex_id;
+
+static const char *vs_text =
+	"#version 310 es\n"
+	"in vec2 pos_in;\n"
+	"in vec2 tex_in;\n"
+	"out vec2 tex_out;\n"
+	"void main()\n"
+	"{\n"
+	"	tex_out = tex_in;\n"
+	"	gl_Position = vec4(pos_in, 0.0, 1.0);\n"
+	"}\n";
+
+static const char *fs_text =
+	"#version 310 es\n"
+	"precision highp float;\n"
+	"in vec2 tex_out;"
+	"out vec4 color;\n"
+	"uniform sampler2D sampler;\n"
+	"void main()\n"
+	"{\n"
+	"	color = texture(sampler, tex_out);\n"
+	"}\n";
+
+static GLuint
+make_shader_program(void)
+{
+	GLuint prog;
+
+	prog = piglit_build_simple_program(vs_text, fs_text);
+	glUseProgram(prog);
+
+	glBindAttribLocation(prog, 0, "pos_in");
+	glBindAttribLocation(prog, 1, "tex_in");
+
+	glLinkProgram(prog);
+	glUseProgram(prog);
+
+	glUniform1i(glGetUniformLocation(prog, "sampler"), 0);
+
+	if (!piglit_check_gl_error(GL_NO_ERROR)) {
+		piglit_report_result(PIGLIT_FAIL);
+	}
+
+	return prog;
+}
+
+/*
+ * We can't use piglit_probe_image_ubyte here since our decompressed image is
+ * in GL_RGB/GL_UNSIGNED_BYTE format and those are conflicting parameters for
+ * glReadPixels and if we use GL_RGBA there's a format component mismatch. We
+ * need this custom probe function to account for these limitations.
+ */
+
+int
+probe_image(const struct piglit_ktx_image *decompressed, int x, int y, int w, int h)
+{
+	GLubyte *pixels = malloc(w * h * 4 * sizeof(GLubyte));
+	GLubyte *image = (GLubyte*)decompressed->data;
+	int i, j, p, k;
+
+	glReadPixels(x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+
+	for (j = 0; j < h; j++) {
+		for (i = 0; i < w; i++) {
+			const GLubyte *expected = &image[(j * w + i) * 3];
+			const GLubyte *probe = &pixels[(j * w + i) * 4];
+
+			for (p = 0; p < 3; ++p) {
+				const int tolerance = ceil(0.01 * 255);
+				if (abs((int)probe[p] - (int)expected[p]) < tolerance)
+					continue;
+
+				printf("Probe at (%i,%i)\n", x + i, y + j);
+				printf("  Expected:");
+				for (k = 0; k < 3; ++k)
+					printf(" %u", expected[k]);
+				printf("\n  Observed:");
+				for (k = 0; k < 3; ++k)
+					printf(" %u", probe[k]);
+				printf("\n");
+
+				free(pixels);
+				return 0;
+			}
+		}
+	}
+
+	free(pixels);
+	return 1;
+}
+
+static struct piglit_ktx*
+load_image(const char *filename)
+{
+	struct piglit_ktx *ktx;
+	const struct piglit_ktx_info *info;
+	char filepath[4096];
+
+	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);
+
+	return ktx;
+}
+
+static GLuint
+make_texture(struct piglit_ktx* ktx)
+{
+	GLuint tex_id = 0;
+
+	if (!piglit_ktx_load_texture(ktx, &tex_id, NULL))
+		piglit_report_result(PIGLIT_FAIL);
+
+	glActiveTexture(GL_TEXTURE0);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+		GL_NEAREST_MIPMAP_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+	glBindTexture(GL_TEXTURE_2D, tex_id);
+
+	if (!piglit_check_gl_error(GL_NO_ERROR))
+		piglit_report_result(PIGLIT_FAIL);
+
+	return tex_id;
+}
+
+static GLuint
+make_vbo(void)
+{
+	static const float pos_tc[6][4] = {
+		{ -1.0, -1.0, 0.0, 0.0 },
+		{  1.0, -1.0, 1.0, 0.0 },
+		{  1.0,  1.0, 1.0, 1.0 },
+		{  1.0,  1.0, 1.0, 1.0 },
+		{ -1.0,  1.0, 0.0, 1.0 },
+		{ -1.0, -1.0, 0.0, 0.0 }
+	};
+	const int stride = sizeof(pos_tc[0]);
+	GLuint vbo, vao;
+
+	glGenVertexArrays(1, &vao);
+	glBindVertexArray(vao);
+
+	glGenBuffers(1, &vbo);
+	glBindBuffer(GL_ARRAY_BUFFER, vbo);
+	glBufferData(GL_ARRAY_BUFFER, sizeof(pos_tc), pos_tc, GL_STATIC_DRAW);
+
+	glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, stride, (void *) 0);
+	glEnableVertexAttribArray(0);
+
+	glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, stride,
+		(void*) (sizeof(GLfloat) * 2));
+	glEnableVertexAttribArray(1);
+
+	if (!piglit_check_gl_error(GL_NO_ERROR)) {
+		piglit_report_result(PIGLIT_FAIL);
+	}
+
+	return vbo;
+}
+
+void
+piglit_init(int argc, char **argv)
+{
+	piglit_require_extension("GL_OES_compressed_ETC1_RGB8_texture");
+	piglit_require_extension("GL_EXT_compressed_ETC1_RGB8_sub_texture");
+
+	glClearColor(0.0, 0.0, 0.0, 1.0);
+
+	vbo = make_vbo();
+	prog = make_shader_program();
+}
+
+enum piglit_result
+piglit_display(void)
+{
+	bool pass = true;
+	const struct piglit_ktx_image *compressed_image, *decompressed_image;
+	const struct piglit_ktx_image *compressed_image_4;
+	struct piglit_ktx *compressed_ktx, *decompressed_ktx;
+
+	compressed_ktx = load_image("waffles-compressed-etc1-64x32-miptree.ktx");
+	decompressed_ktx = load_image("waffles-decompressed-rgb-64x32-miptree.ktx");
+	tex_id = make_texture(compressed_ktx);
+
+	compressed_image = piglit_ktx_get_image(compressed_ktx, 1, 0);
+	decompressed_image = piglit_ktx_get_image(decompressed_ktx, 1, 0);
+	compressed_image_4 = piglit_ktx_get_image(compressed_ktx, 5, 0);
+
+	glViewport(0, 0, piglit_width, piglit_height);
+	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT |
+		GL_STENCIL_BUFFER_BIT);
+
+	/*
+	 * This should fail since xoffset, yoffset, width and height should
+	 * be multiples of 4.
+	 */
+
+	glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 2, 1, GL_ETC1_RGB8_OES,
+		compressed_image_4->size, compressed_image_4->data);
+	if (piglit_check_gl_error(GL_NO_ERROR))
+		pass = false;
+
+	glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 32, 16, GL_ETC1_RGB8_OES,
+		compressed_image->size, compressed_image->data);
+	if (piglit_check_gl_error(GL_NO_ERROR))
+		pass = false;
+
+	glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 32, 16, GL_ETC1_RGB8_OES,
+		compressed_image->size, compressed_image->data);
+	glDrawArrays(GL_TRIANGLES, 0, 6);
+
+	piglit_present_results();
+
+	pass = piglit_check_gl_error(GL_NO_ERROR) &&
+		probe_image(decompressed_image, 0, 0, 32, 16) && pass;
+
+	piglit_ktx_destroy(compressed_ktx);
+	piglit_ktx_destroy(decompressed_ktx);
+	glDeleteTextures(1, &tex_id);
+
+	return pass ? PIGLIT_PASS : PIGLIT_FAIL;
+}
diff --git a/tests/spec/ext_compressed_etc1_rgb8_sub_texture/waffles-compressed-etc1-64x32-miptree.ktx b/tests/spec/ext_compressed_etc1_rgb8_sub_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/ext_compressed_etc1_rgb8_sub_texture/waffles-decompressed-rgb-64x32-miptree.ktx b/tests/spec/ext_compressed_etc1_rgb8_sub_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

-- 
2.4.3



More information about the Piglit mailing list