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 <[email protected]>
---
 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@cD%|hm$<d
zDfmr-S3K(BZnEB)S~|$w!MwilB@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@QPucvts1bBzITz<@)&5O~K{~k}FVa
zV_A0PX~n}BX+>hK88bBE^_|FT4EK4AqMciVf0k)JI@9<70M@SQ>G^1YAMMiR>)zEP
zXBSlXJ@)2yPJeaWrG|R%kHaNkG!GNM-ahL@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@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@jdr>0cezWEGfGTFcH_&*O04obCs
zCF<!G_niYq%H}qI@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@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@orMg
zdPMwRY-gxiXS)B^EIUpmUBbq+kYPPTd1KZCJ0)Q~-2JKzTD3&(uKabm9+c1X*+@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
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

literal 0
HcmV?d00001

-- 
2.4.3

_______________________________________________
Piglit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to